Page 1 of 2

Tree selection changing event

Posted: Sun Aug 25, 2013 5:27 pm
by Toshkarik
Здравствуйте. Подскажите, пожалуйста, что не так с этим кодом?

Code: Select all

#include <wx/app.h>
#include <wx/frame.h>
#include <wx/treectrl.h>


class MyFrame : public wxFrame {
 public:
   MyFrame() 
      : wxFrame( 0, -1, "Test app", wxDefaultPosition, wxDefaultSize )
   {
      Bind( wxEVT_TREE_SEL_CHANGING, &MyFrame::OnTreeSelectionChanging, this );
      wxTreeCtrl *tree = new wxTreeCtrl( this );
      wxTreeItemId root = tree->AddRoot( "Test" );
      tree->AppendItem( root, "test2" );
      tree->AppendItem( root, "test3" );
   }
      
   void OnTreeSelectionChanging( wxTreeEvent & ) {
      wxMessageBox( "test app", "test app", wxOK, this );
   }
};

class MyApp : public wxApp {
 public:
   virtual bool OnInit() {
      MyFrame *frame = new MyFrame();
      
      frame->Show( true );
      
      SetTopWindow( frame );
      
      return true;
   }
};

IMPLEMENT_APP( MyApp )
При запуске много раз показывается сообщение из функции обработчика события, далее программа падает.

Re: Tree selection changing event

Posted: Sun Aug 25, 2013 6:05 pm
by Mojo

Code: Select all

Bind( wxEVT_COMMAND_TREE_SEL_CHANGED, &MyFrame::OnTreeSelectionChanging, this );

Re: Tree selection changing event

Posted: Sun Aug 25, 2013 6:09 pm
by Toshkarik
Мне не нужно менять тип события. Мне нужно именно это.

Re: Tree selection changing event

Posted: Sun Aug 25, 2013 6:13 pm
by Mojo
Toshkarik wrote:Мне не нужно менять тип события. Мне нужно именно это.
Судя по коду вы хотите, что бы кликая по ветке дерева выскакивало диалоговое окно?

Re: Tree selection changing event

Posted: Sun Aug 25, 2013 6:18 pm
by Toshkarik
Мне просто нужно перед обработчиком tree selection changed выполнить некоторые действия. Это просто тестовая программа, показывающая суть проблемы.
Если сделать вывод в wxTextCtrl то все нормально, при создании ничего в него не пишется. А вот с диалоговыми окнами такая вот штука. При чем ничего кликать не нужно, все начинается с простого запуска программы.

Re: Tree selection changing event

Posted: Sun Aug 25, 2013 6:26 pm
by Mojo
Toshkarik wrote:Мне просто нужно перед обработчиком tree selection changed выполнить некоторые действия. Это просто тестовая программа, показывающая суть проблемы.
Если сделать вывод в wxTextCtrl то все нормально, при создании ничего в него не пишется. А вот с диалоговыми окнами такая вот штука. При чем ничего кликать не нужно, все начинается с простого запуска программы.
ПЕРЕД каким-либо обработчиком вы точно ничего не сделаете, можно сделать только В функции обработчика.

Но в любом случае wxEVT_TREE_SEL_CHANGING не существует.

Re: Tree selection changing event

Posted: Sun Aug 25, 2013 6:33 pm
by Toshkarik
Событие wxEVT_TREE_SEL_CHANGING генерируется перед wxEVT_TREE_SEL_CHANGED. И не может не быть, ибо код компилируется нормально, так же в сэплах есть пример treectrl с этим событием. Ну и на последок: http://docs.wxwidgets.org/trunk/classwx_tree_ctrl.html
...
EVT_TREE_SEL_CHANGING(id, func):
Selection is changing. This can be prevented by calling Veto(). Processes a wxEVT_TREE_SEL_CHANGING event type.
...

Re: Tree selection changing event

