Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Toshkarik
Earned a small fee
Posts: 18 Joined: Thu Oct 18, 2012 3:18 am
Location: Russia
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
Posts: 401 Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia
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
Posts: 18 Joined: Thu Oct 18, 2012 3:18 am
Location: Russia
Post
by Toshkarik » Sun Aug 25, 2013 6:09 pm
Мне не нужно менять тип события. Мне нужно именно это.
Mojo
Super wx Problem Solver
Posts: 401 Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia
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
Posts: 18 Joined: Thu Oct 18, 2012 3:18 am
Location: Russia
Post
by Toshkarik » Sun Aug 25, 2013 6:18 pm
Мне просто нужно перед обработчиком tree selection changed выполнить некоторые действия. Это просто тестовая программа, показывающая суть проблемы.
Если сделать вывод в wxTextCtrl то все нормально, при создании ничего в него не пишется. А вот с диалоговыми окнами такая вот штука. При чем ничего кликать не нужно, все начинается с простого запуска программы.
Mojo
Super wx Problem Solver
Posts: 401 Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia
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
Posts: 18 Joined: Thu Oct 18, 2012 3:18 am
Location: Russia
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
Posts: 401 Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia
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
Posts: 401 Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia
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
Posts: 401 Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia
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
Posts: 18 Joined: Thu Oct 18, 2012 3:18 am
Location: Russia
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
Posts: 18 Joined: Thu Oct 18, 2012 3:18 am
Location: Russia
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
Posts: 401 Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia
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
Posts: 18 Joined: Thu Oct 18, 2012 3:18 am
Location: Russia
Post
by Toshkarik » Sun Aug 25, 2013 6:52 pm
Дело не в компиляции. Дело в работоспособности приложения. У Вас данная программа работает нормально?
Mojo
Super wx Problem Solver
Posts: 401 Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia
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