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

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

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

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

・リンクを追加
　リンクのページにリンクを追加しました。今回追加したのは 
Takushi's Creative Workshop 。エディタの作り方が載ってます！
[ リンク ]
http://www.kab-studio.com/Info/Link/
[ Takushi's Creative Workshop ]
http://www.mambo.kuhp.kyoto-u.ac.jp/~miyoshi/


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

・Codian にページを追加
　 Codian にページを追加します。今回は STL & iostream 入門から STL 
の #22 - #24 を追加。
[ Codian ]
http://www.kab-studio.com/Programing/Codian/
[ STL & iostream 入門 ]
http://www.kab-studio.com/Programing/STLiostream/

・リンクを手直し
　リンクのページを手直ししました。デッドリンクの削除やリンク先の変更
をしました。不都合のある方はメールにて。
[ リンク ]
http://www.kab-studio.com/Info/Link/


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

2001/03/03 (Sat)
　旅行前日！　とにかく就職前で忙しい時に旅行とかで結構てんてこまい状
態なのですよ。その辺とかぶゆ〜休止の関連とかなんとか。

2001/03/04 (Sun)
（旅行中！）

2001/03/05 (Mon)
（旅行中！）

2001/03/06 (Tue)
（旅行中！）

2001/03/07 (Wed)
　沖縄旅行から帰ってきた！　三日間の詳細をデジカメ写真付きで掲載！　
のんびりゆったり、沖縄の歩き方を参考にしてねん。あとはリンクの追加と
かぶスタ再構築の話。

2001/03/08 (Thu)
　大ダビング大会！　１本のテープにタイマー録画したのを各テープに仕分
け作業するのですよ。そしてついでに見たアニメとかとか。でもクロ現につ
いてが一番長いな(汗)。

2001/03/09 (Fri)
　リンクページ手直しして本屋行ってメルマガ書いてゲームして、しかし！
それはすべて引っ越し関連のストレスから逃避するためだったのである！！
たぶん。

2001/03/10 (Sat)
　スーツを買った。８０００円だった(爆)。革靴を買った。８８００円だっ
た(爆)。現在就職＆引っ越しモードでてんてこ舞い？


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

2001/03/03 (Sat)
#pragma twice と金菜さんの憂鬱を執筆
金菜さんの憂鬱は１００号で終了予定
ネタがないし、コンパイルチェックがちょっと大変
鏑矢の憂鬱も近々……

2001/03/04 (Sun)
（旅行中につき休止）

2001/03/05 (Mon)
（旅行中につき休止）

2001/03/06 (Tue)
（旅行中につき休止）

2001/03/07 (Wed)
旅行中に送られてきたお便り
COM はどうやって作る？
直に作るのは大変そう
「プロジェクトの新規作成」で 
ATL COM AppWizard か MFC ActiveX ControlWizard 
直に作るなら Inside COM を読むとか
でももう COM の時代じゃないかも……
お便り
XML のサーチが遅すぎるのを何とかするには？
DOM を使っているのならなら SAX にした方がいいかも
まずメーカー別とかに分けて検索時に選ぶようにするとか
根治療法は CGI 
鏑矢の憂鬱はとりあえず休止します

2001/03/08 (Thu)
この「鏑矢の憂鬱」は、今月の１６日（金）の分で休止状態に
プログラミング辞書は２１日（水）午後１１時に単語受付を休止
１９日（月）には KTL 、 KCL9542 、 まどかぶ、けしかぶを削除
この４つのダウンロードは引き続きできるように
融通はある程度効くので

2001/03/09 (Fri)
お便り
休止は残念
大きな文字列を操作する方法は？
CString は大きな文字列を操作するのに向いていない
std::string がいいかも
CString を１行ずつとか
new で大きく確保してとか
以降の入力は「ログ」として取っていくとか
以降の入力は「ログ」として取ってもいい

2001/03/10 (Sat)
お休み



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

・追加単語：
あいまい 印刷 キー グループID プリコンパイル マップ 

・今週の状況：
　お、今回は結構多いですね。ですが！　このメルマガの最後の方で書いて
るように、単語の受付は２１日(水)をもって休止状態にします。っつーこと
はこのコーナーもあと２回ですな。「この単語がない！」っていうのがあれ
ばお早めに〜。


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

テンプレート
#18 テンプレートをいつ使うか

　テンプレートそのものは STL とかにいっぱいあるから、使うのは結構簡
単だと思うんだけど、作るとなると結構大変かも。
　たぶん一番大変なのは、どの関数やクラスでテンプレートを使うか、って
こと。テンプレート化するってことは、ある型をどんな型にしてもいいって
ことで、でも普通そういうクラスや関数ってそんなに作らないでしょ。だか
らテンプレートそのものを作る必要がないのよね。

　そこで、まずはふたつのアプローチを勧めます。
　ひとつは、元々あるテンプレートクラスを真似る方法。まったく同じクラ
スを作ってみるのもいいし、関数テンプレートのテンプレート引数を減らす
ために新たな関数テンプレートを作ってその中から呼び出させるとか、ほと
んど真似るっていうもの。
　とにかく、テンプレートって普通のコーディング方法と違うから、それに
慣れることがまずは大事かな。 template< > から始めて、型をテンプレー
ト引数に置き換えて、っていうのにまず慣れた方がいいかも。

　もうひとつは、ポリモーフィズムの変わりに使う方法。ポリモーフィズム
は、ある基底クラスのメンバ関数を呼び出すと、派生クラスのどのメンバ関
数が呼ばれるか分かんないでしょ。テンプレートを使うとそれに似たことが
できます。
　テンプレート引数型の変数を作って、そこからメンバ関数を呼び出させま
す。そうすれば、そのメンバ関数を持つ型ならどんな型でも渡すことができ
るでしょ。
　この使い道は結構あると思うんだけど。ライブラリとして作ってると同じ
名前のメンバ関数を持つクラスって多くなると思うから。そういうのを汎用
的に呼び出せるから、そういうことをしたい場合に使えるかな。それに、こ
の方法なら、メンバ関数だけじゃなく、メンバ変数や型メンバでも使えるし
ね。

　これを足がかりに、組込型を使っている部分をテンプレート引数にしてみ
ましょう。なぜかっていうと、組込型に演算子を使っている部分は、上のポ
リモーフィズム的な使い方と同じだから。初めは「すべての型で」とか考え
なくて、 int と double だけみたいに限定して考えて、そのどちらでも使
えるみたいに考えていけばいいかな。
　逆に、あるひとつの組込型専用に作っておいて、その組込型と同じように
機能するクラスも作れば、どっちもテンプレート引数に使えるでしょ。こう
いう使い道にもテンプレートは使えるんです。テンプレートは単なる置き換
え、それにコンパイル時にチェックされるんだし、気軽に使い始めることが
大事かもね。次回はテンプレートの制作例について。じゃね。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『とうとう休止モードね〜』
「でも単純に考えると、毎週この文章量って」
『暇人のなせる業よね』
「確かに……」
『ねー、 KAB-studio.h の .h って、ヘッダーファイルって意味でしょ？』
「そうだね」
『って事はこのメルマガからプログラミングの記事が減ったら』
「……名前変える？」
『新名称、募集しよ！！』
「そういうの募集して、送られてきた試し、ないんだよね……」
http://www.kab-studio.com/
_______________________________________________________________[KCM]


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

　Version 5.33
仕様を考えてさらに使いやすく！

「まとめがてら、ここまでのコードを見ておきましょう」

void CFileTestDlg::OnBtnBrowse() 
{
    CFileDialog cFileDlg( TRUE );
    char chPath[MAX_PATH];
    GetModuleFileName
        ( AfxGetInstanceHandle(), chPath, MAX_PATH - 1 );
    cFileDlg.m_ofn.lpstrInitialDir = chPath;

    int iRes
        = cFileDlg.DoModal();
    if( iRes == IDCANCEL )
    {
        return;
    }

    m_cFileCmbBox.SetWindowText( cFileDlg.GetPathName() );

    int iNo
        = m_cFileCmbBox.FindString( -1,  cFileDlg.GetPathName() );
    if( iNo != CB_ERR )
    {
        m_cFileCmbBox.DeleteString( iNo );
    }
    m_cFileCmbBox.InsertString( 0, cFileDlg.GetPathName() );
}

『これが【参照】ボタンを押したときのね。でもホントはこれじゃない方が
いいんだよね』
「そう、前回決めた仕様じゃ【表示】ボタンを押したときってことにしてた
からね。その【表示】ボタンを押したときのメンバ関数は……」

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

    char chPath[MAX_PATH];
    m_cFileCmbBox.GetWindowText( chPath, MAX_PATH - 1 );
    std::ifstream cIFStrm;
    cIFStrm.open( chPath );
    if( cIFStrm.fail() )
    {
        MessageError( IDS_E_NOFILE );
        return;
    }
// 以下略。

『あれ、そういえばファイル名って CWnd::GetWindowText() でコンボボッ
クスから取ってるんだね。ってことは今のままでも動くの？』
「動くよ、ちゃんと」
『んじゃ【参照】で色々ファイル集めて、【表示】すると……エラー。んで 
Data.txt をリストから選んで【表示】……おおっちゃんと出た！！』
「基本的な機能はこれで大丈夫だね」
『……ねー、リストへの追加って【参照】ボタン押したとき、でいいんじゃ
ない？』
「横着しないの。このコンボボックス、普通にパスを打ち込めるでしょ」
『あ、そういうのがリストに追加されなくなっちゃうね』
「それに、その打ち込んだパスが間違ってたらリストに載せない方がいいで
しょ」
『ってことは、 if( cIFStrm.fail() ) が通ってから追加した方が良さそう
だね』
「それじゃ早速」
『 CFileTestDlg::OnBtnBrowse() の中でコンボボックスに追加してるのは 
CComboBox::FindString() 呼んでるとこからだから、それをカット＆ペース
トっと』

void CFileTestDlg::OnBtnShow() 
{
// 略。
        return;
    }

    int iNo
        = m_cFileCmbBox.FindString( -1,  cFileDlg.GetPathName() );
    if( iNo != CB_ERR )
    {
        m_cFileCmbBox.DeleteString( iNo );
    }
    m_cFileCmbBox.InsertString( 0, cFileDlg.GetPathName() );
// 以下略。

『ビルドして……あれ？　エラーになっちゃった cFileDlg がないって言わ
れてるのかな』
「実際にないでしょうが」
『あ、そっか、 cFileDlg は CFileTestDlg::OnBtnBrowse() の中の変数だ
もんね。あれ、でもこの変数からファイルパス取得してたんだよね、じゃあ
どうすればいいの？？』
「混乱しないの！　今の状態だと、 CFileTestDlg::OnBtnBrowse() の最後
でしてるのは？」
『 CWnd::SetWindowText() でコンボボックスに貼り付けてる……あ、そっ
か、そのコンボボックスからもらえばいいんだ』
「そゆこと。で、それをもう CFileTestDlg::OnBtnShow() の最初の方でし
てるでしょ」
『ホントだ！　ってことは chPath に入ってるんだね。だから……』

void CFileTestDlg::OnBtnShow() 
{
// 略。
    int iNo
        = m_cFileCmbBox.FindString( -1,  chPath );
    if( iNo != CB_ERR )
    {
        m_cFileCmbBox.DeleteString( iNo );
    }
    m_cFileCmbBox.InsertString( 0, chPath );
// 以下略。

『ビルド！！　おおっ通った！！　んで実行っと。うん、【表示】ボタンを
押したときに追加される！』
「これでかなりしっかりした感じになったね」
『あれ……なんか？』
「どしたの？」
『んー、全然関係ないファイルを開くと【整数値が含まれていません】にな
るけど、こういう時に追加するのっていいのかな』
「この辺は微妙なとこだね。理想は設定で変えられるようにすることかな」
『もひとつ、リストの中から選んで【表示】させると、コンボボックスが空
欄になっちゃうんだけど』
「あ、ホントだ。これはほら、リストにすでにある場合にはリストから削除
して挿入してたでしょ、あれでたぶん」
『なんかちょっと見栄え悪いよね』
「なら追加しちゃうとか」

void CFileTestDlg::OnBtnShow() 
{
// 略。
    m_cFileCmbBox.InsertString( 0, chPath );
    m_cFileCmbBox.SetWindowText( chPath );    // ここだけ追加。
// 以下略。

『あ、そういうのアリなんだ！』
「もちろん。あーでも、他の方法もあるのかもなー」
『なんか適当……』
「あと……もうふたつほど。まず履歴の数」
『そういえば、普通１０個くらいだよね。じゃあ１０個超えたら一番最後の
を削除しちゃうとか』
「うん、それしてみて」
『リストの中の数を調べるのは…… GetCount() っぽいから、これを if し
て 11 の時に DeleteString() で 11 番目を』
「 0 から始まるから……」
『 DeleteString() には 10 を渡せばいいんでしょ？　そのくらい分かって
るよー』

void CFileTestDlg::OnBtnShow() 
{
// 略。
    m_cFileCmbBox.InsertString( 0, chPath );
    m_cFileCmbBox.SetWindowText( chPath );
    if( m_cFileCmbBox.GetCount() == 11 )
    {
        m_cFileCmbBox.DeleteString( 10 );
    }
// 以下略。

『ううっ、テストがめんどい……』
「テストするときは少ない数字の方がいいかも」
『そういうことは早く言ってよ！』
「あと整数値は……」
『そうだ！　 const int しなきゃね。あとで 11 を 21 に変えたりするの
大変だもの』
「ま、それは今回はいいや。火美ちゃんは分かってるんだし。あともうひと
つの問題点は【参照】のフォルダかな」
『そういえば、今はアプリのフォルダなんだよね』
「でもそれじゃ不親切でしょ」
『不親切！　全然違うとこのファイルを開いたら、やっぱ次もそのフォルダ
開きたいよね』
「どうすればいいと思う？」
『えーっと……最初に開くフォルダは cFileDlg.m_ofn.lpstrInitialDir で
決まるんだよね』
「そう、そこに GetModuleFileName() で取得したパスを使ってたから」
『アプリのフォルダが開いてたんだよね』
「で、前回開いたファイルのパスはどこに書き込まれてる？」
『……コンボボックス！　ってことは CWnd::GetWindowText() でコンボボッ
クスから拾って……』
「たぶんこんな感じになると思うよ」

void CFileTestDlg::OnBtnBrowse() 
{
    CFileDialog cFileDlg( TRUE );
    char chPath[MAX_PATH];
// ここから下を改変。
    m_cFileCmbBox.GetWindowText( chPath, MAX_PATH - 1 );
    if( chPath[0] == '\0' )
    {
        GetModuleFileName
            ( AfxGetInstanceHandle(), chPath, MAX_PATH - 1 );
    }
// ここまで改変。
    cFileDlg.m_ofn.lpstrInitialDir = chPath;

    int iRes
        = cFileDlg.DoModal();
    if( iRes == IDCANCEL )
    {
        return;
    }

    m_cFileCmbBox.SetWindowText( cFileDlg.GetPathName() );
}

『 GetWindowText() のはいつものヤツね』
「元々 chPath っていうのがあるんだから、それを利用してってことで」
『 if( chPath[0] == '\0' ) は……文字列が空かどうかってこと？』
「そ。一番最初の時とか、コンボボックスに何も書き込まれてないならアプ
リのフォルダを開くように。こういうふうに、最初に終端文字が来てるか調
べる方法もあるし、文字列の長さを調べる方法もあるかな」
『ランタイムの strlen() 使ってとか？』
「そゆこと。その戻り値が 0 なら、って感じにね」
『で……あんま変わってないよね』
「うん」
『……私がちょっと考えたのだと、結構膨らんじゃうなー』
「僕は chPath を使い回したからね。でも重要なのは分かり易さ。使い回し
て分かりにくくなるなら意味がないから」
『分かりやすさって？』
「変数の意味が変わらない、ってことかな」
『そっか、ファイルのパスってことは変わんないんだもんね』
「データの一時保存に利用しちゃうとかしないように心がけていれば、こう
いう使い回しはいいと思うよ」

/*
    Preview Next Story!
*/
『もうそろそろ完成じゃない？』
「あとレジストリまわり作れば完成だよ」
『レジストリ！　前やったね』
「この段階になると、いかに昔のこと憶えてるかが鍵かも」
『というわけで次回』
＜ Version 5.34 閉じる前にレジストリに ＞
「につづく！」
『あたしがメールで送られてきたとかも？』
「そういう設定、もう生かせないかも……」


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

・鏑矢の憂鬱、休止
　掲示板とは違う特殊な質問箱としておなじみの鏑矢の憂鬱を、１６日分の
配信を最後に休止します。質問のある方は今のうちに！
[ 鏑矢の憂鬱 ]
http://www.kab-studio.com/Programing/KabuU/


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

・人気のないページを削除
　最近人気がなく、更新予定もない KTL 、 KCL9542 、まどかぶ、けしかぶ
の各マニュアルページを削除します。ダウンロードファイルそのものは削除
しないから安心してください。
[ KTL ]
http://www.kab-studio.com/Programing/KTL/
[ KCL9542 ]
http://www.kab-studio.com/Programing/KABClassLib/
[ まどかぶ ]
http://www.kab-studio.com/Freeware/MadoKAB/
[ けしかぶ ]
http://www.kab-studio.com/Freeware/KesiKAB/


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

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


/*                          ご注意！！                            */

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


