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

    KAB-studio.h


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

    送信日： 2002/08/05(Mon) No.169
    配信数： 3660 ( Mag2 + Pubzine )
＊    発行元： まぐまぐ ( URL: http://www.mag2.com/  ID: 0000012198 )
＊    発行元： Pubzine ( URL: http://www.pubzine.com/  ID: 590 )
*/
////////////////////////////////////////////////////////////////////

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

・８月表紙壁紙登場！
　毎月恒例、新しい表紙です。８月って言ったらやっぱり水着！　でも先月
よりは色気少なめ（爆）。ダウンロードは CG Gallery にて。
[ CG Gallery ]
http://www.kab-studio.com/CG/Gallery/

・ホットハーブに１話追加。
　三人合体ホットハーブに１話追加します。「ホットハーブ」現る！
[ 三人合体ホットハーブ ]
http://www.kab-studio.com/Comic/HotHerb/

・Codian ほんのちょっと修正。
　Codian の「ポインタと文字列とCStringと」をちょこっとだけ修正。ほん
とにちょこっと。そのくらいしか修正できない……。
[ Codian ]
http://www.kab-studio.com/Programing/Codian/
[ ポインタと文字列とCStringと ]
http://www.kab-studio.com/Programing/Codian/MxA/09.html


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

2002/07/28 (Sun)
　８月表紙壁紙！　さらにボツバージョンも。露出度で決めたわけじゃない
よー。最初は露出度の高い方だったんだけど。今回は細かくがんばってま
す。今回は結構満足いくものかなーと。実質６時間。テレビはハリケン
ジャーにメガレッド登場。

2002/07/29 (Mon)
　眼鏡にまだ慣れない。 Java 嫌い。 Bean の登録に気付かなかった。 
const メンバ関数がない。帰りにプリンタのインクとか。あずまんが大王 +
Kanon はナシに。

2002/07/30 (Tue)
　サーブレットプログラミング。難敵……。プレステ２版 Kanon が売り切
れてた。ほとはーの２章が終わったら表紙を変えようかなと。メインＰＣの
謎の通信。

2002/07/31 (Wed)
　テスティング中心でちょっとだけ残業。 classpath や jar ファイルの関
係、解れば難しくない？　ＣＣさくらの映画をやるんで楽しみ。猫のクロー
ン。たぶん触れば判る。７月後半、ツッコミひとつもなし！

2002/08/01 (Thu)
　今日もテスティング。帰りに Kanon DVD ５巻とか購入。パーティクル全盛
の時代。夏だからかなぁ。住基ネットって微妙に問題？　ネットディバイド
とかなんか忘れ去られてる。わては普通の変な人です。

2002/08/02 (Fri)
　久々８時半まで。 SELECT 文のスコープ。 JUnit 便利。天野うずら様。
たまちゃんの正体！　これから徹夜。ホントは KAB-studio.h は休んでもい
いんだけど。

2002/08/03 (Sat)
　徹夜っていうよりうたた寝。立川で Kanon 関係買いまくり。実家と合流
しておばあちゃんの三回忌。バーミヤンで食べたりなにげに良かったり。


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

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

「さてと、私の名は左洋一、ファインダウト社の代表のようなものをしてい
るんだ。そのふたりはＡＰとして私が雇っている」
「飼ってるって言った方が当たってるんじゃない？」
「養ってもらってるって言う方が正解でしょ」
　少年とリシュネのやりとりは、それほど仲が悪いようには見えないもの
だった。
「ＡＰってなんです？」
「Ａｄｖａｎｃｅｄ　Ｐｅｒｓｏｎ、一歩進んだ人間とでも言えるかな。
まぁ、違う方法で君達のようになったのだと思えばいい」
「そんなことが、可能なのか……」
「もしかして、僕みたいなのがいっぱい増えたら困るなとか思ったんじゃな
い？」
　言い当てられたのか、雅樹はぷいとそっぽを向く。
「もちろん。それを止めるのが、我々の目的だ」
「私達を襲った、あの巨大な動物達……」
「そう。天地生物科学工業という会社で作られているＬｉｖｅ　Ｗｅａｐｏ
ｎ。その製造を止めなければいけない」
「その手伝いをして欲しいっていうのね」
「いや、そうじゃない」
　その言葉は雅樹の注意を引いた。
「その方面は我々に任せて欲しい。そのかわり、君達は＜泉の力を受け継ぐ
もの＞としての責務を果たして欲しい」
　舞と雅樹は顔を見合わせた。
「闇を倒すという目的をね」
「そんなことまで知ってるのか……」
「でも、その＜闇＞がなんなのか、まだ分からないし……」
「ところが知ってるんだな、これが」
　ふたりだけでなく、リシュネと少年も注意を向けた。
「でも、秘密」
「ひ、秘密って……」
「俺達は仲間になったんじゃないのか？」
「ムリムリ」
　少年はあきらめ顔で首を振る。
「左さんは僕達にもほとんど教えてくれないんだもの。もっとも、相手によ
るみたいだけどね」
　と、リシュネを流し見る少年。そんな視線を無視して、リシュネは洋一に
訊く。
「私達に話してくれたくらいならいいんじゃない？」
「ま、そのくらいなら」
「なにっ！！」
　突然の叫びが静寂を作る。雅樹が注意深く外を観察する。山沿いの道路、
その一段下に畑が広がっている。見晴らしのよい空間には、灰色い雲しか見
えない。
「リシュネ、頼む」
「開けるから」
　その意味を理解するまもなく扉を開ける。強烈な風が吹き込む中、体をひ
るがえして車の屋根へと上がる。雅樹は体を固定して開いたドアから外を見
張る。
「どこだ……上！？」
　その声はリシュネにも届いた。見上げた先にはやはり雲しかない。
　一瞬後。山に茂る木々を超えて、巨大な影が現れる。それは車の上を通り
越し畑の方へと飛んでいく。全員がその姿を追った。
                                                              (続く)


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『あ！』
「どしたの、火美ちゃん」
『上の風雅、舞いに出てるＡＰって、ほとはーでも出てるね』
「あ、そういえば。ホットハーブの２の８に出てくるね」
『じゃあリシュネも首が取れるのかな！』
「見たいような見たくないような……」
『ってゆーか、実際に同じものなの？』
「みたいだよ。この設定資料によると」
『みしてみー。あれ、時代が違うね』
「設定では、風雅、舞いは２０世紀末、ほとはーは２１世紀初頭みたい」
『なんか微妙ねー』
「でも関係してることは確かみたいね」
『作品の雰囲気全然違うけど』
「そりゃ、小説と４コマじゃね……」
http://www.kab-studio.com/
_______________________________________________________________[KCM]


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

　Version 9.08
今度こそアクセラレーターを追加する！

「前回のアクセラレーターを新しく作るコード」

void CMainFrame::OnMenuTest() 
{
    // アクセラレーターテーブルを新しく作ります。
    ACCEL stAccel;
    stAccel.fVirt = FCONTROL | FVIRTKEY;
    stAccel.cmd = ID_FILE_OPEN;
    stAccel.key = 'B';
    HACCEL hAccel
        = CreateAcceleratorTable( &stAccel, 1 );
    // 古いアクセラレーターテーブルを削除します。
    DestroyAcceleratorTable( m_hAccelTable );
    // アクセラレーターテーブルへのハンドルを入れ替えます。
    m_hAccelTable = hAccel;
}

『ってゆーかこれってダメじゃん！　新しく Ctrl + B ができるようになっ
たと思ったら、 Ctrl + O とか全部なくなっちゃったし』
「そう、そこが問題。この方法は」

１： Ctrl + B だけしかないアクセラレーターテーブルを作る。
２：古いアクセラレーターテーブル（ Ctrl + O 含む）を削除する。
３：新しいアクセラレーターテーブルをセットする

「って方法を取ってます」
『それじゃ Ctrl + O とかが使えなくなっちゃうわけね。でもさ、他のリ
ソースとかなら Insert なんたらとかでできたのに』
「アクセラレーターテーブルはそういうのがないから、今あるものにそのま
ま追加することはできないんです。だから」

１：古いアクセラレーターテーブルの複製を作る。
２：複製に Ctrl + B のアクセラレーターを追加する。
３：古いアクセラレーターテーブルを削除する。
４：複製をセットする。

『つまり、一度手元に持ってきて追加してからセットするわけね』
「そゆこと。で、この中で一番難しいのは、複製を作ったり追加するとこ
ろ」
『見た感じ難しそうには見えないけど』
「この部分も含めてもう少し詳しく書くと」

１：古いアクセラレーターテーブルのアクセラレーターの数を取得する。
２：その数＋１分のアクセラレーターの変数を用意する。
３：その変数に古いアクセラレーターテーブルの情報をコピーする。
４：余った１個分に Ctrl + B のアクセラレーターの情報を置く。
５：その変数でアクセラレーターテーブルを新しく作成する。
６：古いアクセラレーターテーブルを削除する。
７：新しく作ったアクセラレーターテーブルをセットする。

『難しいような、難しくないような……最初の数を取得って、前回やった
し』
「そういう所もあるし、ところどころ前にやってるのもあるけどね。だから
ひとつひとつ手順を追っていけば大丈夫……だと思う」
『不安ねー』
「がんばるのは火美ちゃん」
『水希ちゃんもがんばるよーに』
「はいはい。じゃ、コードを見てみましょう」

void CMainFrame::OnMenuTest() 
{
    // アイテム数を取得します。
    int iTableNum
        = CopyAcceleratorTable( m_hAccelTable, NULL, 0 );
    // アイテム数 + 1 分の ACCEL 構造体配列を確保します。
    ACCEL *pstAccel = new ACCEL[iTableNum + 1];
    // 古いアクセラレーターテーブルをコピーします。
    CopyAcceleratorTable
        ( m_hAccelTable
        , pstAccel
        , iTableNum
        );
    // + 1 の所に新しいアクセラレーターのデータを入れます。
    pstAccel[iTableNum].fVirt = FCONTROL | FVIRTKEY;
    pstAccel[iTableNum].cmd = ID_FILE_OPEN;
    pstAccel[iTableNum].key = 'B';
    // アクセラレーターテーブルを新規作成します。
    HACCEL hNewAccel
        = CreateAcceleratorTable( pstAccel, iTableNum + 1 );
    // 確保した配列を削除します。
    delete [] pstAccel;
    // 古いアクセラレーターテーブルを削除します。
    DestroyAcceleratorTable( m_hAccelTable );
    // アクセラレーターテーブルへのハンドルを入れ替えます。
    m_hAccelTable = hNewAccel;
}

『なが！』
「というわけで、ひとつひとつ見ていきます」
『まず CopyAcceleratorTable() は、前回やったからいーとして。次の』

    // アイテム数 + 1 分の ACCEL 構造体配列を確保します。
    ACCEL *pstAccel = new ACCEL[iTableNum + 1];

『これが謎』
「 new は一応使ったことあるんだけどね」
『え？　検索……あ、 Version 5.22 ( No.087 ) でやってたね』
「 new は、変数をつくるためのキーワード。えっと、このあとで今アプリ
が持っているアクセラレーターテーブルのデータを取ってきて受け取る必要
があります」
『さっきの〈３：その変数に古いアクセラレーターテーブルの情報をコピー
する。〉のことね。ってことはその前の〈２：その数＋１分のアクセラレー
ターの変数を用意する。〉がこの行なんだ』
「そゆこと。前回アクセラレーターテーブルを作ったときに ACCEL 構造体
を使ったでしょ」
『うん使った。あの中にどういうキーの時にどういうコマンドが送られる
かって入れたんだよね。そっか、この変数でそういう情報を受け取るんだ』
「そゆこと。その情報を受け取るために、最初にアクセラレーターがいくつ
入ってるか調べて、」

new ACCEL[iTableNum + 1];

「でその数 + 1 個分の ACCEL 構造体を作って、それをポインタとして受け
取ってるんです。イメージとしては、 iTableNum が 3 なら、 + 1 で４個
だから」

[ACCEL][ACCEL][ACCEL][ACCEL]

「って感じにメモリ上に ACCEL 構造体が４つできることになります」
『返ってくるポインタって、一番最初の ACCEL のアドレスなんだよね。
あ、そういえばなんで + 1 ？』
「だって、今回の例ではアクセラレーターを追加しなきゃいけないから」
『だから１個増やしてるんだ』
「で、変数を用意したら、そこにコピーします」

    // 古いアクセラレーターテーブルをコピーします。
    CopyAcceleratorTable
        ( m_hAccelTable
        , pstAccel
        , iTableNum
        );

『 m_hAccelTable は前回やった、今持ってるアクセラレーターテーブルの
ハンドルね。そっから、第２引数の……？』
「ポインタだよ。 new で作ったのを受け取る時はポインタだから」
『さっきのページにそう書いてあるね』
「そのポインタを渡すと、 CopyAcceleratorTable() がそのポインタを通し
て実際に new で作られた変数に情報を書き込んでくれます」
『むむむ』
「このコピーの部分は文字列のとかと同じだよ？」
『う……文字列のときはもう慣れでやっちゃってるからイメージ掴めない
よー』
「かもね。そういうときは Version 5.03 ( No.068 ) 以降を読み返して」
『はーい』
「で、第３引数に iTableNum 、つまり今持ってるアクセラレーターの数を
渡すと、その数だけ pstAccel にコピーしてくれます」
『あ、そういえばこの CopyAcceleratorTable() って、アクセラレーターの
数をもらったときのと同じ API だね』
「そう、だからこの API にはふたつの機能が入ってるってことだね。本当
はこういうのは良くないんだけど……」
『で、次の』

    // + 1 の所に新しいアクセラレーターのデータを入れます。
    pstAccel[iTableNum].fVirt = FCONTROL | FVIRTKEY;
    pstAccel[iTableNum].cmd = ID_FILE_OPEN;
    pstAccel[iTableNum].key = 'B';

『これって、前回のと同じ……だけどちょっと違うね』
「さっきのコピーでは iTableNum 分しかコピーしてないから、さっきのイ
メージだと」

[コピー済み][コピー済み][コピー済み][何も入ってない]

「って感じになってます。で、この部分で最後の１個に追加するデータを入
れてるわけ」
『なら』

    pstAccel[iTableNum + 1].fVirt = FCONTROL | FVIRTKEY;

『じゃないの？』
「だって、配列は 0 から始まるから」
『あ、そっか。さっきのだと』

[０][１][２][３]

『で、 iTableNum が 3 だから合ってるんだ』
「まぁ、配列の最後の要素は、要素の数 - 1 。今回配列の要素の数は 
iTableNum + 1 。だから ( iTableNum + 1 ) - 1 って書く手もあるよ」
『それって変……』
「僕は前やってたよ。分かりやすいから」
『……なんか恥ずかしくない？』
「分かりやすさの方が大事だと思うから。で、」

    // アクセラレーターテーブルを新規作成します。
    HACCEL hNewAccel
        = CreateAcceleratorTable( pstAccel, iTableNum + 1 );

『これは前回のだね。あ、でも第２引数が違う』
「前回はアクセラレーターがひとつだけだったけど」
『今回は元々あったのも入ってるからいっぱいなんだね』
「で、そのあと」

    // 確保した配列を削除します。
    delete [] pstAccel;

『これって new した変数を消すのなんだよね』
「そうそう。普通の変数は関数が終わるときに自動的に消えるんだけど、 
new したのは delete で消さないとアプリが終了するまで消えないから」
『でもさ、これって削除しちゃまずいんじゃない？　だって、これからアク
セラレーターテーブル使うんでしょ？』
「大丈夫大丈夫。さっき CreateAcceleratorTable() で、ウィンドウズシス
テムの中に本当のアクセラレーターテーブルを作ってもらったんだから」
『本当の？』
「そう。 pstAccel は、そのアクセラレーターテーブルを作るためのただの
情報。たとえば、 Version 9.04 ( No.165 ) でメニューアイテムを追加し
たとき、 CMenu::InsertMenu() に渡した情報とかは」
『そっか、もうなくなってるけど、メニューアイテムはちゃんと作られてる
ね』
「それと同じ。あとの行は前回と同じだから大丈夫だよね」
『うん、なんとか』

/*
    Preview Next Story!
*/
『今日一番難しかったのって配列のとこかも』
「うん、そこが一番難しいと思うよ」
『そなの？』
「やっぱりメモリイメージとかは解りにくいからね。でも直接見れば」
『あ、メモリ見ればいいんだね』
「面倒だけど、それもひとつの手ってことで」
『いうわけで次回』
＜ Version 9.09 ツールバーを使ってみよう！ ＞
「につづく！」
『今度は解りやすそうね』
「ところがどっこい」
『げ！』


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

