生成したモーダルダイアログの操作

[戻る]
君江 2010/03/04(木) 16:14:01
はじめまして
早速ですが質問です。

CDialog dlg; //CDialogはエディットボックス付きダイアログ。
dlg.DoModal();

dlg.m_edit.SetWindowText("aaa"); //m_editはエディットボックスのコントロール変数

と記述しましたが
エラーを起こしてしまいます。

エティットボックスの内容を操作するにはどのようにしたらよいのでしょうか?

tetrapod 2010/03/04(木) 16:35:19
MFC かな?
CDialog を直接使うことはありえないはずだが、実際は派生クラス C**Dialog
という前提で。

ダイアログ自体は DoModal の中で作られ、処理完了して破棄される。
DoModal から帰ってきた状態では既にダイアログ自体が存在しない。
なので DoModal の後で SetWindowText するのは無意味なのだが、その辺理解OK?
画面にダイアログが表示された時点で何らかのテキストが表示されていてほしい
ということなら C**Dialog::OnInitDialog で処理するべし。

PATIO 2010/03/04(木) 19:07:10
クラスを使う上での方針みたいな物ですけれど、

基本的にクラス内の操作に関してはそのクラスに
操作用のメソッドを設けるかのが普通で外側から直接操作するのは
どうかなと思います。クラスのカプセル化が崩れてしまい、
独立性が失われるからです。

また、CDialogのようなウインドウ関連のインスタンスに関しては
OnInitDialogの中でコントロールの初期化等を行ないますから
ダイアログクラスの派生クラスのインスタンスを生成したら
OnInitDialog内で必要な情報はインスタンスにメソッド等で
引き渡してからDoModal等で表示させます。
特にモーダルダイアログは呼び出し側の関数内で待機状態になるので
DoModal関数から返ってくるまで外から直接の操作は出来ません。

基本的にはクラス内の操作はクラス内で完結させ、
必要な情報等を外から与えるとクラス内で反映するような仕組みに
すべきではないかと思います。

私の考え方なので100%正しいとは言いませんが、
概ね間違っていないと思います。

PATIO 2010/03/04(木) 19:11:19
あと、ダイアログ内でユーザーが入力した値等は
ダイアログが終了する時にメンバー変数等に退避しておき、
DoModalから帰ってきた時はそのメンバー変数から値を取り出すように
すると思います。出来れば、メンバー変数を直接参照するより
アクセス用の取得関数と設定関数を作成しておき、それを呼び出すように
した方が良いかなと思います。
アクセス用の関数を作成する意味は、不正なデータを設定しようとした時に
関数ないでチェックしてエラー処理ができる等のメリットがあるからです。

君江 2010/03/05(金) 08:41:59
[[解決]]
tetrapod さんPATIOさんDoModalについてわかりやすい説明ありがとうございます
把握しました。

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