Frage

Wenn ein Benutzer ein DBTabelle doppelklickt, zeige ich eine nicht-modale Form.

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

Um das zu erreichen, habe ich versucht, die folgenden:

1 - Definieren Sie eine benutzerdefinierte Nachricht Konstante:

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

2 - Im OnClose Ereignisse meiner nicht-modalen 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;

Nachdem Sie diese Dinge zu tun, feuert die Postmessage in Ordnung, aber das OnRefreshRequest Verfahren läuft nie. Was mache ich falsch?

War es hilfreich?

Lösung

Neben dem Nachrichtennamen in der anderen Antwort, die Sie veröffentlichen eine Nachricht an Self.Handle während Selbst weggeht. Sie haben wahrscheinlich zu einem anderen Griff schreiben bedeuten (das Fenster, das die modalen einen gestartet). Geben Sie Ihren modales Fenster Zugang zu diesem Griff, wenn Sie es schaffen, und posten Sie die Nachricht dort statt.

Andere Tipps

Beachten Sie, dass WM_USER nicht die richtige Konstante ist Ihre eigenen Nachrichten auf stützen, es sei denn, Sie eine benutzerdefinierte Steuerung schreiben direkt von Twincontrol absteigend. Verwenden WM_APP statt.

Außerdem ist es guter Stil betrachtet UM_ für Benutzernachricht statt WM_ zu verwenden, weil das Präfix soll für die Windows-Header-Dateien reserviert werden.

Die Post Nachricht muss an den anderen Fenster-Handle gesendet werden, nicht die self.handle, die Sie aufgeführt haben. Eine Möglichkeit, dies zu tun wäre, eine neue Eigenschaft auf dem nicht-modales Formular erstellen und den Griff der anderen Form zuweisen, bevor Sie Ihren nicht-modal einen zeigen.

Other than that, und die Umsetzung der WM_REFRESH_MSG richtig (CheGueVerra hat es richtig) es sollte funktionieren.

Sie könnten versuchen, und das Ende der Erklärung zu ändern, um die Nachricht passen Sie zu senden versuchen.

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

Sollte dies

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

Ich habe ein Beispiel hochgeladen: „Was würde Kevin tun?“ Embarcadero Newsgroup Forum embarcadero.public.attachments.

Im Grunde ist es ein benutzerdefiniertes Ereignis, dass die Hauptform (oder was auch immer Form / Objekt Sie mögen) abonniert hat, wenn das nicht-modale Formular geschlossen wird. Im Haupt (oder was auch immer) Form ...

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

In der 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, um einen Kommentar hinterlassen und ich werde die fehlenden Stücke schreiben.

Viel Glück

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top