特定のタスクを実行する方法を理解したいです。wxWidgets でイベント テーブルを設定しようとしたところ、その動作に問題が発生しました。
1 つのクラスにいくつかのコードを設定しました。
void TopRightPanel::OnSelChanged(wxTreeEvent& event)
{
wxTreeItemId item = event.GetItem();
TreeItemData* data = (TreeItemData *) GetItemData(item);
if(data != NULL)
{
particleSystemManager->SetSelectedParticleSystem(data->particleSystem);
}
}
これは正常に機能し、期待どおりの正しい値を持っています。これに関する私の問題は、それが自己完結型であり、階層内でその上のクラスにtreeCtrlのアクションを読み取らせ、UIのすべての側面を変更させたいということです。だから私はこれを試しました:
void Window::OnSelChanged(wxTreeEvent& event)
{
wxTreeItemId item = event.GetItem();
TreeItemData* data = (TreeItemData *) topRightPanel->GetItemData(item);//item.m_pItem.//m_MyTreeCtrl->GetItemData(itemId);*/
if(data != NULL)
{
particleSystemManager.SetSelectedParticleSystem(data->particleSystem);
}
}
topRightPanel->GetItemData(data) が呼び出されると、未処理の例外が発生するようになりました。それが使用する topRightPanel は更新されていないようで、クラスのコンストラクターでインスタンス化される前にデータを指しているようです。とにかく私はこれを回避することができますか?
編集:
イベントテーブルを次のように宣言します。
#if USE_GENERIC_TREECTRL
BEGIN_EVENT_TABLE(TopRightPanel, wxGenericTreeCtrl)
#else
BEGIN_EVENT_TABLE(TopRightPanel, wxTreeCtrl)
#endif
EVT_TREE_SEL_CHANGED(TopRightPanel_Ctrl, Window::OnSelChanged)
END_EVENT_TABLE()
次に、DECLARE_EVENT_TABLE を使用してヘッダーでテーブルを宣言します。