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

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

    送信日： 2000/02/28(Mon) No.046
    配信数： 3510（ Mag2 + Pubzine ）
＊    発行元： まぐまぐ( URL: http://www.mag2.com/  ID: 0000012198 )
＊    発行元： Pubzine( URL: http://www.pubzine.com/  ID: 590 )
*/


/*              ２０００年２月２８日（月）の更新                  */
http://www2.justnet.ne.jp/~kabstudio/Info/News/

・更新なし。
　更新はありませーん。ま、来週のごたごたを前にした、嵐の前の静けさっ
てことで。


/*                        チョー普通な日記                        */
http://www2.justnet.ne.jp/~kabstudio/nikki2/

２０００年２月２０日（日）：
　かぶヘッダーの送信予約関連で忙しいって感じ。

２０００年２月２１日（月）：
　毎年恒例（？）、この日記のどんなとこが面白いのか大募集！

２０００年２月２２日（火）：
　の解答。どうやら「プログラマーでアニメ好き」に好評らしい。やっぱア
ニメっすよねー＜バカ。

２０００年２月２３日（水）：
　さらに「なんで面白いのか」な話。なんかわてはバイタリティある人らし
い（汗）。うむ、意外な解答。

２０００年２月２４日（木）：
　Pubzine と まぐまぐの大きな違い。それは……。だから新メルマガはま
ぐまぐでのみの配信になるのです……。そして波紋を呼ぶあずまんが情報。

２０００年２月２５日（金）：
　さらにあずまんが。あずまきよひこ作品を見たことがない人、とりあえず
インターネットで「ワニの話」を読みましょう＜だからワニの話ちゃうて。
あとアニメ。

２０００年２月２６日（土）：
　イラストって難しいねって話。ほんと難しいです。あと新メルマガの裏話
とか。


/*                         鏑矢の憂鬱                             */
http://www2.justnet.ne.jp/~kabstudio/Programing/KabuU/

２０００年２月２０日（日）：
C マガジンのテスト
C++ 編
static_cast と dynamic_cast は逆なのでは
最後の例外の問題が全滅
あやふやな部分が多かった
お便り
72 点
意味が解ってるってことの方が大事だと思う

２０００年２月２１日（月）：
Perl プログラミング
引っ越し用にホームページを変換するスクリプト
メールアドレスと URL の置換
<BODY> タグの直後にアクセスログを設置
正規表現って不思議
解りやすいコードってなんだろう
glob() がうまく働かなかった

２０００年２月２２日（火）：
ぷらとわ書き
#pragma twice は全 3 年、 150 話を予定
商業主義じゃないからできること
だからこそ「すべて」を教えられる
CGI で辞書の検索システム組むかも
文字コード処理とかが必要か

２０００年２月２３日（水）：
Perl プログラミング
辞書の単語数をカウントするスクリプト
300 単語を超える
皆さんの投稿のおかげでセーブできる
仮想フォルダ内のファイルのアイコンの取得方法
COM を使うのが最適だけど
たいがいのものはレジストリに書き込まれている
デスクトップとコントロールパネル
COM インターフェイスを使えばシームレスに処理できる

２０００年２月２４日（木）：
引っ越しの準備
ホームページのバックアップを作成
Perl スクリプトに掛けて一括変換
一部アクセスログがセットできないページが見つかる
マッチ演算子の最後に s を付けていなかったため
Java スクリプトも取り除く
これはコメントアウトのおかげ

２０００年２月２５日（金）：
本格的に STL & iostream 入門を執筆開始
４月から配信する新メールマガジン
サンプルプログラムは VC と gcc for Win32 もコンパイルチェック
本当は UNIX 系でチェックした方がいい
「 STL & iostream 入門」って名前、長い

２０００年２月２６日（土）：
Perl
Perl スクリプトから作ったファイルはユーザーが違う
VB は持っていないので、 VB 関連の質問には答えられない
それって結構不安
就職先はパッケージアプリを作る所にしたい


/*                       今週の追加単語                           */
http://www2.justnet.ne.jp/~kabstudio/Programing/Dictionary/

・追加単語：
SDI MDI CGI ビット フラグ ビットフラグ オーバーヘッド ハンガリー記法 
ODBC プロトタイプ is-a 関係 has-a 関係 システム システムフォルダ 
DDB DIB タスクバー タスクトレイ

・更改単語：
抽象クラス

・今週のごめんなさい
クラス レジストリ ビット判定 CCheckListBox dll マーシャリング 
システムフォルダを探す方法 関数のポインタ intcmp 
抽象クラスの項について

　今週は結構多いですね。ちなみに今回で総単語数が３００を超えました。
ってゆーか、こんだけ知らないとプログラミングできないんだとすれば、
プログラマーって大変な仕事やね……。


---------------------------------------------[かぶスタＣＭ]---------
　初めて聞いたって人も
　難しそうで使ったことないって人も
　難しかった使えなかったって人も
　STL & iostream 入門 スタート間近！
---------------------------------------------[かぶスタＣＭでした]---

/*                       #pragma twice                            */
http://www2.justnet.ne.jp/~kabstudio/Programing/PragmaTwice/

　Version 3.21
イベントハンドラ


『さて前回は安全性について見てみました』
「そのネタは今回不可。さて問題。火美ちゃんが〈プログラムとして〉書き
込んだのはどこ？」
『プログラムとしてって？』
「つまり【バージョン情報】とか【ダイアログ】以外ってこと」
『あー。んっと、もーなんども使ってる CCalcDlg::OnBEqual() の中と、最
近よく使う CCalcApp::InitInstance() の中』
「そうでした。このふたつのメンバ関数ってどういう意味だっけ」
『 OnBEqual() はボタン押したとき、 InitInstance() は確か、アプリが実
行されたときに呼ばれるんだよね』
「そうそう。でもなんで InitInstance() にプログラムを書こうって決めた
のかな？」
『自分の頭で』
「そうそう物事は自分で決めなあかんねってそうじゃなくって」
『確か最初っから作られてたプログラムの中で、ほら、 CCalcDlg 作ったり、
戻り値チェックしてOKボタン押されたとかのプログラムがあったからじゃな
い？』
「そのとおり！　つまり、火美ちゃんのプログラムは〈あらかじめ VC が作
ってくれたプログラムにちょっと手を加えただけ〉なわけ」
『ま、確かにそういうことになるよ、ねぇ』
「しかし！」
『しかし？』
「このふたつのメンバ関数、クラスが違うでしょ」
『うん違う。 CCalcDlg と CCalcApp だもんね』
「でも InitInstance() の中でしてる〈レジストリと変数のやりとり〉って、
本当はダイアログ側の仕事じゃない？」
『そう言われてみればそうかも。だって OnBEqual() ってボタン押したとき
のでしょ？　なのに【OK】ボタンだけ特別扱いって変じゃない？』
「そこで今回は CCalcApp::InitInstance() に書いたプログラムを CCalcDlg
へと移します！」
『……ええっ！？　そんなことできるの？』
「できるのって思うでしょ。それが大事」
『どゆこと？』
「プログラムって、実はとっても自由度が高いから、たいがいのことはでき
るんだけど、それが最初は分かんないんだよね」
『もちろん、知らないんだから。あ、つまり知ればできる？』
「そゆこと。ただ単に VC が作ったプログラムに書き加えるだけじゃなくて、
どういうプログラムが組めるのか、本当はどういう仕組みになっているのか、
ってことを知ることが大事」
『って前もそんなこと言ってたね』
「まーね、それが一番の柱だから。というわけで、具体的にプログラムを組
んで試してみましょう」
『おー！』
「さて、まず〈ダイアログを表示するときに【Ans】エディットボックスに 
10000 という数字を入れる〉ってことを考えてみます」
『レジストリは？』
「それはあと。プログラムは」
『簡単なことの積み重ね、だね』
「そゆこと」
『じゃーえっと、まず CCalcApp::InitInstance() の代わりになる CCalcDlg
のメンバ関数を……どうするの？』
「 CCalcApp::InitInstance() の中でも〈あらかじめ数字を入れとく〉って
いうのは、ダイアログが表示される直前でしょ。つまり〈ダイアログが表示
される直前に呼ばれるメンバ関数〉があればいいわけ」
『なるほど。アプリが実行されたら呼ばれる CCalcApp::InitInstance() 、
ボタンを押されたら呼ばれる CCalcDlg::OnBEqual() 、みたいにね』
「ちなみにこういう〈タラレバ〉を〈イベント〉、呼ばれるメンバ関数を
〈イベントハンドラ〉って言います」
『？』
「〈ダイアログが表示される〉とか〈ボタンが押される〉とかを〈イベント〉
って言います」
『あー、本日のメーンイベントーっ！　ってヤツ？』
「そうそれ。日本語に訳せば〈出来事〉ってとこかな。で、そのイベントに
対応するメンバ関数を〈イベントハンドラ>って言います」
『ハンドラ？』
「英語で書けば Handler 。車のハンドルの er 付けたの。つまり〈操作す
るもの〉ってとこだね」
『ボタンを押したってイベントがあって、それを操作するメンバ関数、イベ
ントハンドラが CCalcDlg::OnBEqual() なんだ』
「そういうこと」
『……そう言えばさ』
「さて次」
『質問！』
「却下します」
『……ねー、前に〈ハンドル〉って出てきたじゃない、 HWND とか』
「あー……」
『あれとどういう関係が』
「ぜんっぜんありません！！」
『はひ？』
「確かに英語としての元の意味は同じだけど、ハンドルとハンドラはぜんっ
ぜん違うものです。ここんとこ絶対に間違えないように」
『は、はぁ……あ、だから触れたくなかったってこと？』
「まーそういうこと。プログラミングには〈似てるけど違うもの〉って多く
てね、そういうのを見分けるのが大事」
『だったらちゃんと教えてくれないと〜』
「……そうかも。さて話を戻して……」
『〈ダイアログが表示される直前に呼ばれるメンバ関数〉がなんなのか、で
しょ』
「そうそう。自分で調べてみ？」
『ってことは見つかりやすいってことなのかな。えっと、困ったときの 
MSDN！　んーと、 CCalcDlg のを見ればあるかなぁ……』
　MSDN を開き、キーワードに CCalcDlg と入力。
『ないじゃん』
「おいおーい」
『あ、はいはいはい、 CCalcDlg は CDialog から作ったカスタマイズクラ
スだもんね。えっと、 CDialog っと』
　【CDialog クラスメンバ】のページを表示する。
『んー……ああっ！！　OnInitDialog() なんてそれっぽくない？　【ダイ
アログ ボックスの初期化】とか書いてあるし！』
「大当たり！　実はそれが、初期化用の関数です」
『でもなに、〈オーバーライド〉とかって。どう使えばいいのかな……』
「思い出してみれば？」
『思い出す、ってことは使ったことがあると。えーっと……あ』
　エディタに CalcDlg.cpp を表示させスクロール。
『あった！　なんだ、最初っからあるんだ』
「ダイアログにアイコンをセットする処理とか用に、 VC が作ってたわけ」
『いたれりつくせり。んじゃプログラム書いちゃおう！　って……』
「なにすんだっけ？」
『答に数字入れる！　えーっと、 CCalcApp::InitInstance() の時は』

    dlg.m_iAns = GetProfileInt( cDialogStr, cAnsStr, 0 );

『って感じになってて、これを 10000 に置き換えると……』

    dlg.m_iAns = 10000;

『だよね』
「そうそう」
『で、 CCalcDlg::OnInitDialog() を眺めてみるとですねぇ……』

BOOL CCalcDlg::OnInitDialog()
{
// 略
    // TODO: 特別な初期化を行う時はこの場所に追加してください。

    return TRUE;  // TRUE を返すと（略）。
}

『ってことはやっぱこの TODO んとこでしょ！』
「おおっ分かってきたねー」
『じゃーそのまんま書いて……』

    // TODO: 特別な初期化を行う時はこの場所に追加してください。
    dlg.m_iAns = 10000;

『かな？』
「ふたつ間違い」
『ええっ！？』
「ま、とりあえずビルドしてみるとか」
『ぶー』

error C2065: 'dlg' : 定義されていない識別子です。

『定義されてない、ってことは……』
「 dlg なんて変数どこにもないでしょ」
『あそっか、 dlg って CCalcApp::InitInstance() の中で作ったんだもん
ね。……ってことはどうすればいいのぉ！？』
「 dlg ってなに？」
『 CCalcDlg の変数』
「 CCalcDlg::OnInitDialog() は？」
『 CCalcDlg のメンバ関数』
「さらに、 CCalcDlg::OnBEqual() をもう一度見てみましょう」

void CCalcDlg::OnBEqual() 
{
    UpdateData( TRUE );
    m_iAns = m_iLh + m_iRh;
    UpdateData( FALSE );
}

『 m_iAns ……あーっそう言えば、 m_iAns と dlg.m_iAns って同じもんな
んだもんね！』
「思い出した？　Ver 3.18 ( No.043 )で見たでしょ」
『見たってゆーか、あのときは逆に考えてたんだよね。 CCalcDlg の中のメ
ンバ変数を、外からどうすればいいのかって』
「この辺って、何気なく考えると普通だけど、よく考えるとこんがらがるで
しょ」
『うんなるー』
「考えるコツは、 CCalcDlg なんてない、ってとこかな」
『どゆこと？』
「 CCalcDlg はただの鋳型、つまり原型。実際に存在するのは dlg とかの
変数ってこと」
『つまり？』
「つまり CCalcDlg::OnBEqual() の中だったら、〈 CCalcDlg の中〉じゃな
くて〈 dlg の中〉って考えれば分かりやすいってこと」
『 CCalcDlg::OnInitDialog() も、ついさっき CCalcApp::InitInstance() 
で作られた dlg って変数の中って考えればいいってことね。だったらそんな
かの m_iAns も dlg.m_iAns も同じはずってことか』
「そういうふうに考えれば、あんまり混乱せずに済むかな。さてプログラム
の方は？」
『あ、ってことは……』

    // TODO: 特別な初期化を行う時はこの場所に追加してください。
    m_iAns = 10000;

『って感じに dlg は要らないってことね。でももうひとつの間違いって？』
「もう１行追加」

    // TODO: 特別な初期化を行う時はこの場所に追加してください。
    m_iAns = 10000;
    UpdateData( FALSE );

『あ、 UpdateData( FALSE ) って、メンバ変数のを、ダイアログに書き込
むのだよね』
「 CCalcDlg::OnInitDialog() が呼ばれる前にセットすれば自動的に書き込
まれるんだけど、呼ばれたあとは UpdateData( FALSE ) を呼ばないとダメ」
『なんかめんど。ま、ビルドして実行！　うん、答に 10000 ！』

/*
    Preview Next Story!
*/
『あとはレジストリの移せばいいから簡単ねー』
「それはどうかな？」
『げげ。なんか最近水希ちゃんいじわるだよ？』
「そう？」
『というわけで次回』
＜ Version 3.22 参照を作ろう！ ＞
「につづく！！」
『意地悪イジワル〜』
「だって火美ちゃん教えがいあるから」
『〈調教しがい〉の間違いじゃない？』
「だからそーゆーの禁止〜」


/*                       金菜さんの憂鬱                           */
http://www2.justnet.ne.jp/~kabstudio/Programing/KanaU/

アプリのツボ
#09 圧縮解凍 その２

　圧縮解凍に必要なアルゴリズムは、基本的にどっからか拾ってきます。
　たいがいのアルゴリズムは、プログラムのソースコードとして公開されて
います。比較的広まってるフォーマットで圧縮解凍したいときには、その
ソースコードを拾ってきてプログラムに組み込めばいいって事ね。
　この方法はひとつの実行ファイルに全部入ってるから、配布が楽っていう
反面、ファイルサイズが大きくなるし、違うフォーマットへの対応が大変っ
ていう問題もあるでしょ。というわけで、最近の主流はプラグイン方式。

　プラグインは具体的には DLL のこと。 DLL の中にアルゴリズムを含む関
数が入ってて、プラグインを使う側は DLL を動的にリンクして関数を呼び
出します。
　普通、プラグインはアプリ側では用意しません。プラグインに接続する
コードを書いて、そのままリリース。で使う側がプラグインを用意して、ア
プリを実行してそのプラグインを使ってもらう、って形になります。
　でもこの方法、プラグインを用意するのが大変っていうのも結構あるのよ
ね。そういう点はデメリットかな。

　あと、アルゴリズムには著作権や特許とかが絡んでて、どれもタダで使え
るとは限らないのよね。 gif とかがそう。この辺は特に注意してね。プラ
グインとして提供されていてもダメな時とかあるかもしれないし。

　こういうのとは別に、自分で作った圧縮アルゴリズムを使ってももちろん
いいのよ。「他のものより圧縮率が高い！」とかをウリにした、そういうア
プリが結構あるし。これもひとつの方法ね。
　って言っても、もちろん「自分が作った」っていうのは勘違いで、すでに
誰かが作って特許が取られたりしてる可能性もあるから注意しなきゃね。
　さて、今回出てきたプラグイン。これはどう作るんでしょう。それは来週。
じゃね。


/*            ２０００年３月６日（月）の更新予定                  */
http://www2.justnet.ne.jp/~kabstudio/Info/News/

・ＫＡＢ−ｓｔｕｄｉｏ、引越！
　３月６日、ＫＡＢ−ｓｔｕｄｉｏは引っ越します。
　引っ越し先は http://www.kab-studio.com/ 。リンクを張ってくださって
いる方は、暇なときにでも変更してください。
　新しいメールアドレスは info@kab-studio.com 。今日からメールはこち
らのアドレスへと送ってください。
　引っ越し後は、旧ページを登録していたサイト（まぐまぐとかヤフーとか）
に新ページのアドレスで登録を更新して、この手続きがすべて完了したら古
いアドレスの各ページを削除していくつもりです。実際、今回は引越のシス
テム上、旧アドレスには３ヶ月しかファイルが残らないため、短期間のうち
に「移動」することになります。
　というわけで、引越が完全に完了するまでの間、色々とご迷惑をお掛けす
ると思いますが、何卒ご容赦ください。

・表紙を３月バージョンに。
　毎月恒例、新しい表紙です。今回はちゃーんと背景の入った、かなり気合
いの入ったのに挑戦中＜「中」ですか。


/*                          ご注意！！                            */

・このメールを返信しないでください。
・ご意見・ご希望・ご感想は[チョー普通な日記]よりお送りください。
http://www2.justnet.ne.jp/~kabstudio/nikki2/
・プログラミングに関する質問は[鏑矢の憂鬱]にお送りください。
http://www2.justnet.ne.jp/~kabstudio/Programing/KabuU/
・購読登録を解除したいときにはこのページで行なってください。
＊http://www.mag2.com/m/0000012198.htm
＊http://www.pubzine.com/detail.asp?id=000590
・解除は自分で行なってください。
・バックナンバーはこれらのページにあります。
http://bigbeat.tegami.com/~mgsearch/frame.cgi?id=0000012198
http://www2.justnet.ne.jp/~kabstudio/Freeware/

/*
    KAB-studio.h
    Weekly Mail Magazine.
    Written by Kaburaya Seiden.

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


/*                      See you next week!!                      */


