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

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

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

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

・リンクを追加
　先週の話ですが、リンクのページにリンクを追加(？)しました。今回追加
したのは prototype 。かっこいいページです！
[ リンク ]
http://www.kab-studio.com/Info/Link/
[ prototype ]
http://www.sfc.keio.ac.jp/~t00278mk/


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

・鏑矢の憂鬱、休止
　掲示板とは違う特殊な質問箱としておなじみの鏑矢の憂鬱を、１６日分の
配信を最後に休止しました。これからは、なんか訊きたいことがあったら
チョー普通な日記の方で。
[ チョー普通な日記 ]
http://www.kab-studio.com/nikki2/


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

・人気のないページを削除
　最近人気がなく、更新予定もない KTL 、 KCL9542 、まどかぶ、けしかぶ
の各マニュアルページを削除します。ダウンロードファイルそのものは削除
しないから安心してください。

・ようこそのイラストを刷新！
　下の「各ページ削除」に伴い、KAB-studio へようこそ！のイラストを全
部新しくしました。火美ちゃんファンは必見？
[ KAB-studio へようこそ！ ]
http://www.kab-studio.com/Info/Intro/


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

2001/03/11 (Sun)
　イラスト描いたり HTML lint でチェックしたりショウガ入り紅茶でダイ
エットしたり Google Toolbar 試したりといつものようにちょっと違う日
常。

2001/03/12 (Mon)
　寮の悩み。勤務先が先に決まってたらなんの問題もなかったのに……。あ
とゲームブック風のようこそって、作り直すの辛いかも……。

2001/03/13 (Tue)
　そのようこそのイラストを全部描き直し！　でもやっぱ結構大変、まだ半
分……。そしてしその潤いが花粉症に無茶苦茶効いてる気がする！　これは
いいかもしんない。

2001/03/14 (Wed)
　寮の鍵をもらってきてカレーを食べて、５万円パソコンがなくなってて
エプダイにしようかなとか思いつつ祝３０万ヒット！　結構大台なのに、
なぜかホームページはリストラモード(汗)。

2001/03/15 (Thu)
　ようこそのイラストを描き上げる！　いいのもあれば悪いのも……。あと
ふたつほどイラスト追加するかも。ちょっとえっちぃの(爆)。

2001/03/16 (Fri)
　なにげにのんびりモード。ぷらとわ書いたり。そしてかぶゆ〜最終回。な
ぜ「鏑矢の憂鬱」とゆーのか、それはすべて金曜日が悪いのです(何が)。

2001/03/17 (Sat)
　引っ越しのためにテーブル買ったり座椅子買ったり。そしてハンターｘハ
ンターが次回最終回にショック(泣)。そして昨日のかぶゆ〜の返事(爆)。


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

2001/03/11 (Sun)
お便り
CStringArray のようなものを作ってひとつの CString と見せかける
new と delete を直接使って高速化
仕事は内容によって……

2001/03/12 (Mon)
お便り
stdlib.h の bsearch() の void * ってなに？
void * っていうのは「なんにでもなるポインタ」
サンプルコード
比較用関数を用意
ソート済みの配列を用意
bsearch() に見つけたい値へのポインタ、検索対象となる配列、
要素数、要素のサイズ、比較用関数を渡す
比較用関数が bsearch() から呼び出される
戻り値を指定通りに実装する必要がある
void * と比較用関数の仕組みでどんな要素の配列でも検索できる
お便り
CRichEditView で選択の背景色をシステムカラーにしたい
RichEdit20A から？
CRichEdViewEx というものがみつかった

2001/03/13 (Tue)
お便り
STL のエラー C4786 を #pragma warning でうまく取り除けない？
stdafx.h の最初に書けば大丈夫
std::pair がある utility をインクルードしても
コンパイルエラーが出ないのはテンプレートは使わなければ無視されるから
他の STL ヘッダーファイルとの兼ね合いかも
お便り
DeleteObject() で GDI オブジェクトが解放されないように見える？
Create と Delete は malloc() と free() の関係
SetWindowRgn() したのを DeleteObject() はまずそう
ハンドル＝ポインタだから
ハンドルはポインタの管理そのものだから結構大変

