Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Message an alle Fenster (MDI Child) schicken - wie? (https://www.delphipraxis.net/117149-message-alle-fenster-mdi-child-schicken-wie.html)

sveni2211 12. Jul 2008 17:43


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?

DelphiKlaus 12. Jul 2008 17:56

Re: Message an alle Fenster (MDI Child) schicken - wie?
 
Hallo,

das müsste in etwa so gehen

Delphi-Quellcode:
  for Loop := 0 to Pred (MDIChildCount) do
    SendMessage (MDIChildren [Loop].Handle,
                 wm_...., ...., ....)
Viele Grüsse

marabu 12. Jul 2008 19:52

Re: Message an alle Fenster (MDI Child) schicken - wie?
 
Hallo,

für alle Fenster vielleicht einfach die Schleife von Klaus etwas modifizieren:

Delphi-Quellcode:
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;
Freundliche Grüße

sveni2211 12. Jul 2008 20:45

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?

marabu 12. Jul 2008 21:30

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

sx2008 13. Jul 2008 14:23

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:
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;
Ich hoffe, du siehst, dass dieser Weg besser ist, als nur eine Windows-Message zu schicken (obwohl beides sehr ähnlich ist).
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.

sveni2211 13. Jul 2008 15:06

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.

Muetze1 13. Jul 2008 15:28

Re: Message an alle Fenster (MDI Child) schicken - wie?
 
Moin!

Zitat:

Zitat von sveni2211
Ich habe die Variable für das Child nicht einmal, sondern nmal.

MDI Childs weren automatisch in MDICHildren[] der Mainform eingetragen, somit verwaltet dir die VCL schon eine solche Liste. Alternativ: Delphi-Referenz durchsuchenTObjectList

Zitat:

Zitat von sveni2211
Darum wird es nicht instanziiert über Variable := Klasse.Create sondern Application.CreateForm.

Und was für einen Unterschied erhoffst/erwartest du mit diesem Unterschied? Eigentlich braucht man das Application.CreateForm() nur für die Mainform, die darüber auch entsprechend im TApplication Objekt vermerkt wird. Bei allem anderen kannst du es auch einfach mit dem Create() machen. Von daher frage ich mich: Was ist deiner Meinung nach der Unterschied zwischen den beiden Instanziierungen?

Zitat:

Zitat von sveni2211
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.

Ein dynamisches Array würde ich hier als antiquiert betrachten, eine OOP Implementierung wie TObjectList (oder spezifische Ableitung) wäre hier besser geeignet.

MfG
Muetze1


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:50 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