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 変数とするには、どのようなコードをどこに書けばいいのでしょうか?
よろしくお願いいたします。
COppappiViewのコンストラクタでm_editText1をNULLで初期化して、
COppappiView::DoDataExchange()で
if( m_editText1 ){
DDX_Text( pDX, IDC_EDIT_TEXT1, m_sText1 );
}
とすれば良いかと思うのですが、いかがでしょうか?
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(・・・) のようなものを書く方法はないでしょうか?
同様に、ヒープ上に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();
のようにすれば良いかと思います。
しかし、張り替えるコントロールがたくさんあるようなら、
管理面も考えて、ダイアログリソースを利用する方が良いかもしれません。
どうしてもDDX_Textを使う必要がありますか?
> メニュー2のイベント・ハンドラーの中に DDX_Text(・・・) のようなものを書く方法はないでしょうか?
イベントハンドラの中でエディットコントロールとCStringオブジェクトの同期を取りたいのであれば、GetWindowTextやSetWindowTextで十分と思いますが。
実際、DDX_Text(CDataExchange* pDX, int nIDC, CString& value)の実装はたいしたことをやっていません。
一つ前で教えて戴いた
> if( m_editText1 ){
> DDX_Text( pDX, IDC_EDIT_TEXT1, m_sText1 );
> }
この中の「if( m_editText1 )」を入れていなかったために、まだ取り付けていないエディットに対してはエラーになっていました。
if( m_editText1 ) を入れることで、解決しました。
なお、ダイアログリソースにすべてのコントロールを書き込んでおいて、SW_SHOW / SW_HIDE で切り替える方法はやっていたのですが、事情があってコードで取り付けたり取り外したりしたいと考えた次第です。
CMSKさん、どうもありがとうございました。
ツイート | ![]() |