2001/03/14 (Wed)
<?xml ?> ヘッダはどう書き込めばいいんだろう
DOMDocument.loadXML() で文字列そのものを読み込むことができる
VBScript に慣れてないから難しい
お便り
#pragma warning うまくいった
休止したら質問はメールや日記の方でね

2001/03/15 (Thu)
お便り
テンプレートと friend 関数でリンクエラーが出るのはなぜ？
operator<<() をヘッダーファイルに置きましょう
インスタンス化されないからリンクできない
template class m<int>; でインスタンス化できてるのかも
お便り
<?xml ?> を書き込む方法
DomDocument.createProcessingInstruction() を使えばいい
ノードの追加前に DomDocument.createElement() の戻り値を 
DomDocument.documentElement に入れる必要がある
お便り
CRichEditView の文章が変更された場所を知るには？
EN_SELCHANGE がうまく機能してくれないんだけど？
フック掛けるかサブクラス化するのがいいかも
リッチエディットは使わない方がいいのかもしれない……

2001/03/16 (Fri)
今日が最終回
これまで何度も休止してるからやっぱ復活するかも
お便り
プリコンパイル済みヘッダーファイルがうまく働いてくれない？
インクルードや設定がうまくいってないかも
そのへんの整理
StdAfx.h で「不変なヘッダーファイル」をインクルードして 
StdAfx.cpp が「作成」、他のソースファイルは「使用」になっていれば
mainCRTStartup をどこかで見たような気が
記憶違いかも

（というわけで、「鏑矢の憂鬱」は無期休止状態に入りました。
これまでのご愛顧ありがとうございました。
またお目に掛かる日まで……。
っつーかこれからは日記読んでね(爆)）


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

・追加単語：
TPM キック ニューメリック

・今週の状況：
　今回は３単語。あ、でも XML と DOM を書き直したから５単語かな。
　とにかく！　辞書の単語受付は２１日(水)まで。皆さんお早めに！


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

テンプレート
#19 テンプレートの制作例

　テンプレートを使った例には、主にふたつの例があります。
　ひとつは「組込型操作タイプ」。テンプレート引数が組込型だと決めつけ
て、組込型に行える操作をするっていうもの。クラステンプレートなら、 
STL の std::vector や MFC の CArray とかのコンテナクラスがそう。関数
テンプレートなら STL のアルゴリズム系はすべてそうかな。
　ってことは、自分で作ったクラスや関数の中に、組込型向け操作しかしな
いものがあればそれはテンプレート化できるってこと。大きいのだと色々副
作用がありそうだから、小さいのから試した方がいいかもね。
　組込型操作タイプのメリットは、クラスもテンプレート引数に使えること。
実際に使用してる演算子を調べて、それをオーバーロード関数として持たせ
ちゃえば使えるようになるわけ。
　演算子操作タイプの問題点のひとつは、ポインタの問題。普通の演算子へ
の操作と、ポインタに対しての操作は違うでしょ。これを解決する方法のひ
とつは、 #07 で紹介したテンプレート引数のオーバーロードをする方法。
２種類作る必要があるのが問題だけどね。
　あと、型のサイズに依存する操作をすると、テンプレート引数に渡せる型
が少なくなるから。 sizeof である程度フォローできるけど、 sizeof は
オーバーロードできないから、クラスをテンプレート引数に渡せなくなっ
ちゃうからね。