Posted: Sun Aug 25, 2013 6:36 pm
by Mojo
Toshkarik wrote:Событие wxEVT_TREE_SEL_CHANGING генерируется перед wxEVT_TREE_SEL_CHANGED. И не может не быть, ибо код компилируется нормально, так же в сэплах есть пример treectrl с этим событием. Ну и на последок: http://docs.wxwidgets.org/trunk/classwx_tree_ctrl.html
...
EVT_TREE_SEL_CHANGING(id, func):
Selection is changing. This can be prevented by calling Veto(). Processes a wxEVT_TREE_SEL_CHANGING event type.
...
Понимаю, я имею в виду что есть EVT_TREE_SEL_CHANGING а не wxEVT_TREE_SEL_CHANGING.
До события можно использовать wxEVT_COMMAND_TREE_SEL_CHANGING

Re: Tree selection changing event

Posted: Sun Aug 25, 2013 6:40 pm
by Mojo
Кстати

Code: Select all

Bind( wxEVT_TREE_SEL_CHANGING, &MyFrame::OnTreeSelectionChanging, this );
у меня не компилируется, выдает ошибку:

Code: Select all

|12|ошибка: нет декларации «wxEVT_TREE_SEL_CHANGING» в этой области видимости|
||=== Build finished: 1 errors, 0 warnings (0 minutes, 2 seconds) ===|

Re: Tree selection changing event

Posted: Sun Aug 25, 2013 6:45 pm
by Mojo
А вот

Code: Select all

Bind( wxEVT_COMMAND_TREE_SEL_CHANGING, &MyFrame::OnTreeSelectionChanging, this );
прекрасно компилируется и работает.

Re: Tree selection changing event

Posted: Sun Aug 25, 2013 6:46 pm
by Toshkarik
У меня нормально компилируется. А как же тогда эта фраза:
Processes a wxEVT_TREE_SEL_CHANGING event type.
И соответственно
Processes a wxEVT_TREE_SEL_CHANGED event type.
PS: 2.9.5

Re: Tree selection changing event

Posted: Sun Aug 25, 2013 6:47 pm
by Toshkarik
Вот собственно кусок из treebase.h

Code: Select all

// old wxEVT_COMMAND_* constants
#define wxEVT_COMMAND_TREE_BEGIN_DRAG          wxEVT_TREE_BEGIN_DRAG
#define wxEVT_COMMAND_TREE_BEGIN_RDRAG         wxEVT_TREE_BEGIN_RDRAG
#define wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT    wxEVT_TREE_BEGIN_LABEL_EDIT
#define wxEVT_COMMAND_TREE_END_LABEL_EDIT      wxEVT_TREE_END_LABEL_EDIT
#define wxEVT_COMMAND_TREE_DELETE_ITEM         wxEVT_TREE_DELETE_ITEM
#define wxEVT_COMMAND_TREE_GET_INFO            wxEVT_TREE_GET_INFO
#define wxEVT_COMMAND_TREE_SET_INFO            wxEVT_TREE_SET_INFO
#define wxEVT_COMMAND_TREE_ITEM_EXPANDED       wxEVT_TREE_ITEM_EXPANDED
#define wxEVT_COMMAND_TREE_ITEM_EXPANDING      wxEVT_TREE_ITEM_EXPANDING
#define wxEVT_COMMAND_TREE_ITEM_COLLAPSED      wxEVT_TREE_ITEM_COLLAPSED
#define wxEVT_COMMAND_TREE_ITEM_COLLAPSING     wxEVT_TREE_ITEM_COLLAPSING
#define wxEVT_COMMAND_TREE_SEL_CHANGED         wxEVT_TREE_SEL_CHANGED
#define wxEVT_COMMAND_TREE_SEL_CHANGING        wxEVT_TREE_SEL_CHANGING
#define wxEVT_COMMAND_TREE_KEY_DOWN            wxEVT_TREE_KEY_DOWN
#define wxEVT_COMMAND_TREE_ITEM_ACTIVATED      wxEVT_TREE_ITEM_ACTIVATED
#define wxEVT_COMMAND_TREE_ITEM_RIGHT_CLICK    wxEVT_TREE_ITEM_RIGHT_CLICK
#define wxEVT_COMMAND_TREE_ITEM_MIDDLE_CLICK   wxEVT_TREE_ITEM_MIDDLE_CLICK
#define wxEVT_COMMAND_TREE_END_DRAG            wxEVT_TREE_END_DRAG
#define wxEVT_COMMAND_TREE_STATE_IMAGE_CLICK   wxEVT_TREE_STATE_IMAGE_CLICK
#define wxEVT_COMMAND_TREE_ITEM_GETTOOLTIP     wxEVT_TREE_ITEM_GETTOOLTIP
#define wxEVT_COMMAND_TREE_ITEM_MENU           wxEVT_TREE_ITEM_MENU

Re: Tree selection changing event

Posted: Sun Aug 25, 2013 6:50 pm
by Mojo
Трудно сказать, почему один и тот же код ведет себя по разному.
Я компилирую под линуксом, Xubuntu 12.04. сборка wx 2.9.4

Re: Tree selection changing event

Posted: Sun Aug 25, 2013 6:52 pm
by Toshkarik
Дело не в компиляции. Дело в работоспособности приложения. У Вас данная программа работает нормально?

Re: Tree selection changing event

Posted: Sun Aug 25, 2013 6:55 pm
by Mojo
Toshkarik wrote:Вот собственно кусок из treebase.h

Code: Select all

// old wxEVT_COMMAND_* constants
#define wxEVT_COMMAND_TREE_BEGIN_DRAG          wxEVT_TREE_BEGIN_DRAG
#define wxEVT_COMMAND_TREE_BEGIN_RDRAG         wxEVT_TREE_BEGIN_RDRAG
#define wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT    wxEVT_TREE_BEGIN_LABEL_EDIT
#define wxEVT_COMMAND_TREE_END_LABEL_EDIT      wxEVT_TREE_END_LABEL_EDIT
#define wxEVT_COMMAND_TREE_DELETE_ITEM         wxEVT_TREE_DELETE_ITEM
#define wxEVT_COMMAND_TREE_GET_INFO            wxEVT_TREE_GET_INFO
#define wxEVT_COMMAND_TREE_SET_INFO            wxEVT_TREE_SET_INFO
#define wxEVT_COMMAND_TREE_ITEM_EXPANDED       wxEVT_TREE_ITEM_EXPANDED
#define wxEVT_COMMAND_TREE_ITEM_EXPANDING      wxEVT_TREE_ITEM_EXPANDING
#define wxEVT_COMMAND_TREE_ITEM_COLLAPSED      wxEVT_TREE_ITEM_COLLAPSED
#define wxEVT_COMMAND_TREE_ITEM_COLLAPSING     wxEVT_TREE_ITEM_COLLAPSING
#define wxEVT_COMMAND_TREE_SEL_CHANGED         wxEVT_TREE_SEL_CHANGED
#define wxEVT_COMMAND_TREE_SEL_CHANGING        wxEVT_TREE_SEL_CHANGING
#define wxEVT_COMMAND_TREE_KEY_DOWN            wxEVT_TREE_KEY_DOWN
#define wxEVT_COMMAND_TREE_ITEM_ACTIVATED      wxEVT_TREE_ITEM_ACTIVATED
#define wxEVT_COMMAND_TREE_ITEM_RIGHT_CLICK    wxEVT_TREE_ITEM_RIGHT_CLICK
#define wxEVT_COMMAND_TREE_ITEM_MIDDLE_CLICK   wxEVT_TREE_ITEM_MIDDLE_CLICK
#define wxEVT_COMMAND_TREE_END_DRAG            wxEVT_TREE_END_DRAG
#define wxEVT_COMMAND_TREE_STATE_IMAGE_CLICK   wxEVT_TREE_STATE_IMAGE_CLICK
#define wxEVT_COMMAND_TREE_ITEM_GETTOOLTIP     wxEVT_TREE_ITEM_GETTOOLTIP
#define wxEVT_COMMAND_TREE_ITEM_MENU           wxEVT_TREE_ITEM_MENU

У меня в файле treebase.h вообще нет такого кода (сборка 2.9.4)
зато есть вот этот:

Code: Select all

// GetOldItem() is the item which had the selection previously, GetItem() is
// the item which acquires selection
#define EVT_TREE_SEL_CHANGED(id, fn) wx__DECLARE_TREEEVT(SEL_CHANGED, id, fn)
#define EVT_TREE_SEL_CHANGING(id, fn) wx__DECLARE_TREEEVT(SEL_CHANGING, id, fn)