
/*
    KAB-studio.h
        　ＫＡＢ−ｓｔｕｄｉｏで先週更新した内容
        が格納されたヘッダーファイルです（笑）。

    (C)KAB-studio 1999 - 2000 ALL RIGHTS RESERVED.
        http://www2.justnet.ne.jp/~kabstudio/
        kab-studio@multimedia.design.co.jp

    送信日： 2000/01/31(Mon) No.042
    配信数： 3430（ Mag2 + Pubzine ）
＊    発行元： まぐまぐ( URL: http://www.mag2.com/  ID: 0000012198 )
＊    発行元： Pubzine( URL: http://www.pubzine.com/  ID: 590 )
*/


/*              ２０００年１月３１日（月）の更新                  */
http://www2.justnet.ne.jp/~kabstudio/Info/News/

・表紙を２月バージョンに。
　毎月恒例、新しい表紙です！
　今回は時間がなかったのもあって、背景なし（泣）。来月はちゃんとした
いです……。
　ちなみに詳しい解説はチョー普通な日記１月２７日を読んでね。

[表紙]
http://www2.justnet.ne.jp/~kabstudio/


/*                        チョー普通な日記                        */
http://www2.justnet.ne.jp/~kabstudio/nikki2/

２０００年１月２３日（日）：
　武双山優勝！！　いやー、ずっと応援してた力士が優勝するってのはいい
もんすねー。

２０００年１月２４日（月）：
　研究室遊山１日目。そしてジャストネットの独自ドメインサービスを申し
込んでしまう。むむ、先走ったか？

２０００年１月２５日（火）：
　研究室遊山２日目。今日は本命含めて３つ。んで１３万ヒット。順調だねぇ。

２０００年１月２６日（水）：
　２月表紙苦戦。そしてヒミツの更新……。

２０００年１月２７日（木）：
　２月表紙完成。しかし……ああっ！　あとキャラ選びとか。

２０００年１月２８日（金）：
　ひたすら辞書書き。いや疲れた。あといつも通りアニメ色々。

２０００年１月２９日（土）：
　やっぱ辞書書き。そしてアニメ。あら昨日と同じ。


/*                         鏑矢の憂鬱                             */
http://www2.justnet.ne.jp/~kabstudio/Programing/KabuU/

２０００年１月２３日（日）：
お休み

２０００年１月２４日（月）：
お便り
同じドキュメントから複数のビューを作る方法
CFrameWnd::GetActiveDocument() を使った
やっぱ決め打ちはいけない
お便り
CStirng でフラグメントが起きるのか
たぶん起きる
new で確保してるだけ
回避するプログラムを作るのは大変
普通ならまず大丈夫

２０００年１月２５日（火）：
お便り
JBuilderFoundation の配布
CString のフラグメントはあまり気にしなくていい
ガベージコレクタを使う手も
CString は 64K 以上が苦手

２０００年１月２６日（水）：
お便り
Observer/Observable は使わない
Observer::update() というメソッド名が抽象的すぎる
メソッド名の意味
C++ のガベージコレクタは特別な関数が必要
お便り
CString ありがとう

２０００年１月２７日（木）：
お便り
メソッド名の議論は？
Java からのウィンドウズオブジェクトへのアクセス
COOL は？
生でインターフェイスポインタを獲られるわけじゃない
C++ でのメソッド名の議論は少ない
メソッド名に注目が集まったのは最近？
std::basic_streambuf とか考えて欲しい

２０００年１月２８日（金）：
お便り
real
Pascal の型
COM のラッパーとガベージコレクタ
Java のクラスにもデストラクタに代わるものがある？
real はちょっと困った
プログラミング辞書って楽なのか大変なのか分からない

２０００年１月２９日（土）：
お便り
「解放」と「クローズ」、ガベージコレクタ
解放の仕組み
finalize()
デストラクタは忘れた方がいい？
寿命の長さと優先度
C++ と Java の違い
お便り
finalize() と ガベージコレクタ
破棄のオーバーヘッド
real
解放したあとの使用
STL に含まれるクラス


/*                       今週の追加単語                           */
http://www2.justnet.ne.jp/~kabstudio/Programing/Dictionary/

・追加単語：
グラフィック コンパイラ リンカ volatile const プリプロセッサ マクロ
COM+ GUI CUI レジストリ Run ウィンドウ フリーストア  
ローカル スコープ リンケージ static 名前装飾 クラススコープ
コンストラクタ デストラクタ ASCII

・更改単語：
グローバル extern コピーコンストラクタ

・今週のごめんなさい
文字列 マーシャリング virtual cfile STL ASPI クラス HWND runtime 
リンゲージ ファイルスコープ ロケート

