////////////////////////////////////////////////////////////////////
/*

    KAB-studio.h


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

    送信日： 2002/04/29(Mon) No.155
    配信数： 3790 ( 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/Comic/HotHerb/


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

2002/04/21 (Sun)
　ぷらとわ１話とホットハーブ１話作成。ホットハーブは手順が確立しつつ
あるかも。星の声と CppUnit の布教。テレビは最近ハリケンジャーが面白
いかも。情処試験は受けず。次はどうするかなー。

2002/04/22 (Mon)
　突然「ビルドの更新情報が無視される」問題が！　と思ったら時計がずれ
てただけだった……。時間が狂った理由はテストでずらして元に戻さなかっ
たから。ホットハーブのヒット数、まぁまぁ？

2002/04/23 (Tue)
　std::vector< std::string > が思ったのは _CrtSetDbgFlag() の 
_CRTDBG_CHECK_ALWAYS_DF が原因だった。仕事で作ったライブラリの公開っ
てどうなるん？　ビデオテープのバージョンアップ。 KREZ 系ウィルス。そ
してコピペ不可サイト。

2002/04/24 (Wed)
　文字コードチェックの機能が付いた文字列操作。 std::string::find() 
だと [ラーゼフォン] に [ゼフォン] が引っかかるから。今月お金使いす
ぎ。おねてぃＤＶＤ１巻到着。

2002/04/25 (Thu)
　Enhydra 使うと思ったら違うお仕事。お昼休みにウイイレ６。飲み会で結
構な人が日記を見てることが判明。ウイイレ６、結構感覚違う……。

2002/04/26 (Fri)
　お仕事は久々客先へ。んで徹ゲーへ、と思ったらその客先でトラブル
が(泣)。なんとかフォローして徹ゲー、の前にビリヤード。疲れた……。ウ
イイレ６はまだまだだなぁと。そして２ちゃんねるイベント。どんなん？

2002/04/27 (Sat)
　妙な一日。寝たり、寝たり。でもホットハーブ１話描いたり。お昼とかは
ドチキンで。がびん、藍より青しのデータが再生できない(泣)。ハードディ
スクデッキ内に保存はできてるのに。テレビはＮスペ、教育改革。センセの
再教育が必要なんじゃー。


////////////////////////////////////////////////////////////////////
/*                         風雅、舞い                             */
http://www.kab-studio.com/Novel/Fuga/

■　第四章　ふたりの勇者　−１−

