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

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

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

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

・プログラミング辞書受付再開
　プログラミング辞書の単語受付を再開します！　この２週間の間に就職前
研修があって知らない単語が出てきたそこのあなた！　
いまこそ送り時！（？）

[ プログラミング辞書 ]
http://www.kab-studio.com/Programing/Dictionary/


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

2000/11/19 (Sun)
　ゼミ発表用資料作成のためにネットサーフィンしつつ、ときメモファンド
の話とか、ねすけ６に困ってしまった話などなんか盛りだくさんですよ？

2000/11/20 (Mon)
　ゼミ第２回卒業研究中間発表！！　そのとき紹介したホームページへのリ
ンク集もあるよん。そしてクラゲ！　には出逢えず（泣）。そして久々の４
択。今回はおたく専用（爆）。

2000/11/21 (Tue)
　のんびり〜。パスネットのエラー。そしてクラゲ来襲！　やっとこさクラ
ゲに出逢えましたよ〜。あとヒット数激増（汗）。

2000/11/22 (Wed)
　就職前研修を急遽やった他は、のんびりモード。しかし！　この日に
Ｎスペ世紀を越えて Linux を見たことが、のちにあのような悲劇をもたら
すことになろうとは、まったくもって知る由がなかったのである！！

2000/11/23 (Thu)
　就職前研修（出向）４日目、 UNIX の前半。いきなり Ｎスペ世紀を越え
て Linux を見させられる（泣）。昨日見たビデオを今日見ることになろう
とは……。あと cp や mv でファイル移動の練習。帰ってからはギルティギ
アの練習（爆）。

2000/11/24 (Fri)
　就職前研修（出向）５日目（最終日）、 UNIX の後半。 vi 使ってただひ
たすら文章の打ち込み（泣）。超高速入力のために最適化された我が家のデ
スクトップ環境に慣れた身としては、これは辛すぎる……。あと爆オンの本
購入。

2000/11/25 (Sat)
　うちのガッコは大学祭真っ最中！　そんな中ゼミの発表会で花束を受け取
りにいったりＯＢ会にいったりと、ここ２日の疲れが残っててちょっときつ
い（汗）。


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

2000/11/19 (Sun)
お休み

2000/11/20 (Mon)
お休み

2000/11/21 (Tue)
C マガジンの Kylix
Win32 API でのダイアログテンプレートに当たるものはあるのか
API 呼び出し時に位置やサイズのハードコーディングは生産性悪い
XUL が使えたら？

2000/11/22 (Wed)
就職前研修（ CD-ROM ）
設計重視でそれほど悪くないかも
提出プログラムは C で簡単に
変数名を m とか n にしないで

2000/11/23 (Thu)
お休み……？

2000/11/24 (Fri)
就職前研修（出向）で UNIX でシェルスクリプトを組む
自由度が高い
最初に触れちゃいけないかも

2000/11/25 (Sat)
お休み



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

・今週の状況：
　というわけで単語受付を再開しました！　みなさんげしげし送ってくださ
い。実際、いつまた休止になるとも限らないわけで……。


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

テンプレート
#04 テンプレート引数の指定

　#02 で言った通り、

template< class 
    type_numeral // テンプレート引数。
>
type_numeral Increment( 
    type_numeral // 引数の型名。
p_num )

　の type_numeral を「テンプレート引数」っていいます。このテンプレー
ト引数がどんな型になることもできるから、テンプレートは様々な型に対応
することができるわけ。
　関数テンプレートのテンプレート引数は、基本的には「自動的に」型が決
定されます。普通、テンプレート引数は関数の引数としてしていするから、
渡された引数によって自動的に「テンプレート引数が置き換えられる型」が
決定されます。
　たとえば、この関数テンプレート Increment() を呼び出す場合、

    Increment( 100 );

　ってすれば type_numeral は自動的に int に置き換えられ、それから
Increment() がインスタンス化されます。
　同じように、

    Increment( 5.5 );

　って呼び出せば type_numeral は自動的に double に置き換えられ、それ
から Increment() がインスタンス化されます。
　こうじゃなく、テンプレート引数を明示的に決める方法もあります。これ
は、関数テンプレートを呼び出すときに、関数名の後に < 型 > と付けるこ
とでできます。

    Increment< int >( 5.5 );

　こうすると、 type_numeral は int に置き換えられます。この場合、引
数の型は int なので、 5.5 は int にキャストされてから引数に渡される
ことになります。次回はテンプレート引数の細々とした部分について。じゃ
ね。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『辞書がいつ終わるか分かんないって、どゆこと？』
「辞書って見た目よりも書く負担大きいみたいだね」
『だから忙しくなると休止しちゃうんだ』
「でも、人気あるページを最初に休止っていうのもどうかと思うけどね」
『そうよ！　まず日記とかから休めばいーじゃん』
「ま、無料だから強く言えない部分もあるんだろうけどね」
『じゃーあたし１万円寄付するからコンテンツをプログラムだけにして！』
「どっかで聞いた話だなぁ……」
『実際そう言う人がいたらどうするのかな』
「どうするのかなぁ……」
http://www.kab-studio.com/Programing/Dictionary/
_______________________________________________________________[KCM]


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


