文系未経験から一人前のプログラマーになるまでの日記

文系未経験でプログラマーとして採用してもらえたものの、プログラミング業務ができずに伸び悩んでいるプログラマーが会社で役に立てるようになるまでの日記です。

なぜメンバ変数は原則プライベートに(カプセル化)するのか?

メンバ変数は原則プライベートに(カプセル化)し、
必要に応じてsetterとgetterを付ける。

なぜ???

理由:クラスの外から意図しない値に変えられないようにするため。
例:モンスタークラスのm_hpを外部から直接テキトーな値、例えば0を設定してしまった..!
→ (インスタンス化した後)あれ??このモンスターなぜかHPが0だぞ....なぜ???
と思った時にプログラムの中をすべて見なくてはいけなくて困ってしまう。
→ ここでprivateでそのクラスの中だけで使われていることが分かっていると、
そのクラスだけ見ればよいし、
setterで外部で値を設定されていること箇所があれば参照を検索して調べることができる。
(※この場合は、その変数は外部で使っても良いという設計にしている。)

2020/3/19(木) 体調が良くなってきてブログ書ける時間作れた

目標:
・ボタン押下後複数のチェックボックスコントロールの表示処理

結果:
できた。

反省:
配列に入れて添え字を、変数をインクリメントして
高速で表示する処理を作ろうとしたができなかったこと。

原因:
CArrayObjectクラスにCButtonクラスのインスタンスのポインタを渡した後、
何をすれば(例:どんな関数を使えばよいか)表示処理を作れるか分からなかったこと

次回:
検索キーワードを上手く作れるようにする。
具体的には、検索して読解しているサイトから、
よりよい検索キーワードを探して検索してみる。

エディットコントロールから入力文字を取得しチェックボックスコントロールの表示文字に設定する

処理フロー:
・CheckBoxコントロールとEditコントロールをダイアログに貼り付ける

入力文字をエディットボックスで入力確定して、文字列が書き変わらないようにできるか?

問題:ボタンクリックイベントハンドラがボタンクリックしても呼ばれない。
→ 対応中。
分からないので質問をした。
ja.stackoverflow.com

質問した後にタブコントロールならではのメッセージ処理の作り方があるのではないかと思い
検索したら、それらしきものがあった。
→ MSDNの「タブ コントロールの通知メッセージの処理」というドキュメント。
docs.microsoft.com

これを読解して、
ボタンクリックイベントハンドラがボタンクリックして呼ばれるように処理を作れるか試してみる。

読解内容:
ユーザーがタブまたはボタンをクリックすると、タブコントロール (CTabCtrl) によって通知メッセージが親ウィンドウに送信されます。
→ ということは、親であるダイアログにクリックメッセージが送信されるということ?

ビューまたはダイアログクラスのタブコントロールから、WM_NOTIFY メッセージを処理します。
→ 親ダイアログがWM_NOTIFY メッセージをOn~NOTIFYで受けるからそれを処理するイベントハンドラを作って、
SendMessegeマクロで子ダイアログにメッセージを送ってみればよい??

クラスウィザードを使用して、処理されている通知メッセージに基づいた switch ステートメントを含むOnChildNotify handler 関数を作成します。
→ ああ、親ダイアログでswitch ステートメントを含むOnChildNotify handler 関数を作成するのかな?
→ うーんでもタブコントロールが親ウィンドウに送信できる通知の一覧見たけど、
ボタンコントロールのクリックを通知するメッセージがなさそうなんだよなぁ....

そのとき、「子ダイアログ ボタン クリック」ともっと細かい検索なら参考になりそうな記事が出てくるかなと思い、
mfc タブコントロール 子ダイアログ ボタン クリック
で検索した。
→ 
qa.itmedia.co.jp
子ダイアログのウィンドゥプロシージャーを呼ばないと、小ダイアログはメッセージキューに入れられたメッセージを処理できません。
→ これだ!ウィンドウプロシージャを呼べば、メッセージ処理ができそうだ!!
ウィンドウプロシージャの呼び方は?:


・他に、
OnBnClickedAddButtonがprivateになっていたからクラスの中の処理でしか使えず、
クラスの外からくるメッセージを受け取れないのでは?と考えて、publicにしたが、上手くいかないことを確認した。

!!もしかして、tabコントロールの上に作ったインスタンスじゃないからメッセージが受信できない???

【解決】
ja.stackoverflow.com


学んだこと:
作成したクラスを他のクラスで使うときは、includeで作成したクラスを使うクラスに書く。
ポインタで直接クラスのメモリ領域を指してnewしないとイベントハンドラが呼ばれない。
※なぜ↑なのかわからない。

本日意識すること:
検索キーワードを上手く作れるようにする。
具体的には、検索して読解しているサイトから、
よりよい検索キーワードを探して検索してみる。

staticコントロールで表示文字列を変更する基本処理:

void CSampleEditControlDlg::OnBnClickedButton1()
{
	// TODO: ここにコントロール通知ハンドラー コードを追加します。

	// エディットコントロールから入力された文字列をm_csMessageに設定
	UpdateData(TRUE);

	// 設定した文字をスタティックテキストコントロールに設定する
	GetDlgItem(IDC_STATIC)->SetWindowTextW(m_csMessage);
}

クラスウィザードでメンバ変数の追加するときの「カテゴリ」について

「カテゴリ」は、
コントロールを制御するための変数の場合:「Control」選択
コントロールに表示されている値を取得・設定する場合:「値」選択

タブコントロールの使い方

ほぼ以下の参考サイト様と会社の先輩のおかげで作れた。
感謝感謝。
参考:
qiita.com

知りたいこと1:
tab.SubclassDlgItem(IDC_TAB, this);
はどんな処理なのか?
答え:
タブコントロールをサブクラス化している。

知りたいことをちゃんと理解するために理解すべきこと:
・サブクラス

わかったこと:
・サブクラスとは、継承先のクラスのことらしい。
・サブクラス化をtab.SubclassDlgItem(IDC_TAB, this);
でしている理由は、このタブコントロールのみにメッセージを送るため。
※こうしないとダイアログにくっつけたコントロールを含めたダイアログ全体にメッセージが送られてしまう。


知りたいこと2:
tcn_selchangeとtcn_selchangingの違いは?

答え:
タブを切り替えようとしているタイミングとタブを切り替えた後のタイミングの違い。


知りたいこと3:
タブ初期化時に子ダイアログの位置調整処理が期待通りに動作しない。

答え:
Styleプロパティの設定を「子」にする。
f:id:SkyWing:20200314103524p:plain


結果:
f:id:SkyWing:20200314103323g:plain

2020/3/14(土) 土日・祝日は予定が入らない限り10時間勉強開始!!

目標:
10時間勉強する。

結果:
できた。
反省:
完璧。
次回:
仕事と勉強効率重視のため、明日は7時間絶対勉強して、
残りはできる限り勉強する目標に変更する。