Delphi は、Borland Company のオブジェクト指向ビジュアル ソフトウェア開発ツールです。 Delphi は、Visual C++ と Visual Basic の両方の利点を兼ね備えており、使いやすく強力で、特にインターフェイス設計、データベース プログラミング、ネットワーク プログラミングにおいて独自の利点を備えています。
Delphi のメッセージ
メッセージは、イベントが発生したことをアプリケーションに伝える Windows によって送信される通知です。 Delphi では、ほとんどの場合、Windows メッセージは、対応する VCL イベントを処理するだけで済みます。ただし、独自のコントロールを作成したり、メッセージをインターセプトしたり、フィルタしたりする必要がある場合は、Win32 のメッセージ処理メカニズムを詳しく調べる必要があります。
Delphi では、メッセージは TMessage レコードの形式で定義されます。 Message.pas ファイルを開くと、Tmessage が次のように定義されていることがわかります。
タイプ
TMessage = パックされたレコード
メッセージ: 枢機卿。
case 整数
0: (WParam: 倍長整数;
LParam: 倍長整数。
結果: 倍長整数);
1: (WParamLo: 単語;
WParamHi: 単語;
LParamLo: 単語;
LParamHi: 単語;
結果Lo: 単語;
結果Hi: Word);
終わり;
このうち、Msg は他のメッセージとは異なる定数値です。これらの定数値は、Windows 単位であらかじめ定義された定数またはユーザー定義の定数を使用できます。通常、Wparam はメッセージに関連する定数値であるか、ウィンドウまたはコントロールへのハンドルである場合もあります。 LParam は通常、メモリ内のデータへのポインタです。
Result はメッセージ処理の戻り値です。 Wparam、Lparam、および Result はすべて 32 ビットで、下位 16 ビットまたは上位 16 ビットにアクセスする場合は、それぞれ WparamLo、WparamHi、LParamLo、LparamHi、ResultLo、および ResultHi を使用できます。
一般的な Tmessage に加えて、Delphi では Windows ごとに特別なメッセージ レコードが定義されます。 Message.pas ファイルを参照できます。キーボード メッセージ レコードは次のとおりです。
TWMKey = パックされたレコード
メッセージ: 枢機卿。
文字コード: 単語;
未使用: ワード。
KeyData: 倍長整数;
結果: 倍長整数。
WM_KEYDOWN、WM_KEYUP、WM_CHAR、WM_SYSKEYDOWN、WM_SYSKEYUP、WM_SYSCHAR レコードなどのキーボード関連のメッセージも TWMkey として定義されます。 Message.pas ファイルには次のステートメントがあります。
TWMChar=TWMkeyDown=
TWMキー; TWMキーアップ=TWMSys;
-KeyDown=TWMkeyUp=
TWMkey;TWMSysChar=TWMkey;
メッセージの送信
メッセージ処理は、アプリケーションが Windows メッセージにどのように応答するかを定義することです。 Delphi では、各メッセージには独自の処理プロセスがあり、オブジェクト内のメソッドである必要があり、1 つの Tmessage またはその他の特別なメッセージ レコードのみを渡すことができます。メソッド宣言の後にメッセージ コマンドが続き、その後に 0 からの範囲のメッセージが続く必要があります。 32767 の間の定数にします。
前に説明したメッセージはすべて標準の Windows メッセージ (WM_X) です。さらに、VCL の内部メッセージ、通知メッセージ、およびユーザー定義のメッセージもあります。
VCL 内部メッセージは通常「CM_」で始まり、VCL 内の内容を管理するために使用されます。コンポーネントのプロパティ値やその他の特性を変更した場合は、内部メッセージを通じて他のコンポーネントに変更を通知する必要があります。たとえば、入力フォーカスのアクティブ化メッセージは、入力フォーカスを受け入れるか放棄するために、アクティブ化または非アクティブ化されたコンポーネントに送信されます。
ウィンドウ内の子コントロールで何かが発生した場合は、通知メッセージを通じて親ウィンドウに通知する必要があります。ボタン、リスト ボックス、編集ボックスなどの標準ウィンドウ コントロールでのみ機能します。 Windows の標準の通知メッセージの宣言の後に、Message.pas ファイルを開きます。
定数
{$EXTERNALSYM BN_CLICKED}
BN_CLICKED = 0;
{$EXTERNALSYM BN_PAINT}
BN_PAINT = 1;
{$EXTERNALSYM BN_HILITE}
BN_HILITE = 2;
上記はボタンの通知メッセージで、それぞれユーザーがボタンをクリックしたこと、ボタンを再描画する必要があること、およびユーザーがボタンを強調表示したことを示します。
ユーザーは、独自のメッセージを定義したり、自分自身にメッセージを送信したり、メッセージ処理プロシージャを作成したりすることもできます。メッセージの定数値は WM_USER+100 ~ $7FFF です。この範囲は Windows によってユーザー定義メッセージ用に予約されています。
Delphi メッセージを送信するには 3 つの方法があります。
1. Tcontrolクラスのオブジェクトメソッドを実行します。フォームまたはコントロールのインスタンスを知っているだけで、任意のフォームまたはコントロールにメッセージを送信できます。その声明は次のとおりです。
関数 Tcontrol.Perform(Msg:Cardinal;Wparam,Lparam:Longint):Longint
2. Windows API 関数 SendMessage() および Postmessage()。その声明は次のとおりです。
関数 SendMessage(hWnd: HWND; メッセージ: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
関数 SendMessage(hWnd: HWND; メッセージ: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
PostMessage 関数は、アプリケーションのメッセージ キューにメッセージを追加します。アプリケーションのメッセージ ループは、登録されたメッセージをメッセージ キューから抽出し、対応するウィンドウに送信します。
SendMessage 関数は、メッセージ キューを介してウィンドウ プロシージャにメッセージを直接送信できます。したがって、Windows が値をすぐに返す必要がある場合は SendMessage が使用され、さまざまなアプリケーションがメッセージを順番に処理する必要がある場合は PostMessage が使用されます。 Perform は基本的に SendMessage に似ており、ウィンドウ プロシージャに直接送信されます。 SendMessage 関数と Postmessage 関数は、メッセージを送信するためにウィンドウのハンドルを知っていればよいため、Delphi 以外のフォームにメッセージを送信できますが、Perform はフォームまたはコントロールのインスタンスを知っている必要があります。
VCL メッセージ処理メカニズム
Delphi アプリケーションのソース コードには、ステートメント application.Run があります。その機能は、メッセージ ループを開始し、Application.PROcessMessage を呼び出すことです。この関数は、アプリケーションのメッセージ キュー内のメッセージを検索します。メッセージがメッセージ キューから取得されると、Application.OnMessage イベントがトリガーされます。このように、Windows 自体がメッセージを処理する前に、OnMessage イベントの処理に応答します。これは、どのメッセージ処理よりも優れており、登録されたメッセージ、つまり上記のように PostMessage によって送信されたメッセージのみを受信します。 Application.OnMessage イベントに応答する処理プロセスは、次のように宣言される TmessageEvent 型である必要があります。
type TMessageEvent = オブジェクトのプロシージャ (var Msg: TMsg; var Handled: Boolean);
TMsg が Windows で定義されたメッセージ レコードである場合、次のように宣言できます。
プロシージャ OnMyMessage(var Msg:TMsg;var Handled:Boolean);
次に、このメソッドを Application.OnMessage イベントに割り当てます。
Application.OnMessage :=OnMyMessage;
OnMessage イベントは、アプリケーションに送信されたすべてのメッセージをキャプチャします。これは非常にビジーなイベントであるため、メッセージ処理のために OnMessage イベントの処理中にブレークポイントを設定するのは賢明ではありません。
VCL オブジェクトがメッセージを受信するために使用するメソッドは、MainWndProc と呼ばれます。これは Twincontrol クラスで定義された静的メソッドであり、オーバーロードできません。メッセージが MainWndProc から出るとき、メッセージはオブジェクトの WndProc メソッドに渡され、Tcontrol クラスで定義された仮想メソッドが Dispatch メソッドを呼び出します。 Dispatch は、受信したメッセージに基づいて、対応する処理メソッドを検索します。最終的に見つからない場合は、見つからない場合は、Defaulthandler を呼び出します。 Defaulthandler メソッドは、メッセージの最終処理を実行し、そのメッセージを Windows DefWindowProc 関数またはその他のデフォルト ウィンドウ プロシージャに渡します。