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

    KAB-studio.h


    (C)KAB-studio 1999 - 2007 ALL RIGHTS RESERVED.
        http://www.kab-studio.biz/
        info@mail.kab-studio.biz

    送信日： 2007/03/05(Mon) No.397
    配信数： 1659
    発行元： まぐまぐ ( URL: http://www.mag2.com/  ID: 0000012198 )
*/
////////////////////////////////////////////////////////////////////

/*            KAB-studio.h 発行終了のおしらせ                     */

このたび、本メールマガジン「KAB-studio.h」は、2007年3月26日発行の
No.400号をもちまして発行を終了することとなりましたため、みなさまに
おしらせいたします。
発行終了後の各コンテンツは以下の通りとなります。

・ニュースおよび日記ダイジェスト
→KAB-studioではRSSを配信してしておりますのでそちらをご利用ください。
http://www.kab-studio.biz/rss.xml

・風雅、舞い
ホームページにて不定期掲載を行います。
掲載はかぶろぐおよびRSSにておしらせいたします。
http://www.kab-studio.biz/Novel/Fuga/index.html

・#pragma twice
No.400にて最終回となります。ご了承ください。
ホームページ版にて全話公開しておりますのでご利用ください。
http://www.kab-studio.biz/Programing/PragmaTwice/index.html

以上、ご了承頂ければと思います。


////////////////////////////////////////////////////////////////////
// NEW!!
http://www.kab-studio.biz/index.html

2007/03/05 (Mon)
　ほとはー外伝３にP.92を追加！
[ 三人合体ホットハーブ 外伝３ 【ワタシ の キロク】 ]
http://www.kab-studio.biz/Comic/HotHerbA3/index.html


////////////////////////////////////////////////////////////////////
// ちょお普通な日記
http://www.kab-studio.biz/nikki2/index.html

2007/02/25 (Sun)
　いつもの更新とかアニメ感想書き。そのあとほとはー外伝３、まだ完成し
てない。今日はそれだけ。休日は平日に取りたい。農繁期にはまた考える。

2007/02/26 (Mon)
　ぷらとわトップイメージのラフ切ったり。風雅、舞いは用語も併設します。
夕方にウォーキングしてまた寝る。

2007/02/27 (Tue)
　ロボットの絵を描くもうまくいかず。3DCGの前に手描きできるようにした
い。あとはぷらとわやほとはー外伝３のを。そしてそのまま寝るのは？

2007/02/28 (Wed)
　横浜へ歩いていく。新しい眼鏡購入。あと文具とかコミックス買ってあと
はぐだー。

2007/03/01 (Thu)
　ほとはー外伝３、来週月曜分完成。あとはかぶろぐプロフィール追加や
お金周りや書類の送付とか。３月の予定と創作系のペンディング。

2007/03/02 (Fri)
　ダメな日。短編小説書いたりとか。食べまくり。おしごとは明日する予定。

2007/03/03 (Sat)
　二度寝を防ぐため目覚まし予約。かなりぐだぐだ。Jリーグ観たり
ほとはー外伝３のネーム切ったり。余裕はあるけど。


////////////////////////////////////////////////////////////////////
// かぶろぐ。
http://d.hatena.ne.jp/kab_studio/

2007/02/25 (Sun)
http://d.hatena.ne.jp/kab_studio/20070225
起きた。
[KAB-studio]ぷらとわ追加。
[KAB-studio][ほとはー]ほとはー外伝３ P.91
[アニメ]獣拳戦隊ゲキレンジャー 第2話「ワキワキ！獣拳合体」
[アニメ]「牙」 第47話「迷える救世主」
[アニメ]おねがいマイメロディ〜くるくるシャッフル！〜 
　第48話「正体がわかったらイイナ！」
[アニメ]ひまわりっ！！ 第8話「つきよの森は危険がいっぱい」
[アニメ]京四郎と永遠の空 第8話「刻の目覚め」
[アニメ]神様家族 第8話「たいせつなおともだち」

2007/02/26 (Mon)
http://d.hatena.ne.jp/kab_studio/20070226
起きた。
[アニメ]金色のコルダ 第21話「もう一度、アンダンテ」
[アニメ]がくえんゆーとぴあ まなびストレート！ 
　第8話「たたかえ聖桜生徒会！」

2007/02/27 (Tue)
http://d.hatena.ne.jp/kab_studio/20070227
起きた。
[アニメ]SHUFFLE! MEMORIES 第8話「時雨亜沙 後編」
[アニメ]Pumpkin Scissors 第21話「木偶と偶像」

2007/02/28 (Wed)
http://d.hatena.ne.jp/kab_studio/20070228
起きた。
帰ってきた。
今日は買ってきた物が多すぎる。
[買][装備]眼鏡購入
[買][装備]文具購入
[買]コミックスとか
[きらら]まんがタイムきららCarat 2007年4月号
[アニメ]DEATH NOTE 第20話「姑息」
[アニメ]ネギま！？ 第22話「あいや、何やら（略）」

2007/03/01 (Thu)
http://d.hatena.ne.jp/kab_studio/20070301
起きた。
デザイン変更。
[アニメ]ロケットガール 第2話「アッセンブリ-assembly-」
[アニメ]武装錬金 第22話「決断を要す」

2007/03/02 (Fri)
http://d.hatena.ne.jp/kab_studio/20070302
起きた。
[link]人力検索はてな - 【小説の書き方を教えてください】
[食]カレー工房キュイエール
[アニメ]のだめカンタービレ 第8話
[アニメ]ひだまりスケッチ 第8話「3月13日 3％の希望」
[アニメ]セイントオクトーバー 
　第9話「ロリ潜入！その時、TVに映った超大物が！」
[アニメ]すもももももも〜地上最強のヨメ〜 第20話「運命を共に」

2007/03/03 (Sat)
http://d.hatena.ne.jp/kab_studio/20070303
起きた。
[買]起床装置 DANGERBOMB CLOCK
[アニメ]デルトラクエスト 第9話「クリーンチュルナイ！」
[アニメ]おとぎ銃士 赤ずきん 第35話「封印の地へ」
[アニメ]ふしぎ星の☆ふたご姫 Gyu! 
　第48話「ハッピーの花☆シェイドの宝物」
[アニメ]コードギアス 反逆のルルーシュ 第19話「神の島」


////////////////////////////////////////////////////////////////////
// Ajaxでエロゲーを作るブログ
http://d.hatena.ne.jp/AjaxEroge/

（今週はお休みです）


////////////////////////////////////////////////////////////////////
// 風雅、舞い
http://www.kab-studio.biz/Novel/Fuga/index.html

■　第十五章　濁る澱み、清らかな血溜り　−２５−

「っ……」
「どうしたの？」
　智子はおそろおそろ尋く。
　舞は、扉から漏れる風に、奇妙な違和感を感じていた。崖の側で感じた、
警戒心を掻き立てる匂いのする空気が、焦げ茶色をした引き戸の奥から吹い
てくる。
　そのわずかに開いた扉に手を掛けてみるが、軋んだ音を上げただけで、開
くことはなかった。
「彼がいてくれたらいいんだけど……」
「ねー、ちょっと来てくれない！！？」
　智子は大声を上げて呼ぶが、返事はない。
「変ねぇ……聞こえないってことはないと思うんだけど」
　噴き付ける風が強く、家が大きいとしても、それでも届く距離だったし、
少なくとも少年の耳は聞き取れるだけの感度を持っているはずだった。
「無理矢理開けてみます」
「え？　そこまでなんで？」
　舞は答えない。自分でも理由が分からない。ただ単に、この胸くそ悪い空
気に当てられただけかもしれない。
　舞は手を上に挙げ、引き戸の上の端に力を込める。黒ずんだ木製のはめ込
みは、まず白く霜が掛かり、続いてその霜を切り裂くようにひびが入ってい
く。
「壊すつもり？」
「入り込む水蒸気をどんどん結晶化させてしまえば……ほら」
　舞は距離を取り、智子を壁の後ろへと下げさせる。はめ込みが割れ、扉が
外れる。その瞬間、扉は風に巻き上げられ、舞の脇を通って家の外へと吹き
出される。
　扉の奥には部屋があったが、それは一坪もない、部屋とも呼べない狭さの
部屋だった。
　その部屋に床はなく、石でできた床があり、その中央に大きな穴が空いて
いた。風はそこから吹き出し、部屋をのぞき込む舞達を押しとどめようとし
ていた。
「……厠？」
「え”」
　舞は思わず顔を引く。
「……でもそういう感じじゃなさそうですけど」
　瞬間、扉の上にあった柱が、先ほどのショックか風の影響かまっぷたつに
折れる。
「えっ……」
「！　先生！」
　張力の均衡が狂い、家の柱数本が同時に折れ、板張りの床が水面のように
跳ね上がる。
「な――」
　智子を抱きしめながら、舞は、その床の下にある、底知れぬ虚無に恐怖し
ながら飲み込まれた。
                                                              (続く)

////////////////////////////////////////////////////////////////////
// JavaA2Z
http://www.kab-studio.biz/Programing/JavaA2Z/index.html

■追加・更新単語

（今週の追加はありません）


////////////////////////////////////////////////////////////////////
// #pragma twice
http://www.kab-studio.biz/Programing/PragmaTwice/index.html

　Version 18.10
iostream と std::string

「前回はイベントハンドラをメンバ関数に分けてみました」
『ああすると MFC っぽくて分かりやすいね』
「さて今回は、その分けた部分のひとつ、 OnEqual() メンバ関数の話」
『 = ボタン押したときのイベントハンドラだね』
「これまで、このメンバ関数では C ランタイムライブラリを使っていまし
たが、これを Version 5.09 ( No.074 ) とかで使用した iostream 系の
クラスを使ってみます」
『あー、あの >> とか << 使うやつね』
「加えて、今回は std::string クラスという、 CString クラスの代わりに
なるクラスも紹介します」
『ええっ、そんな便利なクラスがあるの！？　それがあれば CString クラス
いらないじゃん！』
「そういうこと。これや iostream 系クラスが使いこなせるようになれば、
MFC の必要性がかなり減ってくるかな」
『……？　iostream って MFC と関係ある？』
「あるよ。 OnEqual() メンバ関数を見てみて。エディットボックスから
文字列取り出して、それを数値に変換して、計算結果を文字列に変換して、
エディットボックスにセットする、ってしてるでしょ」
『そか、 MFC だとそういうのって ClassWizard でメンバ変数と結びつけ
ちゃえば気にしなくていいんだもんね』
「そう、 Version 3.10 ( No.035 ) の時みたいに、エディットボックスと
ダイアログクラスのメンバ変数を結びつけちゃえば、 
UpdateData() メンバ関数で簡単に変換できるのが MFC 」
『それを手作業でしなきゃいけない……』
「 iostream 系クラスを使うことで、その辺が少し楽になるかな」
『少しぃ？』
「ま、それは次回もう少し改善されるから」
『？』
「さて、まずは修正後のプログラムを見てみてください」

// NewCalcDialog.cpp
#include <Windows.h>
#include <stdio.h>
#include <string>    // この行を追加。
#include <sstream>    // この行を追加。
#include <strstream>    // この行を追加。
#include "resource.h"
#include "Dialog.h"
#include "NewCalcDialog.h"

// 略

// = ボタンが押された時のイベントハンドラ。
void CNewCalcDialog::OnEqual()
{
    // 各エディットボックスのウィンドウハンドルを取得します。
    HWND hLeftWnd = GetDlgItem( m_hWnd, IDC_E_LEFT );
    HWND hRightWnd = GetDlgItem( m_hWnd, IDC_E_RIGHT );
    HWND hAnswerWnd = GetDlgItem( m_hWnd, IDC_E_ANSWER );

    // 各エディットボックス用文字列を用意します。
    char pchLeft[256];
    char pchRight[256];

    // IDC_E_LEFT と IDC_E_RIGHT の文字列を取得します。
    GetWindowText( hLeftWnd, pchLeft, 255 );
    GetWindowText( hRightWnd, pchRight, 255 );

    // 文字列から数値として取り出すためのストリームを用意します。
    std::istrstream cIStrStreamLeft( pchLeft );
    std::istrstream cIStrStreamRight( pchRight );

    // それぞれ int 型に変換します。
    int iLeft;
    int iRight;
    cIStrStreamLeft >> iLeft;
    cIStrStreamRight >> iRight;

    // 入力チェックを行います。
    if    ( 
            ( cIStrStreamLeft.fail() ) ||
            ( cIStrStreamRight.fail() )
        )
    {
        MessageBox
            ( m_hWnd
            , "入力に誤りがあります。"
            , "エラー"
            , MB_OK
            );
        return;
    }

    // 文字列変換するためのストリームを用意します。
    std::ostringstream cOStringStream;

    // 足した結果を文字列変換します。
    cOStringStream << ( iLeft + iRight );

    // 中にある std::string クラスの、参照を取り出します。
    std::string &rcStringAnswer = cOStringStream.str();

    // それを IDC_E_ANSWER にセットします。
    SetWindowText( hAnswerWnd, rcStringAnswer.data() );
}

『なんかだいぶ違うね……』
「まずは、3つのファイルをインクルードします」

#include <string>    // この行を追加。
#include <sstream>    // この行を追加。
#include <strstream>    // この行を追加。

「 Version 5.09 ( No.074 ) で説明したように、 iostream 系クラスや
std::string クラスが入っている【 C++ 標準ライブラリ】の
ヘッダーファイルは〈 .h 〉がついてないからね」
『やっぱり違和感があるねこれ……』
「次に OnEqual() メンバ関数を見てみます。まず最初の、 
GetWindowText() 関数でエディットボックスから文字列を取得する所までは
同じ」
『んー、ここってもう少しなんとかなんない？』
「今のところちょっと無理だね。あとで紹介する std::string クラスには、
CString クラスの GetBuffer() メンバ関数にあたるものがないっていうの
もあるかな」
『 Version 11.08 ( No.208 ) のあれね。でも ReleaseBuffer() メンバ関数
も呼ばなきゃいけないから結構めんどいよね……』
「次に、 Version 5.17 ( No.082 ) で紹介した std::istrstream クラスを
使って、 int 型の整数値として取り出します」

    // 文字列から数値として取り出すためのストリームを用意します。
    std::istrstream cIStrStreamLeft( pchLeft );
    std::istrstream cIStrStreamRight( pchRight );

    // それぞれ int 型に変換します。
    int iLeft;
    int iRight;
    cIStrStreamLeft >> iLeft;
    cIStrStreamRight >> iRight;

『あー、そういえばこういうの使った！』
「まず std::istrstream クラスの変数を作ります。その際、引数に対象の
文字列を渡します」
『あれ？　前使った時って第2引数に文字列の長さを渡してたよね。今回は
必要ないの？』
「うん、そのときは ReadFile() 関数でファイルから取り出した文字列を
直接渡していて、それだと \0 で文字列の最後が閉じられていないから指定
する必要があったんです」
『普通の文字列だと絶対 \0 が最後にあるけど、 ReadFile() 関数で取り出
すとそうじゃないんだ』
「バイナリー形式で取得するだけだからね。でも今回は普通の文字列を使う
からその必要はないんです」
『なんかややこしい……』
「でも長さ指定しなくていいから簡単でしょ」
『まぁそりゃそうだけど』
「で、そのあと >> で中にある整数値を取り出します」
『これは簡単ねー』
「取り出したら、ちゃんと取り出せたか fail() メンバ関数でチェックしま
す」

    // 入力チェックを行います。
    if    ( 
            ( cIStrStreamLeft.fail() ) ||
            ( cIStrStreamRight.fail() )
        )
    {
        MessageBox
            ( m_hWnd
            , "入力に誤りがあります。"
            , "エラー"
            , MB_OK
            );
        return;
    }

「 fail() メンバ関数を呼び出すと、直前の入出力でエラーがあったかわか
ります。エラーがあると TRUE が返されます」
『これって必要？』
「とても必要。たとえば文字列が入力されたときや、 int 型に入りきらな
い長さの数字が入力されていたときには、計算すると変な結果になっちゃう
からね」
『そか、そういう入力チェックが必要なんだ』
「実際、 C ランタイムライブラリの atoi() 関数だとこの入力チェックが
できないから、そのためにもこの std::istrstream クラスを使うべきかも
ね」
『はーい』
「入力値の取り出しとチェックができたら、今度は文字列化します」

    // 文字列変換するためのストリームを用意します。
    std::ostringstream cOStringStream;

    // 足した結果を文字列変換します。
    cOStringStream << ( iLeft + iRight );

『ん、なんか似てる……けど、初めてみる書き方かも』
「まず std::ostringstream クラスから。このクラスは初めて紹介する
クラスです。中に文字列を持っていて、そこに他の文字列や int 型や
double 型の値をどんどん追加することができるクラスです」
『便利そう！』
「使い方は簡単。まずこのクラスの変数を作って、その変数に << 演算子を
使って渡せばOK 」
『なるほど、さっきは取り出す方だったから >> 使ったけど、今度は << を
使えばいいわけね。 sprintf() 関数と違って "%d" みたいに型を教える必要
ないのも楽そう』
「この std::ostringstream クラスの中には、 std::string クラスが入って
ます」
『お、やっと出てきた！』
「このクラスは CString クラスと同じように文字列を中に入れることがで
きて、しかも長さが自由に変わります」
『つまり配列と違ってどんどん文字列を入れられるわけね。ってことはこの 
std::ostringstream クラスも長さを気にする必要がないんだ』
「そういうこと。で、この std::ostringstream クラスの中には 
std::string クラスのメンバ変数があって、その参照を str() メンバ関数
で取り出すことができます」

    // 中にある std::string クラスの、参照を取り出します。
    std::string &rcStringAnswer = cOStringStream.str();

『参照ってあまり使ってなかったからなんか懐かしい……』
「参照については Version 3.22 ( No.047 ) を参考にしてね。これが
std::ostringstream クラスの中の std::string クラスのメンバ変数を参照
しています。で、この data() メンバ関数を呼び出すと、その中の文字列を
取り出すことができます」

    // それを IDC_E_ANSWER にセットします。
    SetWindowText( hAnswerWnd, rcStringAnswer.data() );

『 std::string クラスの data() メンバ関数で文字列を取り出せる、と』
「それを SetWindowText() 関数に渡せば完了。このようにすることで、
C ランタイムライブラリと同じ処理が C++ 標準ライブラリでできる、とい
うわけです」

/*
    Preview Next Story!
*/
『ぶー、 std::string クラスの説明が少ないー！』
「確かに……でも CString クラスと似てるから大丈夫だと思うよ」
『 + 演算子のオーバーロードとかあるの？』
「もちろん」
『なら大丈夫』
「というわけで次回」
＜ Version 18.11 コントロールとデータのやりとりをするクラスを作る ＞
『につづく！』
「大丈夫なら次に進めるね」
『えっ、いやそういうのはちょっと』


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

・このメールを返信しないでください。
・ご意見・ご希望・ご感想は[チョー普通な日記]よりお送りください。
http://www.kab-studio.biz/nikki2/index.html
・購読登録を解除したいときにはこのページで行なってください。
http://www.mag2.com/m/0000012198.htm
・解除は自分で行なってください。
・バックナンバーはこれらのページにあります。
http://backno.mag2.com/reader/Back?id=0000012198
http://www.kab-studio.biz/Freeware/index.html#MailMagazine


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

    (C)KAB-studio 1999 - 2007 ALL RIGHTS RESERVED.
        http://www.kab-studio.biz/
        info@mail.kab-studio.biz
*/
////////////////////////////////////////////////////////////////////

