VC6ダイアログベースです。
今、EDITBOXを複数設定した画面がありまして、
それぞれm_edit1~m_edit5とクラスウィザードで
CString型に設定しました。
ここで、UpdateData(TRUE)とやると、エディットボックスに
入っている値がm_edit*に格納されますが、
これだと全体のデータが取得されてしまいます。
試しにこんな事やってみましたが取れません。
((CEdit*)GetDlgItem(IDC_EDIT1))->UpdateData(TRUE);
1つの場合はGetDlgItemText()とか使うしかないのでしょうか?
となると私の書いた上の一行で行われている事ってなんですか?
UpdateData()関数はCWndクラスのメンバなので、ほぼ殆どのコントロールで
使えると思っているのですが、見た目にデータが取れないとなると、
どんな処理をしているのかが気になります。
よろしくおねがいします。
的外れかもしれませんがDDXを使ってみてはどうでしょうか?
わたしはダイアログからとのデータのやり取りで苦労した記憶はありません。
型変換なんかも勝手にやってくれるし、DDXを使うのもクラスウィザードで
Controlに対応するValueの変数を入れてやるだけで使えるので深く考えたことはありま
せんが。
CWndクラスのUpdateDataの説明はよく読んでみたでしょうか?
そこに説明が書いてあると思います。
UpdateData関数でMSDNを検索すると
「ダイアログ データ エクスチェンジ」に関する説明も出ています。
CWndクラスにインターフェイスが定義されているからといって
全てのコントロールで使えるとは限らないと思います。
例えば、CWnd::GetDlgCtrlIDが全てのコントロールで使えないのと同じ事です。
CWnd::UpdateDataの説明に
「ダイアログ ボックス内のデータを初期化するため、またはダイアログ データを取得し
評価するためにこのメンバ関数を呼び出します。」
と書かれているわけですし、ダイアログボックスクラスのインスタンスで無いと意味を
なさないと考えた方がいいと思います。
そもそもUpdateDataは簡易にダイアログの操作を行うためにある関数です。
それぞれのコントロールごとに操作したい場合は、GetDlgItemText()を使うか、
GetDlgItem(IDC_EDIT1)->GetWindowText等で処理するのが普通でしょう。
但し、この場合はUpdateDataの簡易なチェック機構も使えないので自前で
チェックしてエラー表示等も自分で行う必要があると思います。
訂正:
誤)
例えば、CWnd::GetDlgCtrlIDが全てのコントロールで使えないのと同じ事です。
正)
例えば、CWnd::GetDlgCtrlIDが全てのCWnd派生クラスで使えるとは限らないのと同じ事です。
>((CEdit*)GetDlgItem(IDC_EDIT1))->UpdateData(TRUE);
>1つの場合はGetDlgItemText()とか使うしかないのでしょうか?
>となると私の書いた上の一行で行われている事ってなんですか?
CEdit の UpdateData を呼び出したら、
CEdit の DoDataExchange が呼ばれます。
CEdit には DoDataExchange は定義されていないので、
実際に呼び出されるのは、CWnd::DoDataExchange になります。
CWnd::DoDataExchange は何もしません。(内容が空っぽな関数です)
ダイアログで UpdateData を呼び出したら、
そのダイアログでオーバーライドした DoDataExchange が呼ばれます。
クラスウィザードでコントロールのメンバー変数を作成した場合、
DoDataExchange の中に DDX / DDV 関数が書き込まれます。
DDX_Text(pDX, IDC_EDIT1, m_edit1);
のような記述が、あなたの書いているプログラムの中に追加されているはずです。