Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Botschaft an Frame senden (https://www.delphipraxis.net/127015-botschaft-frame-senden.html)

taaktaak 6. Jan 2009 15:32


Botschaft an Frame senden
 
Moin, Moin.
Um zirkuläre Unit-Referenzen zu vermeiden, sendet meine Config-Unit nach Veränderung von Einstellungen mittels PostMessage() eine Botschaft an alle Fenster, damit diese darauf reagieren und ggf. Veränderungen sofort optisch darstellen können. Das funktioniert auch wie gewünscht.

Delphi-Quellcode:
for i:=0 to Screen.FormCount-1 do  // inform ALL application forms
  PostMessage(Screen.Forms[i].Handle,WM_AFTER_CFGSAVED,0,0);
Mein Hauptform enthält jedoch mehrere Frames. Diese empfangen die Botschaft natürlich nicht. Nun kann ich ja aus dem Hauptform die Einstellungen in den Frames ändern - aber noch besser wäre es m.E. dies auch in den einzelnen Frames zu tun.

Langer Rede, kurzer Sinn: Wie kann ich eine Botschaft an die Frames senden?

Da TFrame ein Nachkomme von TWinControl ist, müsste ein Frame doch eigentlich ein Handle haben (denk ich mir mal so) - aber wie ermittle ich das Handle?

mjustin 6. Jan 2009 15:39

Re: Botschaft an Frame senden
 
Zitat:

Zitat von taaktaak
Moin, Moin.
Um zirkuläre Unit-Referenzen zu vermeiden, sendet meine Config-Unit nach Veränderung von Einstellungen mittels PostMessage() eine Botschaft an alle Fenster, damit diese darauf reagieren und ggf. Veränderungen sofort optisch darstellen zu können. Das funktioniert auch wie gewünscht.

Alternativ könnte man auch das Beobachter (Observer) Entwurfsmuster verwenden. Jedes Frame oder Form registriert sich dabei in einer zentralen Liste, die dann von der Config-Unit benutzt wird, um nach einer Änderung eine Nachricht an alle zu senden.

Die Liste könnte (nur so als Beispiel) eine IInterfaceList sein. Jedes Frame oder Form implementiert dann z.B. ein IConfigAware Interface mit einer Methode OnConfigChanged. Der Rest ist dann einfach, und kann beliebig um weitere Klassen (auch nichtvisuelle) erweitert werden, die ja normalerweise kein Windowshandle haben.

taaktaak 6. Jan 2009 16:22

Re: Botschaft an Frame senden
 
Tja, hört sich gut an.

Habe jetzt mal ein wenig gelesen, und -offen gesagt- eigentlich so gut wie nichts verstanden. Das Grundprinzip ist zwar deutlich geworden, allerdings kann ich trotz Durchsicht der Hilfe leider keine praktischen Umsetzungsschritte daraus ableiten.

Ich wäre dankbar, wenn sich ein Helfer finden würde, der das Aufgezeigte etwas konkreter darstellen könnte.

// edit: Die ursprüngliche Frage habe ich jetzt selbst beantworten können; folgender Code sendet die Botschaft an alle Forms und alle Frames der Anwendung

Delphi-Quellcode:
with Application do
  for i:=0 to ComponentCount-1 do
    if Components[i] is TForm then begin
      PostMessage(TForm(Components[i]).Handle,WM_AFTER_CFGSAVED,0,0);
      for j:=0 to Components[i].ComponentCount-1 do
        if Components[i].Components[j] is TFrame then
          PostMessage(TFrame(Components[i].Components[j]).Handle,WM_AFTER_CFGSAVED,0,0);
      end;
Die "IInterfaceList" ist eine sehr interessante Anregung - vielen Dank an Michael für den Hinweis! Damit werde ich mich mal in Ruhe beschäftigen und ggf. einen neuen Thread aufmachen, wenn meine Verständnislosigkeit weiter anhält.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz