Version 3.11
計算機完成!!
『もうウソつかないでよね!』
「分かったって」
『ウソついたらうまか棒の始まりって言わない!?』
「言いません。んじゃ、まず CalcDlg.h を開いて」
『? CCalcDlg があるのだよね。【FileView】でダブルクリックっと』
「その CCalcDlg の中に……」
////////////////////////////////////////////////////////////////
// CCalcDlg ダイアログ
class CCalcDlg : public CDialog
{
// (略)
// ダイアログ データ
// {{AFX_DATA(CCalcDlg)
enum { IDD = IDD_CALC_DIALOG };
int m_iAns;
// }}AFX_DATA
// (略)
『あ、m_iAns があった! あれ? ねぇ、これって色違うよね、他のと』
「これはVCのエディタが自動的に色を変えてくれてるから。色はオプショ
ンで変えられるけどね」
『でもなんか意味あんの?』
「もちろん。このメンバ変数は、クラスウィザードが作ってくれたでしょ」
『うん、あたしこんなの書いてないもん。そういうのがこの色ってこと?』
「そう。具体的には……」
// {{AFX_DATA(CCalcDlg)
「と」
// }}AFX_DATA
「に挟まれている部分がこの色になるんだけどね」
『??』
「んーと、クラスウィザードはこのふたつの間にメンバ変数を作るような仕
組みになってて」
『目印ってこと?』
「そうそう。だからこの間にあるプログラムは、クラスウィザードが作った
ってことだね」
『それが分かるように、VCが色を変えてるってことね』
「この〈目印〉はコメントになってるでしょ」
『ホントだ、 // が付いてるね』
「つまりプログラムとしての意味がない、クラスウィザード専用ってこと」
『へ〜』
「ま、この辺の仕組みはまだ難しいだろうから、ここでは m_iAns がメンバ
変数としてクラスウィザードに作られた、ってことだけでいいかな」
『うん、メンバ変数が作られたってことは分かったかも』
「じゃ、今度はその使い方。いつものメンバ関数を、こう書き換えて」
void CCalcDlg::OnBEqual()
{
TRACE( "%d\n", m_iAns );
}
『あれ? この前とちょっとちがくない?』
「そ。とりあえず試してみて」
『ビルドして実行、エディットボックスに数字入れて【=】ボタンを押し
て……あれ!? 0しか出ないよ?』
「で、この前のプログラム……」
void CCalcDlg::OnBEqual()
{
UpdateData( TRUE );
TRACE( "%d\n", m_iAns );
}
「に書き直すと」
『あ、今度はちゃんと入れたのが出てきた。つまり UpdateData() がってこ
と?』
「そういうこと。まず、 m_iAns はただの変数だから特別な機能はなくて、
自動的にエディットボックスの中身が入るとかそういう事はないわけ」
『で、 UpdateData() を呼び出さなきゃいけない?』
「そう。 UpdateData() は CWnd のメンバ関数で、これを呼び出すと、エ
ディットボックスに書かれた数字が m_iAns に書き込まれます」
『なんか間接的』
「それはそうだね。でも〈常にデータが送られる〉ような仕組みだと、エ
ディットボックスの中身を書き換えるたびにデータが送られて……」
『あ、なんか重くなりそう……』
「そういうのを防いだり、あと文字列を数字に変換する機能とか、色々なサ
ポートも必要だしね」
『変換?』
「数字の変わりに文字を入れてみれば分かるよ」
『あ、そういえばそれまだ試してないね。 aiu っと……あ、【整数を入力
してください】ってダイアログが出た!』
「こういうこともしてくれてるわけ」
『こーゆーとこにも〈MFCの至れり尽くせり〉があるのねー』
「じゃ、もうひとつの使い方」
void CCalcDlg::OnBEqual()
{
m_iAns = 100;
UpdateData( FALSE );
}
『ん? とりあえずビルドして実行、321 って書いて【=】ボタン、あれ?
アウトプットに何も出ないよ』
「そりゃ、TRACE() ないんだからそうでしょ」
『そうだけど……あれ? エディットの数字が 100 になっちゃってる。水
希ちゃんイタズラしないでよ〜』
「だーかーら、そういうプログラムなんだって」
『へ?』
「 UpdateData( FALSE ) って呼び出すと、今度は m_iAns の中身をエディット
ボックスに書き込んでくれるの」
『あー、なるほど。だったら先に言ってくれればいいのに』
「まぁそうだけど。まとめると」
UpdateData( TRUE ) : エディット > メンバ変数
UpdateData( FALSE ) : メンバ変数 > エディット
「ってとこかな」
『TRUE ってのを入れるとエディットからで……あ〜なんか頭がこんがらが
る!』
「そうだね、これはまぁよくない例かな、メンバ関数の作り方としては。
はっきり言って僕もよく間違えるし」
『そうよねー。なんか憶え方ない?』
「あれ? そういえば TRUE と FALSE って説明したっけ」
『使ったことはあるけど意味は分かんない』
「TRUE は〈はい〉、 FALSE は〈いいえ〉って意味」
『意味って言われても……』
「MSDNの CWnd::UpdateData() のページ、見てみて」
『えっと、F1っと。あ、 FALSE か TRUE かって出てるね』
「だからそれ入れればいいってことで」
『あのねぇ……』
「正直なところ、結構この辺って複雑だし、こんどちゃんとまとめて教える
から、それまでは我慢してね」
『んー。で、憶え方は?』
「CWnd のメンバ変数にデータをアップデートする、って考えればいいんじゃ
ないかな。僕はそう憶えてるけど」
『で、TRUE なら〈はい〉だからメンバ変数に書き込んで、 FALSE なら〈い
いえ〉だから逆にエディットボックスに書き込む、っと。まぁ筋は通ってる
けど、逆に考えちゃいそうじゃない?』
「UpdateData() が CWnd のメンバ関数だから、 CWnd の視点で考える、み
たいな感じかな〜」
『なんかあいまいねー』
「ま、とりあえずこれでエディットボックスとの数字のやりとりはわかった
でしょ」
『うん。……もしかして?』
「とういうわけで、さっそく計算機を作っちゃいましょう!!」
『おー!』
「ちなみに訊くけど、どうやって作ればいいかわかる?」
『わかんない』
「ちょっとは考えなよ〜」
『はぁい。ん〜、ん〜、ん〜、わかんない』
「……まぁ最初は例がないと難しいかなぁ」
『難しい難しい』
「(じろり)」
『あう……』
「んじゃ、まずエディットボックスをあとふたつ貼り付けて」
『はーい。ダイアログエディタ開いて、エディットボックスをドラッグ&ド
ロップっと。エディットボックス、全部で3つだよね』
「そうそう。で今作ったののIDを、 IDC_E_LH と IDC_E_RH にして」
『LH とか RH ってなに?』
「〈レフトハンド〉と〈ライトハンド〉、ようするに左側と右側だね」
『ってことは左側のエディットボックスを IDC_E_LH にしなきゃいけないっ
てことだよね』
「そういうことだね。もちろんあとで位置入れ替えてもいいんだけど」
『あ、そっか』
「分かってなかったか……。そしたらクラスウィザードで、今作ったエディッ
トボックスのメンバ変数作って」
『変数のタイプとかは int でいいんだよね。変数名は? m_iLh とか?』
「そだね、 m_iLh と m_iRh でいいんじゃないかな」
『そしたら?』
「あとはいつものメンバ関数を書き換えるだけ」
void CCalcDlg::OnBEqual()
{
UpdateData( TRUE );
m_iAns = m_iLh + m_iRh;
UpdateData( FALSE );
}
『えっと、1行目でエディットのをメンバ変数に移して、2行目で足し算し
て、3行目でエディットに書き込む……あ〜、なーんだこんな簡単なんだ』
「そういうこと。 CWnd::UpdateData() を呼ぶタイミングさえ分かれば、あ
とはただの計算だから」
『なのねー。じゃ、ビルドして実行! で、IDC_E_LH の方に 3 入れて、
IDC_E_RH の方に 5 を入れて、【=】ボタン…… 8 って出た!』
「というわけで、これで足し算専用計算機は完成、だね」
『足し算以外は?』
「どうすればいいと思う?」
『わかんない』
「……」
『……あ、えっとねぇ、そうねぇ……よーするに + を - とか……あれ?
かけるとかってなんだっけ』
「 * と / ね」
『そうそう。それに変えればなるんだから、たとえば【=】ボタンじゃなく
て、【+】ボタンとか【*】ボタン作ればいいんじゃないかな』
「そんな感じだね。実際には〈正解〉なんてないし、誰も考えないような方
法でも人気が出て大ヒット、ってことも十分あり得るし」
『アイディア次第ってことよね』
「そういうこと!」
/*
Preview Next Story!
*/
『残念なことに、計算機が完成したのでこれで皆さんとも……ううっ』
「終わんないって。まだまだ教えることたっぷりあるんだから」
『とりあえず次の予定は?』
「Calc プログラムをもっと精錬させるとか」
『ふーん』
「というわけで次回」
< Version 3.12 ダイアログを整えよう >
『につづく!!』
「あとフリーウェアの公開方法とか、アイコンの描き方とか」
『それ!!』