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

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

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

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

・Codian に STL を追加
　 STL & iostream 入門から Codian に STL を追加！
　今回は #10 から #13 、関数オブジェクトの後半をお届けします。
[ Codian ]
http://www.kab-studio.com/Programing/Codian/
[ STL & iostream 入門 ]
http://www.kab-studio.com/Programing/STLiostream/

・表紙を１２月バージョンに
　毎月恒例、新しい表紙です。今月はすのぼ……ではないですね（汗）。
[CG Gallery]
http://www.kab-studio.com/CG/Gallery/


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

2000/11/26 (Sun)
　久しぶりにのんびり〜。テレビ見て過ごしてました。そして、わてのピア
ノ弾きとしての想い出。久々に弾こうかなー。

2000/11/27 (Mon)
　色々した日。ゲーセンでギルティギアゼクスしたり中古コミック買ったり
ビデオのダビングしたり１２月表紙をちょっと描いたり WTL プログラミン
グしたりと色々。

2000/11/28 (Tue)
　ドリキャス欲しいなーという話。でもお金が（泣）。お正月くらいにも買
おうかなぁ、でも卒論あるしなー。そして日記のタイムスケジュール。「毎
日いつ更新されとるんやろ」という方は必見！

2000/11/29 (Wed)
　久々に新宿行ってきました！　アクティブスピーカーを買い、同人誌は見
つからず、ドリキャス版ギルティギアゼクスに惚れ込み、キーボード隙間ク
リーナーを買い間違える。謎だ。

2000/11/30 (Thu)
　１２月表紙完成！！　今回はホームパーティーでなんかアレな服装の火美
ちゃん。今回はさらに疲れましたよ。それなりには良くできたと思うけど。

2000/12/01 (Fri)
　就職前研修（通信添削）に汗をかき、ＢＳデジタル放送に毒を吐く(爆)。
あとガンバルガー最終回。懐かしかった以上に内容が良かったです。

2000/12/02 (Sat)
　かぶヘッダー(このメルマガ)の準備。なんだかんだ言って結構大変なのよ。
ま、もちろん好きだからやってるんだけどね。あとテレビ色々〜。金曜深夜
枠がかなりいいよん。


/*                         鏑矢の憂鬱                             */
http://www.kab-studio.com/Programing/KabuU/

2000/11/26 (Sun)
23日の日記がない
WTL 使い始め
WTL は ATL 用サポートライブラリ
実行ファイルを作るのに向いている
ダウンロード方法
解凍の中身
ATL/WTL AppWizard からスタート

2000/11/27 (Mon)
WTL でモーダルダイアログを表示する Exe
プロジェクト名.cpp 
CAppModule 型のグローバル変数 _Module 
CWinApp theApp の代わり
_Module の名前は変えられない
_tWinMain() もある

2000/11/28 (Tue)
WTL でモーダルダイアログ
maindlg.h に CMainDlg 
CDialogImpl から継承
OnInitDialog() や OnOK() が最初から作られている
OnInitDialog() で API の LoadImage() を呼んだり
お便り
「プログラムの強制終了」ダイアログで「終了」で「応答なし」は？
WM_CLOSE を PostMessage() します。１０秒間待つ
反応がなければ「応答なし」
調べるだけなら新スレッドで他のメッセージを SendMessage() がいいかも
お便り
システムフックで WM_DEVICECHANGE を拾いたい
どのフックで拾えばいいのかは結構調べるの大変
サブクラス化したほうが楽かも
システムフックを掛けて SetWindowLong() で置き換える

2000/11/29 (Wed)
WTL でモーダルダイアログ
ClassWizard はほとんど機能しない
右クリックメニューの「イベント」だけは機能する
リソースがすべて「英語」
WTL の AtlMisc.h に CString が入ってる
他にも CRect CRecentDocumentList CFindFile なども

2000/11/30 (Thu)
WTL でモーダルダイアログ
MFC のような DDX を使える
AtlDdx.h に DDX 用クラスとマクロが用意されている
サンプルコード
CWinDataExchange から派生
BEGIN_DDX_MAP マクロ
範囲指定や、型が違うときのエラーも表示できる
全部自分で書ける感じ

2000/12/01 (Fri)
ATL/WTL で使われるテンプレートの継承
サンプルコード
親クラスのテンプレート引数に子クラスを指定
テンプレート引数経由で子クラスのメンバへアクセス
オーバーライドって感じがしない