　もうひとつの種類は、「メンバ関数呼び出しタイプ」。テンプレート引数
として渡されたクラスの変数を作って、それを通してあるメンバ関数名を決
め打ちして呼び出すっていうもの。
　これは当然、組込型は使えません。そしてもちろん、同じ名前のメンバ関
数を持たないクラスは使えません。同じ名前のメンバ関数を持つクラス、も
しくはその継承クラス、ってことになるわけ。
　これは前回紹介した、テンプレートを使ったポリモーフィズムのことね。
実際のポリモーフィズムと違って、コンパイルタイムにどの関数が呼ばれる
のか決まるし、使える関数の範囲が広いっていうのも違うかな。特に前者の
メリットは、ポリモーフィズムを使い慣れないうちは結構大きいかもね。
　使用例は、 STL の std::back_insert_iterator() とかがこのタイプ。こ
のクラステンプレートは、テンプレート引数の push_back() っていうメンバ
関数を呼び出します。もちろんテンプレート引数がこのメンバ関数を持って
いなかったらコンパイルエラーね。
　こっちのタイプの方が使うのは難しいだろうけど、作るのは簡単かも。あ
るメンバ関数が呼ばれるだけだから、複雑なことを考えなくていいからね。
来週はちょっと珍しい使用例について。じゃね。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『鏑矢の憂鬱が終わっちゃって、辞書ももうすぐ？』
「２１日に単語受付休止」
『他には？』
「金菜さんの憂鬱が来週で最終回」
『ええっ！？　そなの？　金菜ちゃん怒んない？』
「ちゃん付けして呼んだら怒ると思う」
『他に何が終わるの？』
「もうないんじゃないかな。何か終わらしたいのある？」
『ぷらとわ』
「言うと思った……」
http://www.kab-studio.com/
_______________________________________________________________[KCM]


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

　Version 5.34
閉じる前にレジストリに

「さて最後の仕上げ、今回はレジストリへの保存をしてみましょう」
『レジストリって前に使ったね。 Ver 3.19 ( No.044 ) とかから３回くら
いずっとレジストリ』
「軽く見返してみて」
『えーっと、データをレジストリに保存するんだよね。 CWinApp の関数、 
SetRegistryKey() とか GetProfileInt() を使うんだね』
「そう、この辺のメンバ関数でレジストリに読み書きできます」
『ふと思ったんだけど、レジストリの操作も API でできるの？』
「もちろんできるよ。 CWinApp のメンバ関数を使った場合って、レジスト
リの【HKEY_CURRENT_USER\Software\KamichanFactory】に書き込まれるで
しょ。でも実際にはレジストリのどの場所にも書き込めなきゃいけないわけ
で」
『 API を使うとそれが自由にできるんだ！　ってことは……』
「そう、使うの難しいんだよね」
『やっぱし』
「レジストリ関係の API は Reg なんたらって関数名だから」
『 RegCreateKeyEx() とかあるね』
「気が向いたら使ってみて。実際、当分の間は使う必要ないものだから今は
パスするけど」
『引数多くて難しそう……で、まずどうすればいいんだっけ』
「まずは CWinApp::SetRegistryKey() 」
『そうそう、【HKEY_CURRENT_USER\Software\ SetRegistryKey() の引数\ア
プリ名】ってゆーのが作られるんだよねこれで』
「 CWinApp::SetRegistryKey() には前と同じ KamichanFactory でいいかな」
『うん、前のと違うと分かりにくいもん。……ってことは、後から変えるの
って結構めんどい？』
「そういう事になるね。会社名っていうかブランド名は、そう簡単に変えな
い方がいいってことかも」
『そしたら WriteProfileInt() で書き込むんだよね。あれ？ Int って整数
値の int だよね。コンボボックスに入ってるのは文字列だから……』
「そう、これじゃ書き込めないんです。でも」
『別のがあるんだ！　 CWinApp のメンバ関数一覧、 WriteProfileString()
っていうのがある！』
「そう、これで文字列を書き込めます」
『引数は WriteProfileInt() とほとんど同じね。でも……どの引数がどん
なのだっけ』
「じゃ、実際に試してみようか。まず CWinApp::SetRegistryKey() 。これ
は CFileTestApp::InitInstance() で呼び出します」

