2009-05-13 4 views
3

ユーザがdbgridをダブルクリックすると、非モーダルフォームが表示されます。Delphiカスタムメッセージハンドラ

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

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

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

答えて

6

であるべき自己が離れて行くされている間、あなたはSelf.Handleにメッセージを投稿しています。おそらく、別のハンドル(モードレスを起動したウィンドウ)にポストすることを意味していました。あなたがそれを作成するとき、あなたのモードレスウィンドウにそのハンドルへのアクセスを与え、代わりにメッセージを掲示してください。

+0

1 - THandle 2を受け入れるようにモードレスフォームのコンストラクタを修正 - その新しいコンストラクタ 3でそれを呼び出す - その新しいハンドル 4にメッセージを投稿する - 素晴らしい作品! – JosephStyons

1

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

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

は別に、他の解答のメッセージ名からこの

procedure OnRefreshRequest(var Msg: TMessage); message WM_REFRESH_MSG; 
+0

WM_REFRESH_MSGは質問の目的のために、汎用的だったのに対し、申し訳ありませんが、CEA_REFRESHは、私の実際のコードからコピーされました。実際にコード内で一致します。 – JosephStyons

2

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

それ以外は、WM_REFRESH_MSGを正しく実装すると(CheGueVerraは正しい)、うまく動作するはずです。

8

TWinControlから直接降順にカスタムコントロールを作成する場合を除き、WM_USERは自分のメッセージの基になる正しい定数ではありません。代わりにWM_APPを使用してください。

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

1

「ケビンは何をするのですか」の例をアップロードしました。 Embarcaderoのニュースグループフォーラムのembarcadero.public.attachmentsにアクセスしてください。

基本的には、非モーダルフォームが閉じたときにメインフォーム(または必要なフォーム/オブジェクト)が購読するカスタムイベントです。あなたがフォーラムに取得し、追加のコードを必要とすることができない場合は、Executeメソッド

procedure TfmNonModalForm.Execute(YourListenerMethod: THeyIClosedEvent); 
begin 
    FHeyIClosedEvent := YourListenerMethod; 
    Show(); 
end; 

、メイン(または何でも)形式では...

var 
    NonModalForm :TfmNonModalForm; 
begin 
    NonModalForm := TfmNonModalForm.Create(nil); 
    NonModalForm.Execute(NonModalFormClosingListener); 

、コメントを残して、私は」不足している部分を投稿します。

幸運