　追加単語、ホント多いですね（汗）。こっちで追加したのが半分くらいあ
るんじゃないかなぁ。このクセはえーかげんやめんと、自分の首絞めかねん
な……。


/*                       #pragma twice                            */
http://www2.justnet.ne.jp/~kabstudio/Programing/PragmaTwice/

　Version 3.17
ダイアログの閉じ方

「今回からまたプログラミングの話に戻ります」
『ぶーぶー』
「って、ホントはそれが目的なんだから……」
『そういえば、リソース関係ってもういいってこと？』
「うん、後回しにしたところもあるけど、フリーウェアとしてリリースする
のに必要なとこは全部見たかな」
『ダイアログ、アイコン、ストリングテーブル、バージョン情報、ね』
「この４つを押さえれば大丈夫でしょ」
『ふーん』
「んじゃ、まずは簡単なテスト」
『ええっテスト！？』
「って火美ちゃんにじゃなくて、テスト用のプログラムを作るってこと」
『なぁんだ』
「そういえば、 Calc のプログラムの中で、実際に Calc ダイアログを表示
する部分がどこか憶えてる？」
『やっぱりテストじゃない！！　えっとねぇ……はいヒット、CCalcApp クラ
スの InitInstance() ってメンバ関数の、定義、が書かれてるとこ』
「そう、 Ver 3.1 （ No.026 ）で見たね。じゃ、その部分表示して」
『はーい。 File ……あ、クラスビューの方が早いかな。 ClassView の 
CCalcApp の InitInstance() で……』

BOOL CCalcApp::InitInstance()
{
    // 略１。
    CCalcDlg dlg;
    m_pMainWnd = &dlg;

    int nResponse = dlg.DoModal();
    // 略２。
}

『この dlg.DoModal(); ってとこでダイアログ表示してるんだよね』
「そうそう。で、この〈略２〉の直前に、この１行を追加して」

    TRACE( "%d\n", nResponse );

『なつかしー！　これって確か、数字を見るのだよね』
「そう。ここでは nResponse の中身を見てみます」
『 nResponse ……って、すぐ上で作ってるのだね。んーと、なにやってる
んだろ』
「 dlg.DoModal(); の、戻り値を受け取ってるでしょ」
『戻り値……』
「関数を呼ぶと、その結果が〈戻り値〉って形で返ってくるでしょ。確か、
変数に置き換わるんだよとか教えたような……」
『 Ver 2.10 （ No.021 ）で見たね。あ、こういうときは DoModal() のこ
と調べればいいんだよね』
「ちゃんと憶えてるじゃない」
『へへーん。 DoModal でダブルクリックして F1 っと。うぎゃ、いっぱい
出た！』
「さてどれでしょう」
『えーっと…… CCalcDlg ってないよ？』
「 DoModal() は CCalcDlg のメンバ関数じゃないでしょ。そのひとつ上」
『継承！　そーそー、確か CDialog の DoModal() とかを使いたいから、継
承して CCalcDlg ってゆー……カスタマイズクラスを作ったんだ』
「思い出してきたね」
『まかせてよ！　じゃ、 CDialog::DoModal() をダブルクリック！』
　MSDN が開き、 CDialog::DoModal() のページが表示される。
『戻り値は……〈ダイアログ ボックスを閉じる CDialog::EndDialog メン
バ関数の引数 nResult に渡す int 値を返します〉って、？？？』
「ま、世の中そんな甘くないよね」
『なんやとコラ』
「だからもっと調べないと。 CDialog::EndDialog は？」
『そっか、そーやってひとつずつ見てけばいいんだもんね。リンクたどって』
　MSDN に CDialog::EndDialog() の情報が表示される。
『えーっと、〈モーダル ダイアログ ボックスを終了します〉ってことは』
「〈モーダルダイアログ〉は普通のダイアログのこと。つまり」
『ダイアログを閉じるってこと？』
「そういうこと。んじゃ懐かしの、【＝】ボタンを押したときの関数を開い
て」
『えっと、 CCalcDlg::OnBEqual()  だよね』

void CCalcDlg::OnBEqual() 
{
    UpdateData( TRUE );
    m_iAns = m_iLh + m_iRh;
    UpdateData( FALSE );
}

「これに１行書き加えて……」

void CCalcDlg::OnBEqual() 
{
    UpdateData( TRUE );
    m_iAns = m_iLh + m_iRh;
    UpdateData( FALSE );

    EndDialog( 100 );    // この行を追加。
}

