Delphiのカスタムメッセージハンドラ
-
21-08-2019 - |
質問
、私は非モーダルフォームを表示ます。
彼らはそのフォームを閉じると、私はグリッドをリフレッシュしたい。
それを達成するために、私は次のことを試してみました。
1 - カスタムメッセージ定数を定義します:
const
WM_REFRESH_MSG = WM_USER + 1; //defined in a globally available unit
- 2私の非モーダルフォームのOnCloseのイベントでは、私はこれを持っています:
procedure TMyNonModalForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
PostMessage(Self.Handle,WM_REFRESH_MSG,0,0);
end;
- 3のDBGridを保持しているフォームのプライベート宣言では、私はこれを持っています:
procedure OnRefreshRequest(var Msg: TMessage); message WM_REFRESH_MSG;
...
procedure TMyFormWithADBGrid.OnRefreshRequest(var Msg: TMessage);
begin
RefreshGrid;
end;
これらの事をやった後、のPostMessageは罰金発射したが、OnRefreshRequest手順が実行されることはありません。私が間違って何をしているのですか?
解決
別に他の回答でメッセージ名から、あなたはSelf.Handleにメッセージを投稿しています。おそらく、異なるハンドル(モードレス1を立ち上げたウィンドウ)に投稿するためのもの。あなたはそれを作成するとき、そのハンドルにあなたのモードレスウィンドウへのアクセスを与え、代わりにそこにメッセージを投稿します。
他のヒント
WM_USERは、あなたが直接のTWinControlから下降するカスタムコントロールを作成している場合を除き、上のあなた自身のメッセージをベースにするための正しい一定ではないことに注意してください。代わりにWM_APPを使用します。
また、それはその接頭辞は、Windowsのヘッダファイルのために確保されるようになっているので、代わりにWM_のユーザー・メッセージのためのUM_を使用するための良いスタイルと考えられています。
ポスト・メッセージは、他のウィンドウハンドルではなく、あなたが列挙されているself.handleに送信する必要があります。これを行う1つの方法は、あなたの非モーダルフォームの新しいプロパティを作成し、あなたの非モーダル1を表示する直前にそれを他の形式のハンドルを割り当てることです。
それ以外に、かつ適切WM_REFRESH_MSGを実装する(CheGueVerraが正しいそれを持っている)、それが正常に動作する必要があります。
あなたが送信しようとしているメッセージと一致するように、宣言の最後を試してみて、変更される可能性があります。
procedure OnRefreshRequest(var Msg: TMessage); message WM_CEA_REFRESH;
この
であるべきprocedure OnRefreshRequest(var Msg: TMessage); message WM_REFRESH_MSG;
私はの例アップロードした「ケビンは何をするでしょうか?」エンバカデロのニュースグループフォーラムembarcadero.public.attachmentsへ。
基本的にはメインフォーム(またはあなたが好きなフォーム/オブジェクト)非モーダルフォームが閉じたときに加入することをカスタムイベントです。メイン(または何でも)形式では...
var
NonModalForm :TfmNonModalForm;
begin
NonModalForm := TfmNonModalForm.Create(nil);
NonModalForm.Execute(NonModalFormClosingListener);
Executeメソッドの
procedure TfmNonModalForm.Execute(YourListenerMethod: THeyIClosedEvent);
begin
FHeyIClosedEvent := YourListenerMethod;
Show();
end;
あなたがフォーラムに取得し、追加のコードを必要とすることができない場合は、は、コメントを残して、私は欠けている部分を投稿します。
幸運