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"