2000/12/02 (Sat)
ATL/WTL で使われるテンプレートの多重継承
サンプルコード
テンプレート引数経由で姉妹クラスのメンバへアクセス
テンプレートだから安全
でもオーバーライドし放題かも


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

・追加単語：
１バイト文字 ２バイト文字 ActiveMovie CString switch アンマップ
クロージャー スカラー 全角文字 半角文字 フッター ベンダー 
メモリリーク 

・今週の状況：
　今週から単語追加を再開……の割りにはなんかあんまり集まらなかっ
た(汗)。まー、この数でもそれなりに大変って思えばこのくらいがいいのか
もしれないけど。


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

#05 テンプレート引数の制限

　今回はテンプレート引数の細かい部分について見ていきましょう。まず、
テンプレート引数が関数テンプレートの引数になってない場合。

template< class type_Return >
type_Return RetZero()
{
    return 0;
}

　前回言った通り、テンプレート引数は関数の引数で決定されるから、これ
は普通には呼べません。

//  RetZero();    // コンパイルエラー。

　ちょっとひねって

//  int i = RetZero();    // コンパイルエラー。

　っていうふうにしても、呼ぶことはできません。
　この場合、テンプレート引数を明示すれば呼ぶことができます。

    RetZero< int >();    // int 型を指定。

　この「テンプレート引数の明示」を使うと、引数や戻り値以外でも「型の
置き換え」ができるようになります。

template< class type_Class >
void CallStaticMemFunc()
{
    type_Class::StaticFunc();
}

class CHasStaticMemFunc
{
public:
    static void StaticFunc()
    {}
};

void Use_CallStaticMemFunc()
{
    CallStaticMemFunc< CHasStaticMemFunc >();
}

　つまり、テンプレート引数を明示する仕様にすれば、どんな型でも置き換
えることができるようになるわけ。これが「テンプレートは #define の代
わり」って言われる理由かな。次回はオーバーロードについて。じゃね。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『ねー、テンプレートって面白いの？』
「なにいきなり」
『だってさ、上のかなゆ〜も、かぶゆ〜も、 STL(略)入門もそうだし』
「今の C++ には必要不可欠な要素かもね」
『この前のからかなゆ〜読んでるけど、結構解るよ私』
「テンプレートは単なる置き換えだからね」
『じゃーなんで水希ちゃん教えてくんないの？』
「そうだなー、絶対必要なものじゃないんだよね」
『そなの？』
「火美ちゃん std::ifstream 使ってたでしょ」
『ファイルから読み取るときのクラスだよね』
「これもホントはテンプレートなんだよ」
『ええっ！　そうだったの？』
「でもテンプレート出て来ないでしょ。テンプレートは裏方さんだから」
『縁の下の力持ちなんだ』
「勉強するときは、その縁の下も自分で組まなきゃいけないとき」
『まだまだ道は険しいのね……』
_______________________________________________________________[KCM]


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

　Version 5.20
ファイル読み込みをさらにブラッシュアップ！

「前回までで、 CFileTestDlg::OnBtnShow() はこんな感じになってます」

void CFileTestDlg::OnBtnShow() 
{
    m_cDataLstBox.ResetContent();

    int i;
    std::ifstream cIFStrm;
    cIFStrm.open( "_Data.txt" );
    if( cIFStrm.fail() )
    {
        CString cStr;
        cStr.LoadString( IDS_E_NOFILE );
        const int iIDOffset = 1000;
        CString cStrCap;
        cStrCap.LoadString( IDS_E_NOFILE + iIDOffset );
        MessageBox
            ( cStr, cStrCap
            , MB_OK | MB_ICONEXCLAMATION );
        return;
    }

    while( !cIFStrm.eof() )
    {
        cIFStrm
            >> i;
        if( cIFStrm.fail() )
        {
            TRACE( "整数値じゃないです\n" );
            return;
        }
        char chDest[256];
        sprintf( chDest, "%d", i );
        m_cDataLstBox.AddString( chDest );
    }
}

