![]() |
Message an alle Fenster (MDI Child) schicken - wie?
Hi.
Ich habe eine Anwendung, in welcher ich zum größten Teil MDI Childs einsetze, allerdings auch einige wenige Fenster vom Typ fsNormal, weil diese Modal (als Info- Fenster) sind. Ich würde nun gern an alle diese Fenster eine Botschaft schicken. Wie ich an ein einzelnes ein Nachricht mit Sendmessage über sein Handle schicke, ist mir klar. Das geht auch. Aber dazu müsste ich die Handles aller aktiven MDI Childs irgendwo mitführen. Zum Test habe ich mal meine Nachricht an Application.Handle geschickt, aber diese kam nur auf dem MainForm (MDI Form) an. Die untergeordneten Fenster bekommen davon nichts mit. Probiert habe ich mit SendMessage und mit PostMessage. Gibt es eine Möglichkeit eine Nachricht an alle Fenster einer Anwendung zu senden, ohne deren Handles zu kennen? |
Re: Message an alle Fenster (MDI Child) schicken - wie?
Hallo,
das müsste in etwa so gehen
Delphi-Quellcode:
Viele Grüsse
for Loop := 0 to Pred (MDIChildCount) do
SendMessage (MDIChildren [Loop].Handle, wm_...., ...., ....) |
Re: Message an alle Fenster (MDI Child) schicken - wie?
Hallo,
für alle Fenster vielleicht einfach die Schleife von Klaus etwas modifizieren:
Delphi-Quellcode:
Freundliche Grüße
procedure TMainForm.ComeOnClick(Sender: TObject);
var i: Integer; begin with Screen do for i := 0 to Pred(FormCount) do Forms[i].Perform(WM_DEMO, 0, 0); end; |
Re: Message an alle Fenster (MDI Child) schicken - wie?
Hmm. Das würde in beiden Fällen bedeuten, n Nachrichten zu versenden.
In der WinApi Doku habe ich gelesen, dass es die Möglichkeit gibt, eine Nachricht an den Thread zu schicken, der die dann verteilt. PostThreadMessage heißt die, glaube ich. Man benötigt aber dafür eine Thread-Id, wo ich nicht weiß, wie ich die auslesen kann. Bietet Delphi von sich aus Zugriff auf die Funktion in der Form, an Application was zu senden? |
Re: Message an alle Fenster (MDI Child) schicken - wie?
Hallo,
du kannst dein Glück mit GetWindowThreadProcessId() und PostThreadMessage() probieren, aber ich erwarte da keinen Erfolg. Gute Nacht |
Re: Message an alle Fenster (MDI Child) schicken - wie?
Warum willst du eine Message schicken wenn du doch auch ganz objekt-orientiert eine Methode aufrufen kannst??
Delphi-Quellcode:
Ich hoffe, du siehst, dass dieser Weg besser ist, als nur eine Windows-Message zu schicken (obwohl beides sehr ähnlich ist).
procedure TMainForm.ComeOnClick(Sender: TObject);
var i: Integer; child : TMyChildForm; begin for i := 0 to Pred(Screen.FormCount) do begin if Screen.Forms[i] is TMyChildForm then begin child := TMyChildForm(Screen.Forms[i]); // mit der Zwischenvariable geht es einfacher child.SaveToDirectory(verzeichnis); // ChildForm soll seine Daten im angeg. Verzeichnis speichern child.Caption := x.Caption + ' [saved]'; // Caption des Formulars ändern end; end; end; Vorallem auch deshalb, weil du so auch typsicher Argumente übergeben kannst und ganz einfach Daten vom ChildFormular abholen kannst. Angenommen du hast verschiedene ChildForm Klassen. Wenn du alle ChildForm Klassen von einer gemeinsamen Basisklasse ableitest, dann kannst du dort die notwendigen gemeinsamen Methoden und Properties implementieren. Angenommen deine Anwendung ist schon fertig und du kannst die Klassenhierarchie nicht ändern. Deshalb dein Ansatz mit den Messages. Dann gibt es die Möglichkeit, dass deine Formulare ein zusätzliches Interface implementieren. |
Re: Message an alle Fenster (MDI Child) schicken - wie?
Also über den Thread geht es scheinbar auch nicht.
Wegen dem letzten Vorschlag. Das hat einen relativen simplen Grund. Ich habe die Variable für das Child nicht einmal, sondern nmal. Das selbe Child kann mit unterschiedlichen Daten geöffnet werden. Darum wird es nicht instanziiert über Variable := Klasse.Create sondern Application.CreateForm. Für diese Variante müsste ich also ein Array basteln vom Typ Child und dort die Fenster erstellen lassen. Das wäre wesentlich umständlicher. |
Re: Message an alle Fenster (MDI Child) schicken - wie?
Moin!
Zitat:
![]() Zitat:
Zitat:
MfG Muetze1 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz