Tree selection changing event

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Toshkarik
Earned a small fee
Earned a small fee
Posts: 18
Joined: Thu Oct 18, 2012 3:18 am
Location: Russia

Tree selection changing event

Post by Toshkarik » Sun Aug 25, 2013 5:27 pm

Здравствуйте. Подскажите, пожалуйста, что не так с этим кодом?

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 )
При запуске много раз показывается сообщение из функции обработчика события, далее программа падает.

Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Re: Tree selection changing event

Post by Mojo » Sun Aug 25, 2013 6:05 pm

Code: Select all

Bind( wxEVT_COMMAND_TREE_SEL_CHANGED, &MyFrame::OnTreeSelectionChanging, this );
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0

Toshkarik
Earned a small fee
Earned a small fee
Posts: 18
Joined: Thu Oct 18, 2012 3:18 am
Location: Russia

Re: Tree selection changing event

Post by Toshkarik » Sun Aug 25, 2013 6:09 pm

Мне не нужно менять тип события. Мне нужно именно это.

Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Re: Tree selection changing event

Post by Mojo » Sun Aug 25, 2013 6:13 pm

Toshkarik wrote:Мне не нужно менять тип события. Мне нужно именно это.
Судя по коду вы хотите, что бы кликая по ветке дерева выскакивало диалоговое окно?
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0

Toshkarik
Earned a small fee
Earned a small fee
Posts: 18
Joined: Thu Oct 18, 2012 3:18 am
Location: Russia

Re: Tree selection changing event

Post by Toshkarik » Sun Aug 25, 2013 6:18 pm

Мне просто нужно перед обработчиком tree selection changed выполнить некоторые действия. Это просто тестовая программа, показывающая суть проблемы.
Если сделать вывод в wxTextCtrl то все нормально, при создании ничего в него не пишется. А вот с диалоговыми окнами такая вот штука. При чем ничего кликать не нужно, все начинается с простого запуска программы.

Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Re: Tree selection changing event

Post by Mojo » Sun Aug 25, 2013 6:26 pm

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

Но в любом случае wxEVT_TREE_SEL_CHANGING не существует.
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0

Toshkarik
Earned a small fee
Earned a small fee
Posts: 18
Joined: Thu Oct 18, 2012 3:18 am
Location: Russia

Re: Tree selection changing event

Post by Toshkarik » Sun Aug 25, 2013 6:33 pm

Событие 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.
...

Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Re: Tree selection changing event

Post by Mojo » Sun Aug 25, 2013 6:36 pm

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
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0

Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Re: Tree selection changing event

Post by Mojo » Sun Aug 25, 2013 6:40 pm

Кстати

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) ===|
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0

Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Re: Tree selection changing event

Post by Mojo » Sun Aug 25, 2013 6:45 pm

А вот

Code: Select all

Bind( wxEVT_COMMAND_TREE_SEL_CHANGING, &MyFrame::OnTreeSelectionChanging, this );
прекрасно компилируется и работает.
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0

Toshkarik
Earned a small fee
Earned a small fee
Posts: 18
Joined: Thu Oct 18, 2012 3:18 am
Location: Russia

Re: Tree selection changing event

Post by Toshkarik » Sun Aug 25, 2013 6:46 pm

У меня нормально компилируется. А как же тогда эта фраза:
Processes a wxEVT_TREE_SEL_CHANGING event type.
И соответственно
Processes a wxEVT_TREE_SEL_CHANGED event type.
PS: 2.9.5

Toshkarik
Earned a small fee
Earned a small fee
Posts: 18
Joined: Thu Oct 18, 2012 3:18 am
Location: Russia

Re: Tree selection changing event

Post by Toshkarik » Sun Aug 25, 2013 6:47 pm

Вот собственно кусок из 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

Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Re: Tree selection changing event

Post by Mojo » Sun Aug 25, 2013 6:50 pm

Трудно сказать, почему один и тот же код ведет себя по разному.
Я компилирую под линуксом, Xubuntu 12.04. сборка wx 2.9.4
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0

Toshkarik
Earned a small fee
Earned a small fee
Posts: 18
Joined: Thu Oct 18, 2012 3:18 am
Location: Russia

Re: Tree selection changing event

Post by Toshkarik » Sun Aug 25, 2013 6:52 pm

Дело не в компиляции. Дело в работоспособности приложения. У Вас данная программа работает нормально?

Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Re: Tree selection changing event

Post by Mojo » Sun Aug 25, 2013 6:55 pm

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)
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0

Post Reply