『今はファイル読み込みの所のエラー処理をしてるんだよね』
「そうです。でもちょっと下の方見てみて。こっちでもエラー処理してるで
しょ」
『あ、ホントだ、 TRACE() でエラー出してるね』
「ここにも同じコードを書くのは無駄だから、エラー処理を外のメンバ関数
として作ることにします。他の部分でもエラー処理が必要になるかもしれな
いしね」
『へー、そういうことできるんだ』
「同じ部分は関数にまとめる、それが基本。プログラムがすっきりして見や
すくなるし、間違いを直すのも１ヶ所だけで済むからね」
『そりゃそうよねー、同じとこいっぱいあったら全部直さなきゃ行けないも
んね』
「ではまず、メンバ関数を作ってみましょう。今までは〈あるイベントに対
応するメンバ関数〉しか作ってこなかったけど」
『 CFileTestDlg::OnBtnShow() がそうだね』
「もちろん普通のメンバ関数も作れます。ワークスペースの【Class View】
を見て」
『ワークスペースってリソースとかソースファイルとか色々載ってるのだよ
ね。そのクラスのっと』
「 CAboutDlg とか CFileTestApp とかあるでしょ」
『 CFileTestDlg もね。このクラスにメンバ関数付けるんだよね』
「そう、 CFileTestDlg::OnBtnShow() から呼び出すから同じクラスにしま
す。この【Class View】で CFileTestDlg を右クリックして、メニューか
ら【メンバ関数の追加】を選んで」
『ダイアログ出たよ』
「【関数の型】はメンバ関数の戻り値のこと」
『 void でいい？』
「ホントはこういうのはちゃんと考えなきゃいけないんだけど、考えたくな
い時は bool で」
『なんで？』
「ちょっとエラーを返したい時とかに便利だから」
『あー』
「【関数の宣言】はメンバ関数の名前と引数。こんな感じにして」

    MessageError( unsigned int p_puiID )

『 unsigned int の引数？』
「 IDS_E_NOFILE とかの ID を引数に渡すから」
『あー』
「 unsigned なのは ID だから。 ID は符号なしだからね」
『他は？』
「【アクセス制御】は Private にしといて。これはちょっと難しいから説
明は結構あとで。これで完了」
『んじゃ OK っと』
「こんなのが CFileTestDlg::OnBtnShow() の下にできたと思うよ」

bool CFileTestDlg::MessageError(unsigned int p_puiID)
{

}

『おおっ、メンバ関数！』
「ではさっきのエラー処理の部分を書き込んで、ちょっと手直ししてこんな
感じに」

bool CFileTestDlg::MessageError(unsigned int p_puiID)
{
    const unsigned int iIDOffset = 1000;
    CString cStr;
    cStr.LoadString( p_puiID );
    CString cStrCap;
    cStrCap.LoadString( p_puiID + iIDOffset );
    MessageBox
        ( cStr, cStrCap
        , MB_OK | MB_ICONEXCLAMATION );
    return true;
}

『えーっと、違うところは…… iIDOffset 作ってるとこが最初に来てるね』
「別に最初じゃなくてもいいんだけど、これは気分で」
『その方が見やすいもんね。あと CString::LoadString() に渡してるのが
IDS_E_NOFILE から p_puiID になってるね』
「つまり引数として渡された値を ID としてエラーメッセージを取り出すっ
てこと。そして、呼び出す側はこうなります」

    if( cIFStrm.fail() )
    {
        MessageError( IDS_E_NOFILE );
        return;
    }

『うおすっきり！』
「とりあえず試してみて」
『ビルドして実行して【表示】ボタン！　うんちゃんとさっきと同じダイア
ログが出た』
「こういうふうに関数にまとめるの、めんどくさがっちゃダメだからね」
『分かってるよー、後から直すときとか大変なんだもんね。次は？』
「じゃ、後半の while に移ろうか。まず」

            TRACE( "整数値じゃないです\n" );

「を今の関数に置き換えちゃおうか」
『そだねー。えーっと、まずストリングテーブルに追加しないと』

IDS_E_NONINT=202 : 整数値じゃないです
IDS_E_NONINT_C=1202 : 整数値じゃないです

『でいい？』
「うーん…… IDS_E_NONINT の方は〈ファイル中に整数値以外のデータが含
まれています。\nファイルを確認してください〉の方がいいかな」
『あ、複数行 OK なんだ。改行には \n を使うんだね』
「直接書き込むときには、改行は」
『リターンキー押すとダイアログが消えちゃう！』
「から、 Ctrl キーを押しながらリターンキーを押せば」
『改行された！』
「これでも改行できるし、 \n でもできるから」
『じゃー前回の〈ファイルがありません〉もそうした方がいいかな』
「そうだね、だからまとめると」

