2009-05-13 7 views
3

Wenn ein Benutzer ein dbgrid doppelklickt, zeige ich ein nicht-modales Formular.Delphi benutzerdefinierte Nachrichtenhandler

Wenn sie dieses Formular schließen, möchte ich das Raster aktualisieren.

Um das zu erreichen, ich habe folgendes versucht:

1 - Definieren Sie eine benutzerdefinierte Nachricht Konstante:

const 
    WM_REFRESH_MSG = WM_USER + 1; //defined in a globally available unit 

2 - Im OnClose Ereignis meiner nicht-modale Form, ich habe dies:

procedure TMyNonModalForm.FormClose(Sender: TObject; var Action: TCloseAction); 
begin 
    PostMessage(Self.Handle,WM_REFRESH_MSG,0,0); 
end; 

3 - In den privaten Erklärungen der Form, die die dbGrid hält, ich habe dies:

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

... 

procedure TMyFormWithADBGrid.OnRefreshRequest(var Msg: TMessage); 
begin 
    RefreshGrid; 
end; 

Nach diesen Schritten wird die PostMessage ordnungsgemäß ausgeführt, aber die OnRefreshRequest-Prozedur wird nie ausgeführt. Was mache ich falsch?

Antwort

6

Abgesehen von den Nachrichtennamen in der anderen Antwort, die Sie veröffentlichen eine Nachricht an Self.Handle während Selbst weggeht. Sie wollten wahrscheinlich zu einem anderen Handle posten (das Fenster, das den nicht modalen gestartet hat). Geben Sie Ihrem modalen Fenster Zugriff auf dieses Handle, wenn Sie es erstellen, und geben Sie stattdessen die Nachricht dort ein.

+0

1 - modifiziert, um den Konstruktor der modalen Form eines THandle 2 zu übernehmen lassen - die Nachricht an diesen neuen Griff 4 - - es 3 mit dem neuen Konstruktor aufrufen großen Werke! – JosephStyons

1

Sie könnten versuchen, das Ende der Deklaration so zu ändern, dass es der Nachricht entspricht, die Sie senden möchten.

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

Sollte dies

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

Leider wurde die CEA_REFRESH von meinem eigentlichen Code kopiert, während die WM_REFRESH_MSG generic war, für die Zwecke der Frage. Sie stimmen tatsächlich im Code überein. – JosephStyons

2

Die Post-Nachricht muss an den anderen Fenster-Handle gesendet werden, nicht an den von Ihnen aufgelisteten self.handle. Eine Möglichkeit dazu wäre, eine neue Eigenschaft in Ihrem nicht-modalen Formular zu erstellen und sie dem Handle des anderen Formulars zuzuordnen, kurz bevor Sie Ihr nicht-modales Formular anzeigen.

Abgesehen davon, und die WM_REFRESH_MSG richtig implementieren (CheGueVerra hat es richtig) sollte es gut funktionieren.

8

Beachten Sie, dass WM_USER nicht die richtige Konstante ist, um eigene Nachrichten zu erstellen, es sei denn, Sie schreiben ein benutzerdefiniertes Steuerelement direkt von TWinControl absteigend. Verwenden Sie stattdessen WM_APP.

Es wird auch als guter Stil angesehen, UM_ für User Message anstelle von WM_ zu verwenden, da dieses Präfix für die Windows-Header-Dateien reserviert sein sollte.

1

Ich habe ein Beispiel von "Was würde Kevin tun?" zu Embarcaderos Newsgroupforum embarcadero.public.attachments.

Grundsätzlich ist es ein benutzerdefiniertes Ereignis, das die Hauptform (oder welche Form/Objekt Sie wollen) abonniert, wenn das nicht-modale Formular schließt. Im Haupt (oder was auch immer) Form ...

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

im Execute-Methode

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

Wenn Sie nicht auf das Forum und brauchen den zusätzlichen Code zu bekommen, lassen Sie einen Kommentar und ich Ich werde die fehlenden Teile veröffentlichen.

Viel Glück