「ん？　リシュネも来たのか」
　車内からささやかに笑って応えるリシュネ。洋一はそれに笑顔で応えて車
内へと入った。車は走り出し、病院内のロータリーを抜け出る。
「いないあいだ、なにか変わったことはなかったかい？」
　そう言って、隣に座るリシュネと、前部座席から乗り出す少年を見る。
「なんにもないよ。って言うより、左さんがいないことをいいことに、先生
テストばっかりするんだもの。外に出る暇もなくて」
「ははは、彼女らしいな。けど、これから君たちにはどんどん働いてもらわ
なくちゃならないから、そのために一生懸命だったんだろう」
「その仕事って、なんです？」
　リシュネが訊いた瞬間、緊張が走った。それを見て取って、洋一は笑っ
た。
「別に言えないことでも、＜選ばれし者＞だけに言えることでもないよ」
「そ、そうですか」
　少年は、こういう相手の先手を取ってからかう洋一の笑みが、嫌いだっ
た。
「じゃぁ、逆に質問してみようか。君達は、なんで天地社が＜泉の力を受け
継ぐもの＞を襲うのか知ってるかい？」
「ＡＰやＬＷにうち勝つ存在だから」
「ミナクートの代わりにしようとしているから」
　洋一は首を振った。
「違うよ、そんな理由じゃない。もっとも、舞たちのことをよく知らないの
だから、それは当然だとは思うけどね」
「自分で教えないでおいて、よく言うよ……」
「確かに……」
　洋一は苦笑いを浮かべて、気を取り直した。
「今、泉に異変が起きつつある。そして、来年春、この日本に闇が訪れ
る……」
「かなりうさんくさい話ですね」
「でも、洋一の言うことにウソはないでしょ？」
　リシュネのフォローに少年はふてくされる。
「その闇に勝てる者たち、それが、＜泉の力を受け継ぐもの＞というわけ
だ」
「まるでファンタジーの世界みたい。なんか現実味がない」
「それだ……」
　少年は、気付いた。
「そんなファンタジーみたいな舞台こそ、僕達のデビューにふさわしくな
い？」
「私たちじゃなくて、ＬＷシリーズでしょ」
「そういうことだ。そのために、天地社は作られたんだからな」
「でも、僕達だってそうなんでしょ？」
「君達は、兵器じゃない」
　洋一は、ふたりを見て、力強く言った。
「五人のＡＰには、ケンカなんてくだらない理由のためになってもらったん
じゃない。当面は……」
　洋一はにっこりと笑った。
「まず、仲良くなってもらおうかな」
                                                              (続く)


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『次の水曜は Java メルマガ！』
「〈第１７回　オブジェクト指向の世界〉です」
『ホントはその号が最終回だったんだよね』
「でも月の途中で終わることはできないから１号追加しました」
『で、ホントは最終回だったってことで、まとめみたいな感じね』
「オブジェクト指向全体の話だね」
『このくらいの話なら、なんとなく分かるけど、でも』
「プログラミングには利用できないでしょ？」
『うん、無理。クラスとか、使うだけで作れないもん』
「そう、そこがポイント」
『？』
「僕としては、クラスをしっかり理解してからの方がいいと思うんだよね」
『このメルマガ自体、そんな感じだもんね』
「概念よりも実践的な理解度の方が重要！」
『ってわけで、あたしが教わる日はまだまだ先なわけね』
「ま、分からなくても読んでおくと、あとあと大きいとは思うよ？」
http://www.kab-studio.com/
_______________________________________________________________[KCM]


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

　Version 8.13
構造体の使い方

「まずは前回の復習から！」

BOOL CMfcDialogDlg::OnInitDialog()
{
// 略。
    // TODO: 特別な初期化を行う時はこの場所に追加してください。
    HTREEITEM hParentItem
        = m_cMainTree.InsertItem( "アイテム" );

    // TVITEM 構造体の初期化。
    char pchText[256];
    TVITEM stTvItem;
    stTvItem.mask = TVIF_TEXT;    // 文字列だけ取得。
    stTvItem.hItem = hParentItem;    // 取得したいアイテム。
    stTvItem.pszText = pchText;    // 文字列を受け取る配列。
    stTvItem.cchTextMax = 255;    // そのサイズ。

    // 実際に受け取ります。
    m_cMainTree.GetItem( &stTvItem );
    TRACE( "%s\n", pchText );
    // アイテム

    return TRUE;
}

『これでアイテムの文字列を取るんだよね。でも結構面倒……』
「 in と out 、つまりこっちから渡すデータとウィンドウズから渡される
データが同じ構造体に入ってるからねー。っていうか」
『ってゆーか？』
「この辺は TVITEM のリファレンス見てもよく分からないかも」
『英語だから？』
「それを差し引いても。こういうのはサンプルとか見るしかないかもね」
『水希ちゃんのコードもサンプルコード？』
「一番基本的なことだけだけどね。さて、前回ちょっとギリギリだったか
ら、またゆっくり見てみます」
『ほいほい』

    char pchText[256];
    TVITEM stTvItem;

『文字配列と TVITEM 構造体の変数作ってるね』
「では次」

    stTvItem.mask = TVIF_TEXT;    // 文字列だけ取得。

『これは〈どのデータをもらうか〉を指定するビットフラグなんだよね』
「今回はアイテム名が欲しいから TVIF_TEXT 。リファレンス見ると分かる
とおり、いろんなメンバ変数が TVITEM にはあるから、その中のどれを渡し
てもらうかを TVITEM::mask で指定します」
『 TVIF_IMAGE とか、イメージリストとか書いてあるけどこれってなに？』
「ツリービューコントロールって普通はアイコンが付いてるでしょ」
『うん付いてる。あー、そのアイコンのこと？』
「そうそう。今回は面倒だからこのイメージリストの使い方はパス」
『結構面倒？』
「まーね。次」

    stTvItem.hItem = hParentItem;    // 取得したいアイテム。

『データを取りたいアイテムのハンドルをこれで指定するんだよね』
「そうそう。リファレンス見ると何気なくこのメンバ変数があるからなんか
受け取りそうだけど」
『これで指定するわけねー』
「次」

    stTvItem.pszText = pchText;    // 文字列を受け取る配列。

『これってちょっとややこしいかも』
「まず、文字列を受け取るためには文字配列を用意してそのポインタを渡し
ます、ってのは分かるよね」
『もちろん』
「構造体のメンバ変数で文字列を受け取る場合、その構造体の中に文字配列
を用意することもできるんだけど、それだとサイズが固定でしょ」
『アイテムの文字列が長いと受け取れない！』
「そゆこと。だから、文字配列は構造体の外に置くわけ。」
『で、そのポインタを構造体に入れると』
「ウィンドウズはそのポインタの指す先に文字配列があるって見なして、そ
こに文字列を書き込みます」
『ポインタはこーゆーのに便利ねー』
「そのためのものだしね。で、〈文字配列とみなす〉としても、ポインタが
指す先はただのメモリ、そのメモリのどの範囲が文字配列なのかどうか不安
だから」

    stTvItem.cchTextMax = 255;    // そのサイズ。

『でどこまでが文字配列かっていうのを教えるわけね』
「ここまでが構造体の準備。で、」

    m_cMainTree.GetItem( &stTvItem );

「でデータをウィンドウズから渡してもらいます」
『簡単って言えば簡単だけど……他のメンバ変数のことが気になるなー』
「それはパス。というわけで、今度は追加の方をしてみましょう」
『ってゆーかそれが目的なんだもんね』
「追加には TVINSERTSTRUCT って構造体を使います」
『うお、また新しい構造体が！』
「って言っても、メンバ変数が３つ入ってるだけ。ひとつは TVITEM 。この
中に追加するアイテムのデータを渡します」
『 "アイテム" とか？』
「そうそう。ふたつめのメンバ変数は TVINSERTSTRUCT::hParent 。これは
この前使った CTreeCtrl::InsertItem() の第２引数」
『追加するアイテムの親アイテム！』
「そゆこと。ってことは、みっつめのメンバ変数は」
『 CTreeCtrl::InsertItem() の第３引数、ってことは縦のどこにアイテム
を追加するか！』
「ってこと。これが TVINSERTSTRUCT::hInsertAfter ってメンバ変数になり
ます。というわけで実際のコードを見てもらいましょう」

BOOL CMfcDialogDlg::OnInitDialog()
{
// 略。
    // TODO: 特別な初期化を行う時はこの場所に追加してください。
    TVINSERTSTRUCT stInsertItem;
    stInsertItem.hParent = TVI_ROOT;
    stInsertItem.hInsertAfter = TVI_LAST;
    stInsertItem.item.mask = TVIF_TEXT;
    stInsertItem.item.pszText = "アイテム";
    
    HTREEITEM hParentItem
        = m_cMainTree.InsertItem( &stInsertItem );

    return TRUE;
}

『 TVI_ROOT と TVI_LAST は、前回言ってた省略したときに渡したのだね』
「これを渡すこともできるし、もちろん」
『 CTreeCtrl::InsertItem() で返ってきたアイテムのハンドルを渡すこと
もできるわけね』
「追加するアイテムの情報は TVINSERTSTRUCT::item が TVITEM 型になって
るから、この中に入れます」
『受け取ったときより少ない…… TVITEM::hItem と TVITEM::cchTextMax 
がないんだ』
「 TVITEM::hItem は、これから追加するアイテムなんだから」
『ハンドルがあるわけないのね』
「 TVITEM::cchTextMax は、今回は文字列を渡すだけで受け取るわけじゃな
いから」
『サイズ指定する必要がない、と。そういえば TVITEM::pszText にも文字
列そのまま渡してるものね』
「だから渡す時はこれだけでＯＫ。アイコンを付けないし、その他の属性も
要らないから他のメンバ変数も放っておいていいからね」
『んで追加は CTreeCtrl::InsertItem() で……って、さっきと同じメンバ
関数じゃない』
「これはオーバーロードされた関数」
『あ、いつもの文字列とか渡してたのと違うメンバ関数なんだね』
「このメンバ関数は TVINSERTSTRUCT へのポインタを受け取るメンバ関数。
MFC 使わないでアイテムを追加するときには TVINSERTSTRUCT を使うから、
その互換性のためにって感じかな」
『ってことは、また MFC 使わないのに戻ったら TVINSERTSTRUCT 使ってや
るわけね。いつもの便利な方の CTreeCtrl::InsertItem() は使えないで』
「そゆこと。その辺は不便だけどね」
『不便ってゆーか……今は水希ちゃんに教えてもらえたからできたけど、他
のコントロール使ったりするときにはどうすればいいのか分かんないんだけ
ど』
「サンプルコード探してきて調べて試す、それだけ」
『何それ』
「って言うか、僕もツリービューコントロールとかってあまり使わないから
今回も調べながらだから」
『そーゆーもんなの？』
「そーゆーもん。実際、リファレンスとか分かりにくいし」
『ってゆーか、 TVINSERTSTRUCT のリファレンス、全然分からないんだけ
ど』

typedef struct tagTVINSERTSTRUCT {
    HTREEITEM hParent;
    HTREEITEM hInsertAfter;
#if (_WIN32_IE >= 0x0400)
    union
    {
        TVITEMEX itemex;
        TVITEM item;
    } DUMMYUNIONNAME;
#else
    TVITEM item;
#endif
} TVINSERTSTRUCT, FAR *LPTVINSERTSTRUCT;

「これは難しいかもね……これは次回見てみようか」
『わかる？』
「ひとつひとつ教えればたぶん大丈夫だと思うよ。実際、こういうのを読め
るようになる方が大事かもしれないし」
『大事？』
「ここで問題。一番身近なサンプルコードはなんでしょう」
『水希ちゃん！』
「いや、それは置いといて」
『それ以外……』
「答は MFC 」
『 MFC って難しくない？』
「比較的難しくはないと思う……っていうか、他に難しいコードはいくらで
もあるから、 MFC くらいは読めるようにならないとね」
『げげ』
「でも、 MFC が読めれば……たとえば今回の例。 TVINSERTSTRUCT は MFC 
使わないときに使う、ってことは、 MFC は TVINSERTSTRUCT を使ってるっ
てこと」
『え？　でもあたしが TVINSERTSTRUCT を用意したら……あ！　オーバー
ロードのもひとつの方！』
「そゆこと。文字列とかだけ渡したのは、 TVINSERTSTRUCT を用意してその
中に文字列とかを渡してアイテムを追加してます」
『それが読めるようになれば MFC がサンプルコードになる！』
「当面はそれくらいが身近な目標かもね」

/*
    Preview Next Story!
*/
『次回は結構難敵っぽいねー』
「そうでもないと思うけど」
『そうなの？』
「プログラミングって、複合的に絡み合うこと少ないから」
『どゆこと？』
「ＡがＢに、ＣがＤにってことはあるけど、Ａ＋ＢがＥ、は少ないから」
『つまりひとつひとつ憶えておけばいいわけねー』
「というわけで次回」
＜ Version 8.14 構造体を読み解く ＞
『につづく！』
「ま、そのひとつひとつ憶えるってのが大変なんだけどね。でも」
『あたしは大丈夫！』
「その辺はちょっとうらやましいかも……」


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

・５月表紙壁紙登場！
　毎月恒例、新しい表紙です。……５月っていつもネタに困るんだよねー、
何をテーマにしようかなー。


////////////////////////////////////////////////////////////////////
/*                          ご注意！！                            */

・このメールを返信しないでください。
・ご意見・ご希望・ご感想は[チョー普通な日記]よりお送りください。
http://www.kab-studio.com/nikki2/
・購読登録を解除したいときにはこのページで行なってください。
＊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/index.html#MailMagazine


////////////////////////////////////////////////////////////////////
/*
    KAB-studio.h
      Weekly Mail Magazine.
      Written by Kaburaya Seiden.
      http://www.kab-studio.com/Info/MailMagazine/

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

