Hallo,
ich habe mal eine ganz grundsätzliche Frage:
Kann man den Methodenzeiger, den man einem Ereignis (z.B. OnClick) zugewiesen hat, auslesen und speichern, bis man ihn später, unter Umständen auch nach Programmneustart, wieder zuweisen kann?
Zum Hintergrund: ich möchte eine vollständige Kopie eines Objekts erstellen. Da sollen auch die Ereignisbehandlungsroutinen mit eingebunden werden. Dieses Kopieren erreiche ich, indem ich jedes einzele Feld des Objekts in einem Stream speichere. Anschließend lade ich jeden einzelnen Wert aus dem Stream und weise ihn der Objektkopie zu.
Das hat eigentlich den Vorteil, dass ich so auch ganz einfach das Objekt auf der Fesplatte speichern kann, wenn ich statt MemoryStream einen FileStream übergebe. Nach einem Neustart kann ich dann - erneut über einen FileStream - alles wieder laden.
Bei den Methodenzeigern funktioniert das allerdings nicht.
Im Folgenden ein kleines Beispiel mit einem integer Wert (hier weiß ich wie es geht) und einem Methodenzeiger (hierbei weiß ich es nicht):
Delphi-Quellcode:
type
TMyClass = class;
TMyClassEvent = procedure(Sender: TMyClass) of Object;
TMyClass = class(TObject)
private
fEnabled: boolean;
fOnClick: TMyClassEvent;
public
end;
procedure TMyClass.SaveToStream(var stream: TStream);
begin
Stream.Write(MyClass.fEnabled, sizeOf(MyClass.fEnabled));
Stream.Write(MyClass.fOnClick, sizeOf(MyClass.fOnClick)); // das geht so nichtmal durch den Compiler
end;
procedure TMyClass.LoadFromStream(Stream:TStream);
begin
Stream.Read(MyClass.fEnabled, sizeOf(MyClass.fEnabled));
Stream.Read(MyClass.fOnClick, sizeOf(MyClass.fOnClick)); // das geht so nichtmal durch den Compiler
end;
procedure TMyClass.CopyFrom(MyClassSrc: TMyClass);
var stream : TStream;
begin
stream := TMemoryStream.Create;
try
MyClassSrc.SaveToStream(stream);
stream.Position:=0;
self.LoadFromStream(stream);
finally
stream.Free;
end;
end;
Kann mir jemand weiterhelfen?
Viele Grüße,
Stefan.