『あ、結果想像できるかも。ビルドして実行！　数字書き込んで、【＝】を
押すと……あ、 Calc ダイアログ閉じちゃった！』
「って感じに、 CDialog::EndDialog() を呼ぶとダイアログが閉じます。で、
ここでアウトプットウィンドウを見てみて」
『あれ、 100 って出てる』
「ここに、さっきの CDialog::EndDialog() に渡してる 100 って数字が出て
るわけ」
『？？？』
「ほら、 CDialog::DoModal() の戻り値の解説」
『あ、  CDialog::EndDialog の引数に渡してる……この 100 って数字が、 
CDialog::DoModal() の戻り値として返ってくるってことなんだ！』
「難しく書いてあったけど、そういうこと。で、この戻り値を」
『 TRACE() でアウトプットに出したってことねー』
「流れをまとめると」

1: CDialog::EndDialog() を呼ぶとダイアログが閉じる。
2: CDialog::DoModal() から返ってくる。
3: そのときの戻り値が CDialog::EndDialog() に渡した数字。
4: それを TRACE() で出力してみた。

『っていうテストをしてみたってことね』
「あ、さっき追加した行削除しておいてね」
『そりゃあれで閉じちゃったら計算機になんないもんね』
「さて、もう少し突っ込んで考えてみます。なんで、最初から付いてた【OK】
と【キャンセル】のボタンは、押すとダイアログが閉じるんでしょうか」
『そーいえば。【＝】ボタンは押したって閉じないんだもんねぇ』
「じゃ、今度は Calc ダイアログをダイアログエディタで開いて」
『えーっと、 ResourceView の IDD_CALC_DIALOG っと』
「そしたら【OK】ボタンのプロパティを表示して」
『表示したら？』
「【ID】を IDOK から IDOK2 にしてビルドして実行」
『 IDOK2 にしてビルドして実行！　【OK】ボタン押してもダイアログ閉じ
なくなっちゃった』
「んじゃ元に戻して」
『 Calc ダイアログ閉じて……元に戻す、で、戻ったね。で、ビルドして実
行、今度はちゃんと閉じるよ』
「というわけで、実はボタンのＩＤが IDOK だから、自動的に閉じるんです」
『おー。ってことは【キャンセル】ボタン…… IDCANCEL ってＩＤだから
自動的に閉じるんだ』
「そういうこと。これが鍵になってます」
『これってウィンドウズの仕組み？』
「ううん、ＭＦＣの仕組み。それをこれから見てみるから。全文検索のこと
思い出してみて」
『えーっとねぇ、 Ver 3.8 （ No.033 ）で使ったね。あのときはＭＦＣの
プログラムの中から CWnd を探したんだよね。今度は？』
「今度は、同じＭＦＣの中から IDOK を探してみて」
『はーい。メニューの【編集】−【ファイルから検索】っと、 IDOK を書き
込んで、フォルダをＭＦＣのプログラムがあるとこにして、検索開始！』
　アウトプットに結果が次々と表示される。
『あ”、いっぱい引っかかっちゃった』
「でも見てくと、知ってる単語があると思うよ」
『知ってる単語ねぇ……あー！！』

C:\（略）\MFC\SRC\DLGCORE.CPP(703):    EndDialog(IDOK);

『 EndDialog() ！　これ？』
「これ。この行をダブルクリックして」
　DLGCORE.CPP が表示される。 CDialog::OnOK() というメンバ関数の定義。
『あ、こーゆーメンバ関数があるんだ』
「その下に CDialog::OnCancel() っていうのもあるよ」
『あらホント。もしかして、ＩＤが IDOK のボタンだと、このメンバ関数が
呼ばれるってこと？』
「じゃ、試してみましょう。こういうときはどうすればいいと思う？」
『あ、えーと、 TRACE() を書き込む』
「ＭＦＣのプログラムなんだから書き換えちゃダメ！　こういうときは、ブ
レークポイントをセットするの」
『あ、そうすればこの関数が呼ばれるか分かるもんね！』
　EndDialog(IDOK); の行をクリックしたあと、ツールバーの【手のひら】
を押す。さらに EndDialog(IDCANCEL); にも同じことをする。行の頭に丸。
「手慣れてきたね」
『こういうのって、ちょっとしてないと逆にできるようになんのかも。で、
ビルドして実行、【OK】ボタンを押す……あ、矢印出た！』
　EndDialog(IDOK); の丸の上に矢印が表れ、プログラムが止まる。
『はー、この EndDialog() が呼ばれるから、ダイアログが閉じるんだ。
ねー、まとめてみていい？』
「いいよ」

1: OK ボタンが押される。
2: ＩＤが OK のボタンが押されると、 CDialog::OnOK() が呼ばれる。
3: CDialog::OnOK() の中で、 CDialog::EndDialog() が呼ばれる。
4: だからダイアログが閉じる。