IDS_E_NOFILE=201
 : ファイルが見つかりませんでした。
 \nファイル名を確認してください。
IDS_E_NOFILE_C=1201 : ファイルがありません
IDS_E_NONINT=202
 : ファイル中に整数値以外のデータが含まれています。
 \nファイルを確認してください
IDS_E_NONINT_C=1202 : 整数値じゃありません

「ってとこかな。まー実際、この文だけじゃ分かりにくいんだけどね、使っ
てる側からすれば」
『そだね、なんかでフォローしないと』
「じゃ、呼び出す部分は？」
『 ID を変えればいいだけだから』

            MessageError( IDS_E_NONINT );

「だね。じゃ、今回最後は char chDest[256] について。そうだね、とりあ
えず試してみようか。 while のあとに次の行追加して」

    } // while の区間を閉じる中カッコ。
    TRACE( "%s\n", chDest );    // この行を追加。
} // CFileTestDlg::OnBtnShow() を閉じる中カッコ。

『あ、 chDest を表示するのだね。んじゃビルドして』

error C2065: 'chDest' : 定義されていない識別子です。

『げ！　エラーになっちゃった』
「 chDest って while の中で宣言してるでしょ。実は、この chDest の寿
命はこの while のあとの中カッコの中だけなんです」
『どゆこと？』
「 Ver 4.13 ( No.063 ) で〈変数の寿命〉を教えたでしょ」
『うん、関数抜けたら変数がなくなっちゃうってゆーの』
「実は、正確に言うと〈関数から抜けたら〉じゃないんです」
『え、そうだったの？』
「正確には〈対応する { と } から抜けたら〉」
『だから while の中カッコから抜けたら chDest がなくなってるんだ！』
「 { が複数回ある場合には、対応する } が来たら変数消える仕組み」
『つまり関数じゃなくて { } で考えればいいんだよね。っつーかインデン
トで考えればいいってゆーか』
「そだね、インデントする範囲って考えてもいいかも。ちなみに { } で囲
まれた区域を【ネスト】っていいます」
『ねすと？』
「〈何かの中に何かを入れる〉っていう意味。 while とか for とかのも、
ネストだからね」
『そういえば〈ネストが深い〉とかよくゆーもんね』
「もひとつ用語言うと、変数が生きてる範囲を【スコープ】っていいます」
『すこーぷ？　あの銃とかに付いてる』
「それボケじゃなくて当たり。上の例で chDest がなくなっちゃってたら使
えないでしょ」
『うん使えない』
「ってことは〈見えない〉」
『あー、そういう意味でスコープなんだ。あ、それって、他の関数から変数
使えないのと同じ？』
「そう同じ。というわけで、ネストとスコープ、そして変数の寿命、その辺
を踏まえると、 chDest は while の前で宣言した方がいいことになるよね」
『どーして？』
「それは宿題」
『げげ！』

/*
    Preview Next Story!
*/
『宿題ってゆーより、スペースがたんなくなったんでしょ』
「っていうか、ブラッシュアップでこんなに量がかかるなんて」
『でもさ、この前も言ってたけど、こういうの本に載ってないよね』
「なんだよね、絶対必要な技術だと思うんだけど……」
『というわけで次回』
＜ Version 5.21 ファイル読み込みをさらにさらにブラッシュアップ！ ＞
「につづく！」
『もしかしてほとんどのプログラマーはこゆことしてないんじゃない？』
「あ、ありうる……」


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

・Codian に iomstream を追加
　 STL & iostream 入門から Codian に iostream を追加します！
　今回は #11 から #14 、ファイル入出力をお届けします。
[ Codian ]
http://www.kab-studio.com/Programing/Codian/
[ STL & iostream 入門 ]
http://www.kab-studio.com/Programing/STLiostream/

/*                          ご注意！！                            */

・このメールを返信しないでください。
・ご意見・ご希望・ご感想は[チョー普通な日記]よりお送りください。
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://bigbeat.tegami.com/~mgsearch/frame.cgi?id=0000012198
http://www.kab-studio.com/Freeware/

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

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


/*                      See you next week!!                      */


