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 Application (https://www.delphipraxis.net/76273-botschaft-application.html)

oki 1. Sep 2006 08:58


Botschaft an Application
 
Hallo Leute,

ich habe derzeit folgendes Problem:

In einer Anwendung soll ein Benutzer eine Terminverwaltung für spezielle Einsatzfälle bekommen. Nun ist es so, dass er in dieser Verwaltung an den verschiedensten Stelle auch entsprechende Termine löschen kann. Die Möglichkeit gebe ich dem Benutzer in entsprechenden MDI-Child's oder in Formularen meiner selbst geschriebenen Komponenten (Terminplaner, Kalender, etc.).
Jetzt möchte ich, dass in meinem Hauptfenster in Form eines Protokolls diese Löschvorgänge angezeigt werden. Somit besteht die Notwendigkeit, egal von welcher Stelle aus, meinem Hauptfenster eine Nachricht über diesen Vorgang zukommen zu lassen. Mal ganz einfach -> "Termin XXX vom 01.09.2006 gelöscht! Bitte Benachrichtigung vornahmen".
Bis diese Aufgabe erledigt ist bleibt der Mahneintrag in der Liste stehen.

So, dass zum Verständnis, was ich ungefähr mache.

Für mich ist aktuell die Frage, wie löse ich das Benachrichtigungsthema innerhalb meiner Application am einfachsten. Ideal ist ein zentraler Empfang mittels Botschaft, wobei ich für ein SendMessage nicht unbedingt das Handle meines Hauptfenster bis in die letzte Ecke durchreichen will. Auch Ereignisse müsste ich über jedes Object oder Fenster weiter reichen.

Wenn einer da ne grundlegende Idee hat, her damit.

Dank und Gruß oki

Sharky 1. Sep 2006 09:06

Re: Botschaft an Application
 
Zitat:

Zitat von oki
... nicht unbedingt das Handle meines Hauptfenster bis in die letzte Ecke durchreichen will....

Hai oki,

wenn dein Hauptfenster die anderen Fenster erzeugt musst Du das Handle ja nicht durchreichen.
Das kannst Du dann ja so ermitteln:
Delphi-Quellcode:
hWnd := (Owner AS TForm).Handle
Hier habe ich das in meinem Beispiel so gemacht.

oki 1. Sep 2006 09:30

Re: Botschaft an Application
 
Hi (Hai) Sharky,

klar, hab ich verstanden und ist auch machbar für die MDI's. Nun ist es leider so, dass in meinen eigenen Komponenten für alle benötigten Owner beim creieren von Objecten und Fenstern üblicherweise self verwende. damit ist mein Main-window leider nicht mehr der Owner. Wenn ein eingebettetes Object keinen Owner erfordert und selber ein Fenster creiert, dann übergebe ich auch mal nil als Owner.
Nun kann es sein, dass jemand sagt "unsauber programmiert", o.k. - stimmt dann wohl.
aus diesem grund dachte ich ja auch, dass mann hier vielleicht etwas über Application machen kann, denn dass kennen doch eigentlich alle Teile meiner Application.

Gruß oki

Jürgen Thomas 1. Sep 2006 10:45

Re: Botschaft an Application
 
Hallo oki,

benutzt Du ein gemeinsames Datenmodul oder dieselbe Tabelle? Dann könntest Du das Ereignis Delphi-Referenz durchsuchenTTable.AfterDelete in Deinem Hauptformular auswerten.

Gruß Jürgen

oki 4. Sep 2006 07:38

Re: Botschaft an Application
 
Hi Jürgen,

eine Tabelle benutze ich nicht zwingend für jeden Vorgang den ich nach oben melden möchte. In diesem Beispiel ist das natürlich naheliegend. Mir geht es hier um einen Lösungsansatz, der mir schon bei mehreren Projekten aufgestoßen ist.
Ich habe des öffteren den Bedarf, dass ich Botschaften an eine zentrale Stelle senden möchte. Da dachte ich im Moment an so'ne Sache wie z.B. OnMessage über Application. Nur wie setze ich eine eigene Botschaft dort hin ab?
Laut Hilfe ist hier SendMessage nicht möglich, wobei ja SendMessage ein FensterHandle benötigt, was ich nicht haben will.

gruß oki

Sidorion 4. Sep 2006 08:55

Re: Botschaft an Application
 
In der Unit Forms gibt es eine Variable Namens Application. Wenn Du nun Application.MainForm.Handle nimmst, kommt es immer am Hauptformular an.

Jürgen Thomas 4. Sep 2006 08:55

Re: Botschaft an Application
 
Zitat:

Zitat von oki
OnMessage über Application. Nur wie setze ich eine eigene Botschaft dort hin ab?
Laut Hilfe ist hier SendMessage nicht möglich, wobei ja SendMessage ein FensterHandle benötigt, was ich nicht haben will.

Hallo oki,

ah ja. Aber versuch doch einmal, mit WinSight das versteckte Fenster Deiner Applikation zu finden. Ein solches erzeugt Delphi immer; das versteckt sich nämlich hinter der Variablen Application. Darüber müsstest Du dieses Fenster und folglich auch das Handle bekommen.

Viel Erfolg! Jürgen

oki 4. Sep 2006 09:19

Re: Botschaft an Application
 
Hi,

ich habs gefunden!!!

Ob mein weg nun so richtig gut ist weis ich nicht, aber er funzt. Ich habe folgendes gemacht:

Deklaration einer Botschaftskonstanten

Delphi-Quellcode:
  wm_MsgEvent  = wm_user + 101;          /// Botschaft, dass eine neue Nachricht zum Einfügen in die Mahnliste vorliegt
Dann bekommt mein Main-Window eine entsprechende Behandlungsprocedur

Delphi-Quellcode:
  public
    { Public-Deklarationen }
    procedure WMMsgEvent(var Message: TMSG); message WM_MsgEvent;
  end;

procedure TMainForm.WMMsgEvent(var Message: TMSG);
begin
  MessageDlg(Format('MessageEvent: %s', [Message.msgText]), mtInformation, [mbOK], 0);
end;
Der Einfach heit halber hab ich hier den Standardparameter TMSG verwendet.
Jetzt der eigentliche Teil. Die Variable Application besitzt die Eigenschaft "MainForm"; und somit läßt sich das Handle des Hauptfensters immer eindeutig ermitteln.
Ich setzt die Botschaft dann wie folgt ab:
Delphi-Quellcode:
  // und jetzt Nachricht an Hauptfenster zum aktualisieren
  PostMessage(Application.MainForm.Handle, wm_MsgEvent, 0, 0);
o.k. Dank an alle die beim Nachdenken geholfen haben,

gruß oki

Jürgen Thomas 4. Sep 2006 09:32

Re: Botschaft an Application
 
Zitat:

Zitat von oki
ich habs gefunden!!!

Ob mein weg nun so richtig gut ist weis ich nicht, aber er funzt.

Nach allem, was ich über Botschaften gelernt habe, dürfte das genau der richtige Weg sein. Das bestätigt auch @Sidorion, der zeitgleich mit meinem letzten Hinweis genau auf Application.MainForm.Handle hingewiesen hat.

Gruß Jürgen

oki 4. Sep 2006 09:38

Re: Botschaft an Application
 
Hi,

@Sidorion
Tschuldige, dass ich deinen Beitrag übersehen hab. Aber da war der Gedanke dann doch der Gleiche.

@Jürgen
Jo, so scheint's. Nochmal dank.


Gruß oki


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