4

ユーザーが dbgrid をダブルクリックすると、非モーダル フォームが表示されます。

彼らがそのフォームを閉じたら、グリッドを更新したいと思います。

それを達成するために、私は次のことを試しました:

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 プロシージャは実行されません。私は何を間違っていますか?

4

5 に答える 5

9

TWinControl から直接派生したカスタム コントロールを作成する場合を除き、WM_USER は独自のメッセージの基になる正しい定数ではないことに注意してください。代わりに WM_APP を使用してください。

また、ユーザー メッセージに WM_ の代わりに UM_ を使用するのも良いスタイルと考えられています。これは、プレフィックスが Windows ヘッダー ファイル用に予約されているためです。

于 2009-05-14T09:59:21.797 に答える
6

他の回答のメッセージ名は別として、Self が離れている間、Self.Handle にメッセージを投稿しています。おそらく、別のハンドル (モードレス ハンドルを起動したウィンドウ) に投稿するつもりでした。モードレス ウィンドウの作成時にそのハンドルへのアクセスを許可し、代わりにそこにメッセージを投稿します。

于 2009-05-13T20:21:08.890 に答える
2

投稿メッセージは、リストした self.handle ではなく、他のウィンドウ ハンドルに送信する必要があります。これを行う 1 つの方法は、非モーダル フォームに新しいプロパティを作成し、非モーダル フォームを表示する直前に他のフォームのハンドルを割り当てることです。

それ以外は、WM_REFRESH_MSG を適切に実装する (CheGueVerra は正しい) ので、問題なく動作するはずです。

于 2009-05-13T20:21:33.850 に答える
1

「ケビンはどうする?」の例をアップロードしました。Embarcaderoのニュースグループフォーラム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;

フォーラムにアクセスできず、追加のコードが必要な場合は、コメントを残してください。不足している部分を投稿します。

幸運を

于 2009-05-15T15:32:29.070 に答える
1

送信しようとしているメッセージに一致するように、宣言の末尾を変更してみてください。

procedure OnRefreshRequest(var Msg: TMessage); message WM_CEA_REFRESH;

これのはず

procedure OnRefreshRequest(var Msg: TMessage); message WM_REFRESH_MSG;
于 2009-05-13T20:10:26.050 に答える