1

特定のタスクを実行する方法を理解したいです。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 を使用してヘッダーでテーブルを宣言します。

4

2 に答える 2

1

で使用したイベント テーブル マクロと同じクラス名を使用する必要がありますBEGIN_EVENT_TABLE。IOW、ハンドラーはWindowイベントテーブルではなくイベントテーブルで定義する必要がありTopRightPanelます。ツリー イベントはwxCommandEventsであるため、親に上向きに伝播されるためWindow、ツリー コントロールが含まれている場合、これは機能します。それ以外の場合、たとえば兄弟である場合Connect()は、別の回答で示されているように使用する必要があります。

イベント処理の概要を(再) 読むことを強くお勧めします。

于 2012-12-30T13:21:38.607 に答える
0

このイベントハンドラーを接続する方法は示していませんが、問題はほぼ確実にあり、表示するコードにはありません。を使用してConnect()いる場合は、オブジェクトへのポインターをWindow最後の引数として渡すようにしてください。そうしないと、オブジェクトのWindowクラスのメソッドを呼び出すTopRightPanelことになり、驚くほど壊滅的な結果になります。

正しいオブジェクトでメソッドを呼び出すことが確実な場合、私が見る他の唯一の説明はtopRightPanel、このタイプの最初のイベントが生成される前に初期化しないことです。この場合、最も簡単な解決策は、ポインタを初期化しNULL、初期化コードの最後で正しく設定することです。そしてもちろん、イベント ハンドラでポインタが NULL でないことを確認します。

于 2012-12-29T12:32:33.787 に答える