AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Message an alle Fenster (MDI Child) schicken - wie?
Thema durchsuchen
Ansicht
Themen-Optionen

Message an alle Fenster (MDI Child) schicken - wie?

Ein Thema von sveni2211 · begonnen am 12. Jul 2008 · letzter Beitrag vom 13. Jul 2008
Antwort Antwort
sveni2211

Registriert seit: 22. Dez 2006
Ort: Friedrichroda
38 Beiträge
 
#1

Message an alle Fenster (MDI Child) schicken - wie?

  Alt 12. Jul 2008, 18:43
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?
  Mit Zitat antworten Zitat
DelphiKlaus

Registriert seit: 18. Okt 2006
100 Beiträge
 
Delphi 6 Professional
 
#2

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

  Alt 12. Jul 2008, 18:56
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

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

  Alt 12. Jul 2008, 20:52
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
  Mit Zitat antworten Zitat
sveni2211

Registriert seit: 22. Dez 2006
Ort: Friedrichroda
38 Beiträge
 
#4

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

  Alt 12. Jul 2008, 21:45
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?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

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

  Alt 12. Jul 2008, 22:30
Hallo,

du kannst dein Glück mit GetWindowThreadProcessId() und PostThreadMessage() probieren, aber ich erwarte da keinen Erfolg.

Gute Nacht
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#6

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

  Alt 13. Jul 2008, 15:23
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.
  Mit Zitat antworten Zitat
sveni2211

Registriert seit: 22. Dez 2006
Ort: Friedrichroda
38 Beiträge
 
#7

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

  Alt 13. Jul 2008, 16:06
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.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#8

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

  Alt 13. Jul 2008, 16:28
Moin!

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 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 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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:47 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