　Version 5.19
ファイル読み込みをブラッシュアップ！

「前回までで、ファイル入出力は、どんなライブラリを使ってても結局は
API を使っている、ってことが分かったと思います」
『うん、かなり分かった。ライブラリは謎な存在じゃないってことよね』
「そゆこと。では話を戻しましょう。ファイル入出力は結局は iostream を
使うのが一番楽」
『確かにね、なんだっけ、書式化って言うんだっけ、数字を文字列に変換し
たりとかしてくれるし、閉じるのも自動的だし』
「というわけで、 Ver 5.10 ( No.075 ) の最後に作ったのがこれ」

void CFileTestDlg::OnBtnShow() 
{
    int i;
    std::ifstream cIFStrm;
    cIFStrm.open( "Data.txt" );
    if( cIFStrm.fail() )
    {
        TRACE( "ファイルがない！\n" );
        return;
    }

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

『これずっととっといたんだもんね』
「で、今回はこれをブラッシュアップします」
『ブラッシュアップって、無駄なとこ取り除いてもっと良くするんだよね。
でもそんな悪いとこある？』
「あるよー。とりあえず実行して、【表示】ボタンを２度押してみて」
『ほいほい。あら、最初のが消えてない』
「 CListBox::AddString() は単に追加するだけだから、前のが残ってるん
だよね」
『あと表示が 100 100 200 200 300 300 ってなってる』
「あー、ソートされてるんだね」
『ソート？』
「フォルダとかは〈名前順〉とかで並べられるでしょ。ああいうふうに並べ
ることを〈ソート〉って言います」
『ほほう。これってソートしない方がいいよね』
「そうだね、ファイルの中身そのまま表示するって仕様にしようか」
『……しゃれ？』
「リソースエディタでダイアログ開いて」
『無視かい。 IDD_FILETEST_DIALOG をダブルクリックっと』
「リストボックスのプロパティを変更して」
『右クリックから【プロパティ】っと』
「【スタイル】のページに」
『【ソート】があった！　このチェックを外せばいいんだね』
「そ。……ソートがデフォルトなんだな」
『実行して【表示】を２回、今度は 100 200 300 100 200 300 だね』
「次は２重表示しないようにしましょう。どうすればいいと思う？」
『追加する前にリストボックスの中身、空にしちゃえばいいんじゃない？』
「当たり。そんじゃやってみて」
『げげ！　えーっと、リストボックスの操作は m_cDataLstBox のメンバ関
数使えばいいんだよね、 AddString() だってそうなんだから』
「そうそう」
『じゃ、 MSDN で……』
「 m_cDataLstBox は CListBox クラスの変数」
『そうそう、 CListBox クラスメンバを表示して…… ResetContent() と見
た！』
「じゃあ使ってみましょう」
『んーと、追加する前に空にするんだから……最初で呼び出してみようかな。
m_cDataLstBox. ってやって、んでこのメンバ関数の ResetContent っと』
「そして？」
『引数はなし、戻り値なし、だから』

    m_cDataLstBox.ResetContent();

『って感じかな。ビルドして実行、【表示】ｘ２、よし２重表示されない！』
「ＯＫ！　MFC の基本的な使い方は大丈夫みたいだね」
『まかせてよーん』
「さて次。この部分をなんとかしましょう」

        TRACE( "ファイルがない！\n" );

『エラー処理の部分だね』
「 TRACE() は Visual C++ のアウトプットウィンドウに表示するだけだか
ら、これは製品じゃ使えないよね」
『つまり〈ファイルがありません〉って……たとえばダイアログとかで？』
「そうだね、やっぱりダイアログで伝えるのが一番楽かな。ダイアログを表
示するにはどうすればいい？」
『なんかメンバ関数使うんだよね……あ、 MessageBox() だ！』
「昔何度も使ったね」
『昔って……』
「とりあえずこの TRACE() を置き換えてみて」
『ほーい。 MSDN で……あれ、どれを選べばいいんだっけ』
「 OnBtnShow() は CFileTestDlg クラスのメンバ関数。 CFileTestDlg の
親クラスは？」
『 CDialog 、だよね。 FileTestDlg.h にそう書いてあるもん。あ、それで
CDialog は CWnd から継承してるから、 CWnd のメンバ関数は全部使えるん
だよね』
「そういうこと。だから CWnd::MessageBox() を使えばいいわけ」
『そゆことね。 MSDN のを見ると、第１引数がその文章だよね、第２引数は
キャプション、ってことはタイトルで、第３引数がアイコンだよね』  
「ってゆーか Ver 2.11 ( No.022 ) で使ってるんだから」
『そっか、それ見つつ書くと……』

        MessageBox
            ( "ファイルが見つかりませんでした。"
            , "ファイルがありません"
            , MB_OK | MB_ICONEXCLAMATION );

『って感じかな。ビルドして実行して【表示】ボタン！　……あれ？』
「ファイル名間違えさせないと」
『そだ。閉じて、 "Data.txt" を "_Data.txt" にして同じよーに【表示】
ボタン！　うおダイアログ出た！』
「では次の段階。 " " で囲まれた文字列は直接プログラム上に書いちゃダ
メって言ったの憶えてる？」
『なんとなーく』
「そこで〈ストリングテーブル〉を使います。 Ver 3.16 ( No.041 ) を読
み返して」
『そっか、プログラムに直接書くと見つけにくいとかいろいろ問題あるんだ
ね。えーっと、ストリングテーブルはリソースの String Table ね』
「空欄をダブルクリックして新しく追加して」
『 ID とかどーすんの？』
「 ID は IDS_E_NOFILE=201 、キャプションはもちろん〈ファイルが見つか
りませんでした。〉」
『 IDS_E_NOFILE=201 って？』
「 IDS_E_NOFILE が ID の名前」
『 S は String で E は Error ね』
「で、リソース ID は基本的に単なる整数値。あ、これは見た方が早いか。
resource.h ってファイルを開いてみて」
『メニューの【開く】でっと……あ！』

#define IDM_ABOUTBOX                    0x0010

『この #define って定数作るときに使うのだ！』
「そ、 Ver 4.09 ( No.059 ) でやったね。こんなふうに、 ID は全部定数」
『あ、 IDS_E_NOFILE=201 って〈この ID は 201 って定数に〉って設定し
てるんだ』
「そゆこと。 Ver 3.14 ( No.039 ) でもやってるから見てみて」
『んでリソース作って、そしたら CString::LoadString() ってメンバ関数
で読み込むんだね』
「そういうこと。このメンバ関数に ID を渡せばいいわけだから？」
『こんな感じかな』

        CString cStr;
        cStr.LoadString( IDS_E_NOFILE );

『あう、でも cStr をどう MessageBox() に渡せばいいの？』
「あ、これはそのまま渡しちゃってＯＫ」

        MessageBox
            ( cStr
            , "ファイルがありません"
            , MB_OK | MB_ICONEXCLAMATION );

『えええっ！？』
「これは近いうちにちゃんとした方がいいかもね。簡単に説明すると、
CString は LPCTSTR にはそのまま渡せるような仕組みになってるから」
『あ、その言い回しは〈クラスの機能〉ってヤツ？』
「そゆこと。 CString はクラスだからそういう便利な機能が付いてるわけ。
んじゃタイトルの方もリソースにしちゃいましょう」
『はーい』
「っと、 ID は IDS_E_NOFILE_C=1201 にして」
『あれ、かなりおっきな数だね』
「こういうふうにすると楽だからね」

        const unsigned int iIDOffset = 1000;
        CString cStrCap;
        cStrCap.LoadString( IDS_E_NOFILE + iIDOffset );

『んんん？』
「 IDS_E_NOFILE だよ、 IDS_E_NOFILE_C じゃないからね」
『あー！　さっきの本文の方の ID なんだ、それに 1000 足すとタイトルの
になるようにするのね』
「エラーダイアログの本文とタイトルは一対だからね。別々に指定すると
どっかで間違えちゃうから」
『そーゆーテクニックって必要？』
「必要。趣味でのプログラムならいいけど、公開するならミスしないようで
きるだけ気を付けなきゃいけないからね」
『ま、確かに』
「じゃ、エラー処理の部分はこうなります」

    if( cIFStrm.fail() )
    {
        CString cStr;
        cStr.LoadString( IDS_E_NOFILE );
        const unsigned int iIDOffset = 1000;
        CString cStrCap;
        cStrCap.LoadString( IDS_E_NOFILE + iIDOffset );
        MessageBox
            ( cStr, cStrCap
            , MB_OK | MB_ICONEXCLAMATION );
        return;
    }

『うお、なんか長い！』
「というわけで、次回はさらにブラッシュアップします」

/*
    Preview Next Story!
*/
『水希ちゃんが教えるのって細々としたテクニック多いよね』
「僕はこれが一番大事だと思うんだけどね」
『一番大事？』
「そう、一番大事。なのに本に書いてあること少ないんだよね……」
『というわけで次回』
＜ Version 5.20 ファイル読み込みをさらにブラッシュアップ！ ＞
「につづく！」
『細々としたことばっかだから長くなっちゃうのねー』
「大事なことで長くなるならよし！」
『うお強気！』


/*              ２０００年１２月４日（月）の更新予定              */
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/


/*                          ご注意！！                            */

・このメールを返信しないでください。
・ご意見・ご希望・ご感想は[チョー普通な日記]よりお送りください。
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!!                      */


