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

    (C)KAB-studio 1999 - 2001 ALL RIGHTS RESERVED.
        http://www.kab-studio.com/
        info@kab-studio.com

    送信日： 2001/03/26(Mon) No.100
    配信数： 3840（ Mag2 + Pubzine ）
＊    発行元： まぐまぐ( URL: http://www.mag2.com/  ID: 0000012198 )
＊    発行元： Pubzine( URL: http://www.pubzine.com/  ID: 590 )
*/

/*                       祝・１００号！！                         */

『どんどんパフパフ〜！』
「このメールマガジン KAB-studio.h もとうとう１００号を迎えました！」
『ちょうど２周年、そして３年目に突入！』
「これもひとえに皆さんのご支援のおかげです」
『ホントに？』
「たぶん……」
『っつーかさ、はっきし言ってリニューアルに近いことしてるよね』
「鏑矢の憂鬱や金菜さんの憂鬱も終わるし、そして……」
『え？　来週から小説が載るの！？』
「ホームページでは４コママンガの掲載も予定しています」
『プログラミングの情報は減っちゃうけど、面白さは倍増！』
「ちょっと無茶苦茶な構成になるかもしれないけど」
『それがかぶスタらしさ！』
「変化し続け、色々な物を生み出し続ける場所として」
『これからも見守っててくれるとうれしいっす！』
「では、これからの５０号」
『これからの３年目も、応援よろしくお願いいたします！』

/*                ２００１年３月２１日（水）の更新                */
http://www.kab-studio.com/

・プログラミング辞書の単語受付、休止
　プログラミング辞書の単語受付を休止します。他のも含めて今回の再構築
は、筆者が４月から就職して忙しくなるから。いつか復活する……？
[ プログラミング辞書 ]
http://www.kab-studio.com/Programing/Dictionary/

・金菜さんの憂鬱、最終回
　 KAB-studio.h で連載中だった金菜さんの憂鬱が１００号で最終回になり
ます。これで金菜さんのコーナーがひとつもないことに……。
[ 金菜さんの憂鬱 ]
http://www.kab-studio.com/Programing/KanaU/


/*              ２００１年３月２６日（月）の更新                  */
http://www.kab-studio.com/

・Codian にページを追加
　Codian にページを追加します。今回は STL & iostream 入門から 
STL & iostream #25 を追加。これで最後！
[ STL & iostream 入門 ]
http://www.kab-studio.com/Programing/STLiostream/


/*                        チョー普通な日記                        */
http://www.kab-studio.com/nikki2/

2001/03/18 (Sun)
　基本的にのんびり。本屋行ってＣマガとか買ったり、 KTL 削除の準備と
か。田上様決勝進出！　でもなんか……。

2001/03/19 (Mon)
　４月と５月も研修期間、しかも本社で！　これでまた、寮関係が難しいこ
とに……。あとは STL & iostream 入門最終回の準備やアーカイブ化、
myShade2 でモデリング。

2001/03/20 (Tue)
　「しその潤い」探して三千里。でも最近効かない？　あとはイラスト描
き。風雅、舞いのイラストはうまくいかず(汗)。４コママンガ用に、簡単に
着色できる方法を開発。そして３Ｄモデリング。イラストばっかりだなー。

2001/03/21 (Wed)
　寮に行ってきました！！　なんかすんごく綺麗なんですけど……。ワン
ルームマンションで、これだけ綺麗で、駅前で、月３万(爆)。いいねぇ。あ
とラジオシティのコツ、そして辞書単語受付休止。単語追加もナシ(爆)。

2001/03/22 (Thu)
　再び寮へ。昨日は車で片道３時間、今日は電車で１時間半。まだ家財道具
持ってきてないからなんか不安な感じ。そしてネットオークション。やって
みるのも悪くないかも。あー、あと床屋行って髪の毛ばっさり切ってきまし
た。もうばっさりと。

2001/03/23 (Fri)
　卒業式！　７年間いた大学をとうとう卒業しました。その卒業式を終えた
ら家に戻って市役所に転出届を出して皮膚科に行ってさらにガッコに戻って
飲み会へ。あと COM+ の話。むむむっ、難しい……。

2001/03/24 (Sat)
　４月表紙壁紙完成！　今回は教室で物憂げな火美ちゃん。結構いい出来か
も。その制作過程を詳述！　あと最終回のサイファイハリーと哲也。どっち
もなかなかでした〜。


/*             プログラミング辞書・今週の追加単語                 */
http://www.kab-studio.com/Programing/Dictionary/

・追加単語：
なし

・今週の状況：
　今週は追加単語、ありません(爆)。そして、単語追加申請もすでに休止状
態に入っています。というわけで、このコーナーも今回で休止。
　ただ、プログラミング辞書自体はちょこちょこと更新していきたいと思っ
てるんで、このコーナーも不定期連載みたくなるかも。


/*                       金菜さんの憂鬱                           */
http://www.kab-studio.com/Programing/KanaU/

・テンプレート
#20 複雑なテンプレートの組み合わせ

　テンプレートは、これまでのプログラムじゃあんまり見られない仕組みを
実現することができます。今回はその紹介。

　 WTL ( Windows Template Library )っていうテンプレートライブラリが
あるんだけど、その中で多用されているのが、派生先クラスをテンプレート
引数に受け取るクラステンプレート。
　普通のクラスだと、継承元クラスから派生先クラスのメンバ関数を呼び出
すことはできない仕組みになってます。それこそ、無理なキャストとかする
必要が出てきます。ところが、派生先クラスをテンプレート引数として受け
取るように継承元クラステンプレートを設計すると、派生先クラスを明示で
きるからそのメンバ関数を呼び出すことができるんです。

　これとは逆に、継承元クラスをテンプレート引数で指定する、なんてこと
ができるクラステンプレートも作れます。
　実際には、継承元クラスのメンバ関数を直接呼び出したりしてるからテン
プレート引数になんでも渡せるわけじゃないんです。この方法のメリットは、
その継承元クラスを拡張した派生クラスをテンプレート引数に指定すること
ができるって点。継承元クラスとこのクラステンプレートとの間にクラスを
挟むことができるから、拡張性を高めることができるわけ。

　その他、テンプレートには普通じゃ見られない特殊な設計ができたりしま
す。あんまり複雑すぎるのもなんだけど、コンパイルタイムに決定するとか
のメリットを考えると、悪くないかも。

　で……実は、この「金菜さんの憂鬱」は今回で最終回。ホームページの方
から数えたらものすごく長いけど、皆さんの役に立てたのかな？　今度いつ
会えるかはまだ決まってないけど、そんなに先じゃないんじゃないかな。
　そのときまで、じゃね。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『風雅、舞い？』
「２年くらい前に、ホームページで毎日連載してた小説らしいよ」
『毎日連載！？　それってすごくない？』
「あの頃は今みたくプログラミングのページが多くなかったから」
『で、それが来週から始まるんだ』
「毎週ホントに少しずつらしいよ」
『それじゃ話分かんなくない？　なんでいっぺんに載っけないの？』
「連載してた当時、途中で休止しちゃったらしいから」
『あ、いっぺんに載っけたらすぐ底ついちゃうんだ……』
http://www.kab-studio.com/
_______________________________________________________________[KCM]


/*                       #pragma twice                            */
http://www.kab-studio.com/Programing/PragmaTwice/

　Version 5.35
レジストリにいっぱい書き込もう！

「というわけで前回最後は、リストの中身を出力するっていうのでした」
『これをレジストリに書き込むようにするんだよね』
「その前に、 iNo の値を文字列に変換してみた方がいいんじゃない？」
『…… TRACE( "%d: %s\n", iNo, cDataStr ); 』
「そうじゃなくって。あ、でも近いか」
『そっか、 sprintf() 使えばいいんだよね』
「 Ver 5.07 ( No.072 ) でやってるね。あれと同じ」
『だから……』

void CFileTestDlg::OnDestroy() 
{
    CString cDataStr;
    char chNo[10];
    for( int iNo = 0; iNo < m_cFileCmbBox.GetCount(); iNo++ )
    {
        m_cFileCmbBox.GetLBText( iNo, cDataStr );
        sprintf( chNo, "%d", iNo );
        TRACE( "%s: %s\n", chNo, cDataStr );
    }

    CDialog::OnDestroy();
}

『数字を入れる配列を外に作って、 sprinf() で iNo を文字列化してその
配列に書き込みビルドして実行！　うん、大丈夫そう』
「じゃ、最後はレジストリへの書き込み」
『えーっと、この前ので、"B" が chNo になるんだから……あ、 "A" はど
うしよ』
「履歴は英語だと History って言うことが多いかな」
『じゃ、 CWinApp::WriteProfileString() の第１引数は "History" 、第２
引数は chNo で。あ、今度は const 使おっと』

void CFileTestDlg::OnDestroy() 
{
    const int iCount = m_cFileCmbBox.GetCount();
    const char chSection[] = "History";
    CWinApp *pcWinApp = AfxGetApp();
    CString cDataStr;
    char chNo[10];

    for( int iNo = 0; iNo < iCount; iNo++ )
    {
        m_cFileCmbBox.GetLBText( iNo, cDataStr );
        sprintf( chNo, "%d", iNo );
        pcWinApp->WriteProfileString( chSection, chNo, cDataStr );
    }

    CDialog::OnDestroy();
}

『えっと、リストの数と、 "History" に const 使ってみました。あ、でも
"History" は、もしかしてストリングテーブルに書いた方が良かったのかな』
「書き込む項目が増えたら特にね」
『あとは、さっきのと前回のと組み合わせただけだから大丈夫でしょ。ビル
ドしてテストして……レジストリ見て……おおっ、ちゃんと名前が 0 とか 
1 とかでデータがリストの中身になってる！』
「じゃ、最後の仕上げにかかりましょう」
『？　あと何かあったっけ』
「今書き込んだのを読み込まなきゃ意味ないでしょう！！」
『あ、そうだった。えーっとまず…… CFileTestDlg::OnDestroy() と逆に
ダイアログが作られるとき呼ばれるメンバ関数を見つけないと。計算機の時
は OnInitDialog() だったけど』
「今回もそれでいいよ。 CFileTestDlg::OnInitDialog() が呼ばれたときに
はもうダイアログができてるから」
『コンボボックスにアクセスできるのね。 CFileTestDlg::OnInitDialog() 
の // TODO: のあとに書けばいいんだから、とりあえずさっきのをまんま貼
り付けて……』
「……」
『まず、最初なんだからリストは空、だから GetCount() の行はいらないで
しょ。他はそのままで…… GetLBText() は InsertString() かなんかに、
WriteProfileString() もたぶん ReadProfileString() とかあると思うから
それにして……あ！　どうやって for を止めればいいんだろ』
「 ReadProfileString() ……じゃなくて、 CWinApp::GetProfileString() 
っていうメンバ関数があるからそれ見てみて」
『えーっと、あ、見つからなかったら空の文字列が返るって書いてある！　
これで for を止めればいいんじゃないかな。でも……』
「でしょう」
『なにが？』
「こういう風に、いっぺんにやろうとするから難しいわけ」
『少しずつ少しずつ！　だね。えーっと、じゃあ for を取っ払ってひとつ
だけ読み込んでリストに追加してみよっと』

    // TODO: 特別な初期化を行う時はこの場所に追加してください。
    const char chSection[] = "History";
    CWinApp *pcWinApp = AfxGetApp();
    CString cDataStr;
    char chNo[10];

    sprintf( chNo, "%d", 0 );
    cDataStr = pcWinApp->GetProfileString( chSection, chNo, NULL );
    m_cFileCmbBox.AddString( cDataStr );

『さっきとだいたい同じ。 for を取っ払って WriteProfileString() に置
き換えて、よく考えたら後ろに追加してけばいいんだから GetLBText() は
AddString() に置き換え』
「うん、これでリストひとつだけ読み込むね」
『質問！　GetProfileString() の戻り値が CString だったからそのまんま
CString で受けちゃったけど』
「うん、これでちゃんと受けられるよ。 CString は文字配列とかポインタ
みたいに難しいこと考えなくても使えるから」
『あと第３引数の LPCTSTR lpszDefault = NULL 、 = ってどういう意味？』
「これは〈デフォルト引数〉って言って、この引数を省略すると、 = の右
側が自動的に渡されます、ってこと」
『じゃ、 NULL はいらないんだ。それと…… CString が空だっていうのは、
あ、メンバ関数にあるのかな』
「あるよ、 IsEmpty() っていうのが」
『ホントだ！　じゃこれを…… for ？　 iNo で止めるわけじゃないから
while の方がいいのかな』
「とりあえず試行錯誤してみて」
『うん、がんばる！』
　１０分経過……。
『はーっ、やっとうまくいくようになった！』

    const char chSection[] = "History";
    CWinApp *pcWinApp = AfxGetApp();
    CString cDataStr;
    char chNo[10];
    int iNo = 0;

    sprintf( chNo, "%d", iNo );
    cDataStr = pcWinApp->GetProfileString( chSection, chNo );
    while( !cDataStr.IsEmpty() )
    {
        m_cFileCmbBox.AddString( cDataStr );
        ++iNo;
        sprintf( chNo, "%d", iNo );
        cDataStr = pcWinApp->GetProfileString( chSection, chNo );
    }

「うん、ちゃんとうまく動いてるね」
『そうでしょ。なんかさ、 while の前と中に同じのがしかも２行もあるっ
ていうのが私的には不満なのよね。それになんか難しかったし』
「難しかった？」
『そうなのよ！　最初、リストの一番上の行がふたつになっちゃって、 
while の中の順番色々変えてやっとできたの！』
「 GetProfileString() が iNo の前に来てるとそうなっちゃうんだね。こ
れは while の前にも呼んでるから複雑になっちゃってるんだね」
『ね〜、水希ちゃんだったらどうするの？』
「僕だったら……」

BOOL CFileTestDlg::OnInitDialog()
{
// 略。
    // TODO: 特別な初期化を行う時はこの場所に追加してください。
    const char chSection[] = "History";
    CWinApp *pcWinApp = AfxGetApp();
    CString cDataStr;
    char chNo[10];
    int iNo = 0;

    while( 1 )
    {
        sprintf( chNo, "%d", iNo );
        cDataStr = pcWinApp->GetProfileString( chSection, chNo );
        if( cDataStr.IsEmpty() )
        {
            break;
        }
        m_cFileCmbBox.AddString( cDataStr );
        ++iNo;
    }

    return TRUE;
}

『 while( 1 ) って、これじゃ無限ループ……あ、中の break で抜けるよ
うにしてるんだ』
「この方が分かりやすいかな。でも〈無限ループと break の組み合わせ〉
って嫌いな人も多いから多用するものじゃないかも」
『この辺って、なんかやり方いっぱいありそうだしね』
「さて、 Ver 5 は今回で最終回！」
『おお！！　３５回って４分の３年よ！？　長すぎない？』
「それだけ中身が濃かったってことで。まず前半は、文字列とポインタにつ
いてじっくり見てみました」
『メモリの中身見て、どんな風になってるか調べたんだよね』
「文字列の後、ランタイムにちょっと触れてから、ファイル入出力」
『っつーかそれ、 iostream とランタイムと MFC と API って見て、結局
API を使ってるんだって話なんだよね』
「そこの部分は重要だからねー。 iostream とかのライブラリ使ってると、
なんか意味不明のもの使ってるみたいだけど」
『ライブラリだってちゃんとしたプログラム！　誰かが作ったものってこと
だよね』
「そゆこと。そのあとファイル読み込み関係のブラッシュアップ」
『細かい部分だよね。コツってゆーか』
「僕としては、こういうのの方が大事かも。本にあまり載ってないからね」
『それ強調するねー』
「そ、そう？　で、 Ver 5 の後半はウィンドウについて」
『メッセージ送ったり、ボタン作ったり！　このボタン作ったのってやっぱ
驚きかも』
「この辺も、プログラムってものを怖がらないって点で重要かもね。あと全
体的には、コンボボックスの使い方とかかな」
『 AddString が CComboBox にも CList にもあって、なんか MFC って結構
単純なのかなとか。さて、 Ver 6 はどうなるの？』
「 Ver 6 では、デバッグについて」
『うお、これまた難しそう！』
「火美ちゃんも自分でどんどんプログラム組むようになったみたいだけど、
どうしてもうまくいかない！　とかあるでしょ」
『うんある。なんか謎のエラーが出ちゃったり』
「そういう部分をどうクリアしていくのかってことを紹介していきます！」

/*
    Preview Next Story!
*/
『バグってゲーム用語だと思ってた』
「元々プログラミング用語だったのが一般に広まったんだね」
『そうだ！　ゲーム教えてよ、ゲームの作り方！』
「げ、ゲーム！？（僕も作ったことないよ……）」
『ね〜教えてぇん？』
「というわけで次回」
＜ Version 6.01 バグってなに？ ＞
『につづく！』
「い、 if と MessageBox() だけでできるでしょ？」
『そんな文章だけのなんかじゃなくって！』


/*                ２００１年３月２８日（水）の更新予定            */
http://www.kab-studio.com/

・STL & iostream 入門、配信完了！
　 STL & iostream 入門の再放送配信が、とうとう最後を迎えます。バック
ナンバーは Codian やダウンロードルームにてご覧ください。
[ STL & iostream 入門 ]
http://www.kab-studio.com/Programing/STLiostream/
[Codian]
http://www.kab-studio.com/Programing/Codian/
[ ダウンロードルーム ]
http://www.kab-studio.com/Freeware/


/*                ２００１年４月２日（月）の更新予定              */
http://www.kab-studio.com/

・表紙壁紙を４月バージョンに！
　毎月恒例、新しい表紙壁紙です。今回は桜の花と憂鬱そうな火美ちゃん…
…の予定。

・「風雅、舞い」スタート！！
　オンライン小説「風雅、舞い」が KAB-studio.h にて連載開始！！　ジャ
ンル的には、現代アクションファンタジー？


/*                          ご注意！！                            */

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

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

    (C)KAB-studio 1999 - 2001 ALL RIGHTS RESERVED.
        http://www.kab-studio.com/
        info@kab-studio.com
*/


/*                      See you next week!!                      */