BOOL CFileTestApp::InitInstance()
{
    SetRegistryKey( "KamichanFactory" );
// 以下略。

『ん？　ここじゃなきゃダメなの？』
「少なくとも CFileTestApp のメンバ関数の中じゃないとダメ。それ以外の
クラスからは呼べないようになってます。なぜかっていうのはもすこし先に
なってから。 MFC の仕様ってとこかな」
『ふーん。で、 WriteProfileString() の方はどうしよう』
「とりあえずテストだし、 CFileTestDlg::OnBtnBrowse() でやってみよう
か」

void CFileTestDlg::OnBtnBrowse() 
{
    CWinApp *pcWinApp
        = AfxGetApp();
    pcWinApp->WriteProfileString( "A", "B", "C" );
// 以下略。

『あれ、ちょっと難しくない？』
「ちょっとね。たとえば、 CComboBox::AddString() を呼び出すときには、
m_cFileCmbBox.GetWindowText( chPath, MAX_PATH - 1 ); って感じに
【変数.メンバ関数】って形式だったでしょ」
『そっか、 WriteProfileString() もそういうふうにしなきゃいけないって
ことだね』
「ここでは【変数】がポインタなんで、 . じゃなく -> を使います」
『……それ教えてもらったっけ？』
「……教えてなかったっけ？」
『……』
「……まーいーや。機能的には . も -> も同じ。左側の変数がポインタな
ら -> を使うってだけの話だから」
『ほい。で、そのポインタを AfxGetApp() で取得っと。あ、この関数は何
度も使ってるね』
「これは MFC の関数で…… FileTest.cpp の中に CFileTestApp theApp; 
って変数があるでしょ。これのアドレスを返すのがこの関数」
『ほー。で、それを通して CWinApp::WriteProfileString() を呼ぶわけ
ね。あれ、でも SetRegistryKey() はそうしてないじゃん』
「これは Ver 5.26 ( No.091 ) の SetWindowText() の例と同じ。
cShowBtn.SetWindowText() って呼んでるのと直接 SetWindowText() って呼
んでるのと２種類あるでしょ」
『これと同じパターン？』
「そう。 cShowBtn.SetWindowText() は、直前に作ってる CButton 型変数 
cShowBtn を通して呼んでます。直接 SetWindowText() 呼んでる方は、 
CFileTestDlg::OnBtnShow() の中で呼んでるんでその CFileTestDlg 型変数
を通して呼んでます」
『へへん憶えてるよん、 CFileTestApp::InitInstance() の中で 
CFileTestDlg dlg; ってしてるこの dlg がその変数なんだよね』
「そう！　この辺は Ver 3.21 ( No.046 ) とかで散々やってるから憶えて
るか」
『 ってことは、 CFileTestApp::InitInstance() もそういう変数が……そ
うだ！　それが theApp だって話だったんだ！』
「 Ver 3.22 ( No.047 ) でやったね。つまり SetRegistryKey() も
WriteProfileString() も同じ theApp を通して呼ばれてるってこと」
『どっちも同じってことね。で、なんだっけ』
「で、 CWinApp::WriteProfileString() がどう動作するのか確認するんで
しょ」
『そうそうそう。ビルドして実行！　レジストリ見ると……
【HKEY_CURRENT_USER\Software\KamichanFactory\FILETEST\A】に【名前】
が B 、【データ】が C のができてる！』
「 A が第１引数、 B が第２引数、 C が第３引数だね」
『これで WriteProfileString() は問題なし！』
「さて次の問題。レジストリには、どの段階で書き込めばいいでしょうか」
『え？　そうね、アプリが閉じるときとか。前にレジストリに書き込んだと
きは、 CFileTestApp::InitInstance() の中でダイアログ閉じてからだった
よね』
「実は、今回はそれはできないんです。ダイアログが閉じた後、ってことは
もうダイアログそのものが存在しないわけで、もちろんコンボボックスも」
『跡形もなく消えてる！　ってことはそれが消える前、かつダイアログが閉
じる時に保存しなきゃいけないんだ。……んなことできるの？』
「もちろん。一番必要ってくらいだからね。ウィンドウが閉じる直前には、
WM_DESTROY っていうメッセージが送られてきます」
『そっか、それに対応するメンバ関数作ればいいんだね。えーっと、クラス
ウィザードで、クラス名を CFileTestDlg にして、メッセージから…… 
WM_DESTROY みっけ』
「そのメンバ関数を作って」
『 CFileTestDlg::OnDestroy() ができた！　とりあえずさっき
CFileTestDlg::OnBtnBrowse() でテストした WriteProfileString のをこっ
ちに移してっと』
「 WriteProfileString() の第１、２引数はそのままにして、第３引数をコ
ンボボックスの１番目のデータ、にしてテストしてみようか」
『ほい。えーっと、そーゆーメンバ関数はーっと、 CComboBox::GetLBText() 
がそれっぽい』
「んじゃ使ってみて」
『第１引数はインデックスナンバーだから 0 っと。第２引数は……２種類
あるね』
「 LPTSTR のと CString の参照のとだね。ちょっと CWnd::GetWindowText()
と見比べてみて」
『あ、こっちも CString の参照のがある。でも LPTSTR の方は、最大文字
数も受け取るね』
「ポインタ教えたときに言ったと思うけど、配列のサイズはポインタからは
判らないから」
『 sizeof だとポインタのサイズが返ってくるんだよね、だから最大文字数
を渡す、と』
「はみ出ないようにね。参照は憶えてる？」
『ポインタみたいのだよね。アドレス渡してるのと同じだから、ホントの変
数は関数呼びだしてる側にあって、その変数が関数から操作される、って
ゆーの』
「参照として渡せば、 CString はサイズを自由に変えられるから」
『サイズのこと気にしなくていいんだ！　ってことは CString の方が楽っ
てことね。そいや、なんで CComboBox::GetLBText() の LPTSTR 版、なんで
最大サイズ渡さないでいいの？』
「 CComboBox::GetLBTextLen() ってメンバ関数があるから。これで文字列
のサイズが判るから」
『入りきるかどうかそれで調べてからってことね。めんどくさ……』
「それじゃ CString 使った方で試してみて」
『 CString 型変数作って、参照だからそのまま渡せばいいんだから……あ、
CString って LPCTSTR にそのまま渡せるんだよね。だから……』

void CFileTestDlg::OnDestroy() 
{
    CString cDataStr;
    m_cFileCmbBox.GetLBText( 0, cDataStr );
    CWinApp *pcWinApp
        = AfxGetApp();
    pcWinApp->WriteProfileString( "A", "B", cDataStr );

    CDialog::OnDestroy();    
}

『ビルドして実行、【参照】で選んで【表示】させてから【 OK 】で閉じて
と。んでレジストリエディタで最新表示……おおっ、今選んだファイルのパ
スがちゃんと出てる』
「じゃ、今度はリストのデータすべてをレジストリに書き込んでみましょ
う」
『んーとねー、 "B" のとこを "1" とか "2" とかにして、 cDataStr をリ
ストの各行にして書き込めばいいんじゃないかな』
「じゃ、やってみましょう！」
『…………』
「ひとつずつひとつずつ。まずリスト全部を TRACE() で出力してみるとか」
『そうね、えっと、この前使った CComboBox::GetCount() でリストにいく
つ入ってるのか分かるんだから、これで for 使えばいいんじゃないかな』

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

    CDialog::OnDestroy();
}

『 cDataStr は for の外で作った方がいいんだよね、そうしないと毎回作
り直されちゃうから』
「そ、 Ver 5.21 ( No.086 ) でやったね」
『 for は前になんかで使ったのの使い回しだけど、大丈夫だよね。あのさ、
こうすると m_cFileCmbBox.GetCount() 何度も呼んじゃうけど、ホントは
１回でいいんだよね』
「そうだね。 for の前で const int に入れてそれを使った方がいいかな」
『あ、そっか。で、いつも使ってる CComboBox::GetLBText() で１行拾って
出力、これでいい？』
「うん、大丈夫でしょ。というわけで続く！」

/*
    Preview Next Story!
*/
『次回で第１００回っすよ水希ちゃん！！』
「というわけで次回はまとめとこれからの方針なんかも」
『質問！　あたしがこれまでに憶えた量ってどのくらい？』
「量としてはかなりだね。いっぱしのプログラマーかも」
『おお！』
「でも僕が教えたい量の３分の１にも満たないかも」
『なんですと！！』
「というわけで次回」
＜ Version 5.35 レジストリにいっぱい書き込もう！ ＞
『につづく！』
「……もしかして欲張りすぎ？」
『そんなにいっぱい憶えらんないよ〜』


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

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


/*              ２００１年３月２６日（月）の更新予定              */
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/
・プログラミングに関する質問は[鏑矢の憂鬱]にお送りください。
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!!                      */


