エンバカデロによる買収が決まったCodeGearですが、個人的には応援しています。
Delphi は使いやすく、情報も豊富なのですが、私はとっくに Pascal よりも C++ に慣れてしまったので、できれば C++ Builder をメインに使いたいところです。
Delphi の参考書や資料の多くは VCL について説明しているので、そのノウハウのかなりの部分は使えます。
しかし C++ Builder に固有の話題についての情報はとても少ないのが現状です。
- 作者: 佐納康治, 曽我部雄樹
- 出版社/メーカー: 秀和システム
- 発売日: 2007/09
- メディア: 単行本
- クリック: 6回
- Amazon.co.jpで詳細を見る
「Windowsプログラミング逆引きクロス大辞典」にはTurbo DelphiとTurbo C++というかたちで、VB6 や .Net との比較がなされています。
Turbo C++はC++Builderだと思って読むことができるので、CodeGear RAD Studio 2007を使う上で重宝しそうです。
Delphi で「メッセージメソッド」と呼ばれている機能の実現方法が今日やっとわかりました。忘れないように書いておきます。
mciSendString を使って mp3 ファイルを再生して、再生終了のメッセージを MCI から受け取る例です。
VCLフォームアプリケーションにボタンをひとつ貼り付けて、以下のように記述。
mmsystem.h をインクルードしないと MM_MCINOTIFY が未定義になります。
C:\tone_a.mp3 を用意してボタンを押すと、音声再生が終了したらメッセージボックスが表示されます。
//--------------------------------------------------------------------------- // Unit1.h #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> //--------------------------------------------------------------------------- // by nishimotz #include <mmsystem.h> //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE 管理のコンポーネント TButton *Button1; void __fastcall Button1Click(TObject *Sender); private: // ユーザー宣言 void __fastcall MMMCINotify(TMessage &Msg); BEGIN_MESSAGE_MAP VCL_MESSAGE_HANDLER(MM_MCINOTIFY, TMessage, MMMCINotify) END_MESSAGE_MAP(TForm); public: // ユーザー宣言 __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif
//--------------------------------------------------------------------------- // Unit1.cpp #include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { mciSendString("open \"c:\\tone_a.mp3\" type Mpegvideo alias mp3", NULL, 0, 0); mciSendString("play mp3 notify", NULL, 0, Form1->Handle); } //--------------------------------------------------------------------------- void __fastcall TForm1::MMMCINotify(TMessage &Msg) { ShowMessage("done."); mciSendString("close mp3", NULL, 0, 0); }
END_MESSAGE_MAP(TForm) の後ろのセミコロンを忘れて、しばらくはまりました。
VCL_MESSAGE_HANDLER に関する情報は RAD Studio のヘルプでも CodeGear のサイトでも見つけることができず、個人の方のウェブサイトを参考にさせていただきました。