『って感じ？』
「そういうこと。だから……」
『だから？』
「ＩＤが OK なら、ボタンの名前はなんだっていいし、あとで貼り付けたボ
タンでも、ＩＤが IDOK ならちゃんと閉じるから」
『なるほど』
「あと、なんで普通のボタンは呼ばれなくて、 IDOK とかは特別なのか」
『そうそう、それはどーして？』
「ってのはちょっと難しいからかなりあと」
『あらら』
「ただ、たとえば火美ちゃんが作った【＝】が CCalcDlg::OnBEqual() を呼
び出すようになってるように、〈押されたボタンで呼び出されるメンバ関数
が選ばれる〉システムが備わってるってこと」
『【OK】ボタンのは最初からあって、【＝】ボタンのは私があとから作った
ってことね』
「そういうこと」
『このシステムは、ＭＦＣの？』
「そう。だからもっとプログラムが読めるようになれば、そのシステムも直
接見られるようになるから」
『はー、かなり先っぽいけど……』
「さて最後。 CDialog::OnOK() では EndDialog(IDOK); 、 
CDialog::OnCancel() では EndDialog(IDCANCEL); が呼ばれてます」
『あ、ってことは CDialog::DoModal() の戻り値ってボタンのＩＤが返って
くるってことね』
「それを踏まえて次回に続く！」

/*
    Preview Next Story!
*/
「久しぶりのプログラミングだけど、どう？」
『んー、前の復習ばっかりだからそんなに難しくなかったかな』
「忘れる、ってことがないのは便利だなぁ……」
『というわけで次回』
＜ Version 3.18 レジストリに保存しよう！ ＞
「につづく！！」
『どしたの？』
「ううん、なんかあっという間に追い抜かれそうな気が……」
『だからこんなのんびりなんだ』
「違いますっ！」


/*                       金菜さんの憂鬱                           */
http://www2.justnet.ne.jp/~kabstudio/Programing/KanaU/

アプリのツボ
#06 ファイラー その２

　ファイルの列挙は基本的に楽。でもそれじゃ dir とか ls と同じよね。
ファイラーを作る意味のひとつは、分かりやすい GUI を使って表示するこ
と。でもこれが結構大変なのよね。

　フォルダ風ならリストコントロール。これは MFC のクラスとか使って処
理すれば結構簡単かな。でもドラッグ＆ドロップの処理とか、表示項目の入
れ替え、ソートとか結構面倒な処理をしてます。フォルダのソート機能って、
１バイト文字と２バイト文字を区別することなくソートしてくれます。こう
いう気配りも大事かも。
　エクスプローラー風でいくなら、分割ウィンドウを使って、そこにツリー
コントロールを貼り付けなきゃね。分割ウィンドウはウィンドウズそのもの
の機能じゃないから、 MFC を使わない場合には結構大変かも。ま、よく使
われてるから探せばどっかにライブラリがありそうだけどね。MFC なら
CSplitterWnd を使えば楽に実装できるけど、これはこれで結構クセがあっ
て、このクラスの使い方って結構質問が出てくるのよね。
　ツリーコントロールはリストコントロールと同じ、ウィンドウズのコモン
コントロールのひとつ。リストコントロールが使いこなせれば、ツリーコン
トロールの操作はできるんじゃないかな。

　こういったコントロールの操作は、結構気を使うのよね。でもファイラー
としてのメリットでもあるんだし、重点的に作りこむ方がいいかもね。
　さて、ウィンドウズではファイルシステムを拡張した「シェルエクステン
ション」っていうのが使われています。これは来週。じゃね。


/*            ２０００年２月７日（月）の更新予定                  */
http://www2.justnet.ne.jp/~kabstudio/Info/News/

・更新なし。
　２月１５日までテストとかあってちょっと忙しくなるから、特に大きな更
新はないでしょう。もしかしたら辞書とかもちょっと滞るかも……？


/*                          ご注意！！                            */

・このメールを返信しないでください。
・ご意見・ご希望・ご感想は[チョー普通な日記]よりお送りください。
http://www2.justnet.ne.jp/~kabstudio/nikki2/
・プログラミングに関する質問は[鏑矢の憂鬱]にお送りください。
http://www2.justnet.ne.jp/~kabstudio/Programing/KabuU/
・購読登録を解除したいときにはこのページで行なってください。
＊http://www.mag2.com/m/0000012198.htm
＊http://www.pubzine.com/detail.asp?id=000590
・解除は自分で行なってください。
・バックナンバーはこれらのページにあります。
http://bigbeat.tegami.com/~mgsearch/frame.cgi?id=0000012198
http://www2.justnet.ne.jp/~kabstudio/Freeware/

/*
    KAB-studio.h
    Weekly Mail Magazine.
    Written by Kaburaya Seiden.

    (C)KAB-studio 1999 - 2000 ALL RIGHTS RESERVED.
        http://www2.justnet.ne.jp/~kabstudio/
        kab-studio@multimedia.design.co.jp
*/


/*                      See you next week!!                      */


