![]() |
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: ![]() 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:
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. procedure TObservedObject.TriggerEvent; begin { Call the registerd event only if there is a listener } if Assigned(FPing) then FPing(); end; ![]() ![]() Die einzige Quelle, von der ich denke, Sie könnte etwas bringen ist ![]() 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" |
AW: Multi event handles
Welche Delphi-Version?
|
AW: Multi event handles
Aktuelle, die Community Version
|
AW: Multi event handles
Löse dein Problem mit dem System.Messaging.TMessageManager.
![]() Siehe auch Links am Ende der Seite. |
AW: Multi event handles
Und/oder mit Stefans Spring4D, das hat schon Multi-Events implementiert.
|
AW: Multi event handles
Ich denke TiGü hat die schon die richtige Antwort gegeben.
Du könntest aber auch eine
Delphi-Quellcode:
oder
TList<TProc>
Delphi-Quellcode:
verwenden.
TList<TArgProc>
Delphi-Quellcode:
Den Callback von jeder Form speichern. Fertig. (fast)
TArgProc = reference to Procedure (Const Args : TArray<TValue>);
Vergiss es, nimm lieber den System.Messages Ansatz... Die paar Taktzyklen.. :stupid: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:04 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