EDITBOXから個別にデータを取得する方法

[戻る]
め組 2005/08/23(火) 16:51:58
VC6ダイアログベースです。

今、EDITBOXを複数設定した画面がありまして、
それぞれm_edit1〜m_edit5とクラスウィザードで
CString型に設定しました。

ここで、UpdateData(TRUE)とやると、エディットボックスに
入っている値がm_edit*に格納されますが、
これだと全体のデータが取得されてしまいます。

試しにこんな事やってみましたが取れません。

((CEdit*)GetDlgItem(IDC_EDIT1))->UpdateData(TRUE);

1つの場合はGetDlgItemText()とか使うしかないのでしょうか?

となると私の書いた上の一行で行われている事ってなんですか?
UpdateData()関数はCWndクラスのメンバなので、ほぼ殆どのコントロールで
使えると思っているのですが、見た目にデータが取れないとなると、
どんな処理をしているのかが気になります。

よろしくおねがいします。

Fortran使い 2005/08/23(火) 17:58:54
的外れかもしれませんがDDXを使ってみてはどうでしょうか?
わたしはダイアログからとのデータのやり取りで苦労した記憶はありません。
型変換なんかも勝手にやってくれるし、DDXを使うのもクラスウィザードで
Controlに対応するValueの変数を入れてやるだけで使えるので深く考えたことはありま
せんが。

PATIO 2005/08/23(火) 18:06:28
CWndクラスのUpdateDataの説明はよく読んでみたでしょうか?
そこに説明が書いてあると思います。

UpdateData関数でMSDNを検索すると
「ダイアログ データ エクスチェンジ」に関する説明も出ています。

CWndクラスにインターフェイスが定義されているからといって
全てのコントロールで使えるとは限らないと思います。
例えば、CWnd::GetDlgCtrlIDが全てのコントロールで使えないのと同じ事です。
CWnd::UpdateDataの説明に
「ダイアログ ボックス内のデータを初期化するため、またはダイアログ データを取得し
評価するためにこのメンバ関数を呼び出します。」
と書かれているわけですし、ダイアログボックスクラスのインスタンスで無いと意味を
なさないと考えた方がいいと思います。

そもそもUpdateDataは簡易にダイアログの操作を行うためにある関数です。
それぞれのコントロールごとに操作したい場合は、GetDlgItemText()を使うか、
GetDlgItem(IDC_EDIT1)->GetWindowText等で処理するのが普通でしょう。
但し、この場合はUpdateDataの簡易なチェック機構も使えないので自前で
チェックしてエラー表示等も自分で行う必要があると思います。

PATIO 2005/08/23(火) 18:08:03
訂正:
誤)
例えば、CWnd::GetDlgCtrlIDが全てのコントロールで使えないのと同じ事です。

正)
例えば、CWnd::GetDlgCtrlIDが全てのCWnd派生クラスで使えるとは限らないのと同じ事です。

Mell 2005/08/24(水) 10:17:51
>((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);
のような記述が、あなたの書いているプログラムの中に追加されているはずです。

古いスレッドには追加発言できません。