UpdateData

 前回は、EditBoxに割り当てた変数のカテゴリをコントロールにしましたね。今回はカテゴリを値として、エディットボックスの値の操作を学びます。

準備作業
ここではプロジェクトを作成し、リソースの設定まで片づけておきましょう。前回一通りやりましたが、今回は復習の意味でもう1回詳しく説明していきますね。

1.プロジェクトの作成
 新規作成でプロジェクトを作成します。WIN32MFCAPPWIZARDを選択してください。プロジェクト名はCal (:計算のCallculaterの頭3文字ということで)にしておきます。まあ、簡単な計算をさせる道具を作ろう!ということですね。後は1章と同じく以下のようにウィザードを進めます。

STEP1:作成するアプリケーションの種類-->ダイアログベースにする STEP2:アプリケーションへ組み込む機能-->変更なし STEP3:ソースファイルのコメント-->した方がよい :MFCライブラリとのリンク-->共有DLLにする STEP4:終了

2.ダイアログリソースを編集する
 ResourceViewを表示します。前回リソースのことは一通りやったので、今回は図のように作成できますね。IDも以下のようにまとめました。
配置するコントロールとID
オブジェクトIDキャプションその他
EditBoxIDC_EDIT1なし特になし
IDC_EDIT2
IDC_EDIT3読み取り専用
ButtonIDC_BUTTON1計算(&C)特になし

と、ココまでは前回とほとんど変わりません。リソースをよく見ると、IDC_EDIT1の値とIDC_EDIT2の掛け算をした結果をIDC_EDIT3に書込むのかも・・・という予感がします(そのままか)。
IDC_EDIT3は直接入力しないので読み取り専用にしておくといいと思います。

ここで新しいものが1つ出てきましたね。Buttonのキャプション
計算(&C)

ですね。でもリソースに表示されているのは、

計算(C)
です。これはよくショートカットキーと呼ばれるもので、Alt+(この場合) Cでマウスでボタンを押さなくてもキーボードがボタンを押してくれます。別にこのソフトでは不要かもしれませんが、MFCソフトを作る上で絶対必要になるので先にこっそり教えちゃいました。

CLASSWIZARDをつかってオブジェクト間のメッセージをつくる
1. エディットボックスを選択してCLASSWIZARDを実行します。
 さきほど、各エディットボックスにIDをつけました。ではIDC_EDIT1を例にして話を進めます。まずIDC_EDIT1のエディットボックスを選択し右クリックをすると、ClassWizardがあります。これでIDC_EDIT1に対するクラスウィザードを実行できます。

2. EDITボックスのメンバ変数を決めます。
 IDC_EDIT1をクリックし(1の通りならディフォルトのはずです)、「変数の追加」ボタンを押してください。  メンバ変数をm_val1とし、カテゴリを値にします。変数のタイプは実数値の計算ができるように、double型(倍精度浮動小数点型といいます。高い精度をもつ実数計算用の変数です)にしておきましょう。この調子で3つのエディットボックス以下の表のようなメンバ変数を設定してあげればOKです。
EditBoxのIDとメンバ変数
IDメンバ変数名カテゴリ変数の型
IDC_EDIT1m_val1double
IDC_EDIT2m_val2double
IDC_EDIT3m_answerdouble

3.ボタンを作ります。
 今度は「計算」のボタンにアクションを付けます。この作業は前回もやりましたね。オブジェクトは「計算」ボタンのIDであるIDC_BUTTON1にして、メッセージのBN_CLICKEDをハイライトし、「関数の追加」ボタンを押します。
メンバ関数名はディフォルトで結構です。
 この「関数の追加」はボタンをクリックした時にEDITボックスにメッセージを送る関数を自動に作ってくれるということです。自動的に関数の初期コードを書いてくれたり、ヘッダファイルにもいろいろ書込んでくれる便利なものです。
次に実際のコード(プログラム)を記述してみます。

4.ソースコードを書きこみます。
 「コード編集」クリックすると、にCCalDlg::OnButton1という関数が表示されているはずです(多分)。この関数内に以下のコードを書き上げてください。
void CCountDlg::OnButton1(){
{
   m_answer=m_val1*m_val2;
}


解説はしなくてもいいと思いますが、
IDC_EDIT1の値と、IDC_EDIT2の値を掛け算して、IDC_EDIT3の変数に代入している
と言うことです。さて、ビルド-実行してみましょう。そして思い通りの計算ができるでしょうか???
あれ?計算しても結果が表示されない・・・。
確かにソースコードは間違っていません。でもうまく実行できません。
「原因」
率直に言うと、m_val1やm_val2に実際には値が入っていないのです。つまりm_val1とm_val2には「適当」な値が入っているに過ぎないのです。どういうこと??と思う人もいると思いますが、こんなコードがないと意味がないと思いませんか?
void CCountDlg::OnButton1(){
{
   m_val1 = (IDC_EDIT1の値);
   m_val2 = (IDC_EDIT2の値);

   m_answer=m_val1*m_val2;
   (IDC_EDIT3の値) = m_answer;
}
赤い部分がないと意味がないよね

さっきはただEditBoxの中に値を書いてButtonを押しただけです。
Boxの値をメンバ変数に取り込んだり、計算した値をDialogのEditBoxにまた書込んだりする機能があれば便利です。MFCはこれを1つの命令でこなします。
UpdateData()関数
Dialogの値をそのメンバ変数に取り込む時--->引数をtrueにする。
メンバ変数の値をそのDialogに返す時--->引数をfalseにする。

これを使えば、先ほどのコードに追加するには上の2つです。「計算前にDialogから値を取り出して、計算後は値をDialogに返す」のですから、
void CCountDlg::OnButton1(){
{
   UpdateData(true);
   m_answer=m_val1*m_val2;
   UpdateData(false);
}

これで多分大成功です。Dialogでデータを解析する時はよく使う手法なので覚えておいてもいいと思います。さて、Buttonのアクションを勉強して、EditBoxのデータ計算をマスターしたところで、今度はDialogコントロールの背景色を変更してみます。そんなに難しくないので気楽に行きましょう。

Back to Index