コードで配置したコントロールにDDX変数を設定するには?

解決


芋煮坂係長  2008-06-05 04:14:24  No: 68486

VC++ MFC SDI FormView のアプリに、コントロール(例としてエディットボックス)をコードで配置した場合の DDX について教えてください。

COppappiView.h
--------------
class COppappiView : public CFormView
{
public:
    CEdit* m_editText1;
    CString m_sText1;
}

COppappiView.cpp
----------------
void COppappiView::OnInitialUpdate()
{
・・・・・
    m_editText1 = new CEdit();
    m_edit->Create(ES_MULTILINE | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER, CRect(100,50,200,62), this, IDC_EDIT_TEXT1);
・・・・・
}

これでエディットボックスは出来るのですが、メンバー変数 m_sText1 をこのエディットの DDX 変数とするには、どのようなコードをどこに書けばいいのでしょうか?

よろしくお願いいたします。


CMSK  2008-06-05 23:00:05  No: 68487

COppappiViewのコンストラクタでm_editText1をNULLで初期化して、
COppappiView::DoDataExchange()で
  if( m_editText1 ){
    DDX_Text( pDX, IDC_EDIT_TEXT1, m_sText1 );
  }
とすれば良いかと思うのですが、いかがでしょうか?


芋煮坂係長  2008-06-05 23:53:06  No: 68488

CMSKさん、有り難うございます。
教えて戴いた通りやって、m_sText1 がDDX変数に設定されるのを確認しました。

質問の仕方がよくなかったのですが、フォームビュー上に複数のコントロールを配置して、メニューで切り替えて使いたいのです。
起動時はメニュー1の状態でコントロール1(例えばエディット1)が取り付けられた状態とし、メニュー2をクリックするとコントロール1を取り外してコントロール2(例えばエディット2)を取り付ける。
メニュー1をクリックすると、起動時の状態に戻る。
この場合、起動時はエディット2はまだ存在しないので、COppappiView::DoDataExchange() 内に DDX_Text( pDX, IDC_EDIT_TEXT2, m_sText2 ); を書いてもエラーになります。
メニュー2のイベント・ハンドラーの中に DDX_Text(・・・) のようなものを書く方法はないでしょうか?


CMSK  2008-06-06 01:45:26  No: 68489

同様に、ヒープ上にCEditのインスタンスを作成するとして、
if( m_editText1 && m_editText1->IsWindowVisible() ){
    DDX_Text( pDX, IDC_EDIT_TEXT1, m_sText1 );
}
if( m_editText2 && m_editText2->IsWindowVisible() ){
    DDX_Text( pDX, IDC_EDIT_TEXT2, m_sText2 );
}
のようにするのはいかがでしょうか?
メニューハンドラ(エディットボックス1を消し、2を出す)では
    m_pEdit1->ShowWindow( SW_HIDE );
    m_sText1.Empty();
    m_pEdit2->ShowWindow( SW_SHOW );
    m_sText2.Empty();
のようにすれば良いかと思います。

しかし、張り替えるコントロールがたくさんあるようなら、
管理面も考えて、ダイアログリソースを利用する方が良いかもしれません。


maru  2008-06-06 03:45:59  No: 68490

どうしてもDDX_Textを使う必要がありますか?

> メニュー2のイベント・ハンドラーの中に DDX_Text(・・・) のようなものを書く方法はないでしょうか?
イベントハンドラの中でエディットコントロールとCStringオブジェクトの同期を取りたいのであれば、GetWindowTextやSetWindowTextで十分と思いますが。
実際、DDX_Text(CDataExchange* pDX, int nIDC, CString& value)の実装はたいしたことをやっていません。


芋煮坂係長  2008-06-06 04:02:47  No: 68491

一つ前で教えて戴いた
> if( m_editText1 ){
> DDX_Text( pDX, IDC_EDIT_TEXT1, m_sText1 );
> }

この中の「if( m_editText1 )」を入れていなかったために、まだ取り付けていないエディットに対してはエラーになっていました。
if( m_editText1 ) を入れることで、解決しました。

なお、ダイアログリソースにすべてのコントロールを書き込んでおいて、SW_SHOW / SW_HIDE で切り替える方法はやっていたのですが、事情があってコードで取り付けたり取り外したりしたいと考えた次第です。

CMSKさん、どうもありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加