Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Multi event handles (https://www.delphipraxis.net/201862-multi-event-handles.html)

EricMeyer 4. Sep 2019 17:13

Multi event handles
 
Hi, ich versuche mich gerade darin Multi event handles zu verstehen, wie man Sie benutzt und ob ich Sie richtig benutzte. Was ich habe ist eine Liste von Personen Vorname Nachname, die ich in einem Stringgrid in einer From anzeige. Man kann neue Person hinzufügen und bei jeder Änderung speichert er dieses direkt in ein Textfile. Man kann dieses Form mehrfach öffnen. Jetzt möchte ich, dass wenn ich in einer Form etwas ändere, alle anderen auch aktualisiert werden. Deshalb wollte ich das die Form eine Art Listener hat, was in Delphi durch multi event handles gelöst wird. Meine Idee, die Form sendet an sein persönlichen Kontroller den Befehl speichern und der Kontroller sendet an alle Formen aktualisieren.
Ich kann aber leider kein einziges verständliches Beispiel in die Richtung finden.
Aktuell habe ich:
http://docwiki.embarcadero.com/RADSt...Events_(Delphi)
Das ist aber {$APPTYPE CONSOLE} und somit kann ich es nicht eins zu eins benutzen. Ich habe versucht es umzukonstruieren, bleibe aber an folgender Stelle hängen:
Delphi-Quellcode:
 
 procedure TObservedObject.TriggerEvent;
 begin
   { Call the registerd event only if there is a listener }
   if Assigned(FPing) then
     FPing();
 end;
Ich habe noch andere Beispiele gefunden aber hier wird zum Beispiel mit assembler gearbeitet. Ich kann mir nicht vorstellen, dass so eine einfache Aufgabe so viel Aufwand benötigt.
https://www.delphipraxis.net/191050-...ent-liste.html
https://community.idera.com/develope...using-generics


Die einzige Quelle, von der ich denke, Sie könnte etwas bringen ist https://www.delphigeist.com/2012/03/...-and-more.html
Allerdings kann man sie nicht runterladen und es fehlen somit die dfm und ich finde es sehr schwer das richtig zu verstehen.

Ich komme also nicht richtig weiter. Bin ich mit meinem Ansatz auf dem Holzweg oder habt ihr ein besseres Beispiel oder Ideen, wie ich vorankomme:

Meine Implementierung aktuell ist:

Delphi-Quellcode:

unit UMultiHandle;

interface
 type



   { Define a procedural type }
   TPingEvent = procedure of object;
      { The observed object }
   TObservedObject = class
   private
     FPing: TPingEvent;

   public
     property OnPing: TPingEvent read FPing write FPing;

      class procedure TriggerEvent();
   end;
     { Triggers the event if anything is registered }


      { The listener }
   TListener = class
     procedure Ping;
   end;

   { The listener sub-class }
   TListenerSubclass = class(TListener)
     procedure Ping2;
   end;

implementation

 class procedure TObservedObject.TriggerEvent;
 begin
   { Call the registerd event only if there is a listener }
   if Assigned(FPing) then
     FPing();
 end;
  procedure TListener.Ping;
 begin
   Writeln('TListener has been pinged.');
 end;

 procedure TListenerSubclass.Ping2;
 begin
   { Call the base class ping }
   Self.Ping();
   Writeln('TListenerSubclass has been pinged.');
 end;


end.

"[dcc32 Error] UMultiHandle.pas(38): E2124 Instance member 'FPing' inaccessible here"

Uwe Raabe 4. Sep 2019 17:39

AW: Multi event handles
 
Welche Delphi-Version?

EricMeyer 4. Sep 2019 17:43

AW: Multi event handles
 
Aktuelle, die Community Version

TiGü 4. Sep 2019 18:01

AW: Multi event handles
 
Löse dein Problem mit dem System.Messaging.TMessageManager.
http://docwiki.embarcadero.com/Libra...MessageManager

Siehe auch Links am Ende der Seite.

Rollo62 5. Sep 2019 06:41

AW: Multi event handles
 
Und/oder mit Stefans Spring4D, das hat schon Multi-Events implementiert.

Mavarik 5. Sep 2019 08:53

AW: Multi event handles
 
Ich denke TiGü hat die schon die richtige Antwort gegeben.

Du könntest aber auch eine
Delphi-Quellcode:
TList<TProc>
oder
Delphi-Quellcode:
TList<TArgProc>
verwenden.

Delphi-Quellcode:
TArgProc = reference to Procedure (Const Args : TArray<TValue>);
Den Callback von jeder Form speichern. Fertig. (fast)

Vergiss es, nimm lieber den System.Messages Ansatz...
Die paar Taktzyklen.. :stupid:


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