2016-06-19 2 views
0

カスタムクラスオブジェクトをwxWidgetsの別の関数に渡す方法を教えてもらえますか?私はカスタムクラス "ユーザー"のオブジェクトを作成するvoid型のOnButtonClick関数を含むAddUserというwxDialogクラスを持っています。どのように私はメインクラスにある別のOnButtonClick関数にそのオブジェクトを渡すことができますか?C++、wxWidgetsでカスタムクラスオブジェクトを渡す

+0

なぜあなたは 'OnButtonClick()'を直接呼びたいのですか? 'User *'を引数とするMainクラスの関数を作成することはできませんか? – rodrigo

+0

mainのOnButtonClick関数は、オブジェクトの内容を表示する機能を提供します。 – frezn08

+0

@Theは、 'User *'をとり、それを表示する関数を追加するだけです。他の機能を呼び出す必要はありません。 – rodrigo

答えて

0

wxDialogについて知っておくべき重要なことは(もしあなたがまだいない場合)、それらをスタック上に作成することが大丈夫だということです(ほとんどのwxWidgetsウィンドウはヒープ上に作成する必要があります)。

これは、ユーザーが「OK」を押すことによってダイアログインスタンスが閉じられた後でも使用できることを意味します。ダイアログがまだインスタンス化されているので、あなたは、ダイアログのコードでメソッドを含めることができ

... existing method ... 

AddUser dialog (this); 

if (dialog.ShowModal() == wxID_OK) 
{ 
    ... process new user ... 
} 

次のように新しいユーザーを返します:しかし

User AddUser::GetUser() 
{ 
    return newUser; 
} 

次のコードにより、ユーザーの応答をテストすることができますもちろん、新しいユーザーが実際に作成される場所には注意する必要があります。たとえば、新しいユーザオブジェクトがダイアログ内でローカルに作成された場合は、それをコピーする必要があります(上記の例のように)。ヒープ上に作成されている場合(これは私が助言しないでしょう)、ポインタを返すことができます。

bool AddUser::GetUser (User& user) 
{ 
    // Make sure that all fields are valid. Simple example given, but 
    // should be more complete. 
    if (TextName->GetValue() != "" && TextSurname->GetValue() != "") 
    { 
     user.setName(TextName->GetValue()); 
     user.setSurname(TextSurname->GetValue()); 

     return true; 
    } 
     return false; 

    return newUser; 
} 

そして、呼び出しは次のようになります:あなたのユーザクラスがない限り、ところで

void wxBiblioFrame::OnButAddUserClick(wxCommandEvent& event) 
{ 
    AddUser dialog(this); 
    myUserDialog dialog (this); 

    myUserClass newUser; 

    if (dialog.ShowModal() == wxID_OK) 
    { 
     if (dialog.GetUser (newUser)) 
     { 
      ... process and store the new user ... 
     } 
     else 
     { 
      ... handle the error ... 
     } 
    } 

    // NOTE: no need to Destroy() the dialog. 
} 

ダイアログメソッドは次のようになりますので、第3の選択肢はGetUserメソッドへの参照を渡すことであろう私はあまりにも効率の観点からオブジェクトのコピーを作ることに関心を持っていません。ダイアログを作成して閉じると、コピーを作成するのに時間がかかりすぎる可能性があります。

+0

私はいくつかのことを変えました。私がしようとしていることが論理的であり、可能なかどうかはわかりません。プロジェクトファイルはhttps://github.com/frezn08/wxBibです。 AddUserを使用して、オブジェクトを作成してすべての変数を設定し、それをShowListに渡してTextCtrlに表示します。 – frezn08

+0

http://www59.zippyshare.com/v/gzKC0BoA/file.html – frezn08

+0

あなたがしようとしていることは論理的で可能ですが、私はそれを行う別の方法を提案します。 OKとCancelボタンの 'wxStdDialogBu​​ttonSizer'を見てください。 'AddUser :: OnButOKClick'の代わりにOKボタンを押すと自動的に閉じます。次に、 'User'オブジェクトを' GetUser'メソッドに移入することができます(上記の私の更新された答えを見てください)。他のコメント:1)同じダイアログで新しいユーザーと新しい本を作成しません。 2)ShowListの場合、メインフレームにwxListCtrlまたはwxDataViewListCtrlを持つ方が良いでしょう。 – iwbnwif

0

OnClickイベントを呼び出して、イベントシグネチャのパラメータと異なるものを渡すことはできません。あなたは何かが必要な場合は、おそらくあなたのアプリケーションのアーキテクチャを繰り返し考慮する必要があります。

関連する問題