![]() |
Funktionszeiger in StringList.Objects speichern und nutzen
Hallo,
Ich würde gerne in einer TStringList per AddObject('SomeStr', @ReadBla); hinzufügen ReadBla ist definiert als function ReadBla(AItem, BItem : Tobject) :boolean. Der Aufruf AddObject wie oben funktioniert nicht. Also Baue ich folgendes TReadMethod = function(A, B : TObject) : boolean of object; dann
Delphi-Quellcode:
Das funktioniert, obwohl ich mir nicht sicher bin ob AMethod wirklich ein Object ist.
var
AMethod : TReadMethod; begin AMethod := ReadBla; AStringList.AddObject('Bla', AMethod); end; Jetzt habe ich das Problem wie rufe ich AMethod aus AStringList auf?
Delphi-Quellcode:
Wenn mir da jemand weiterhelfen könnte wäre das sehr schick.
(AStringList.objects[0] as TReadMethod)(AObject, BObject); //FUNKTIONIERT NICHT!
Gruß |
Re: Funktionszeiger in StringList.Objects speichern und nutz
Mahlzeit!
Warum muss es denn eine TStringList sein? Ist das nicht irgendwie... pervers :) ? Nichts für ungut :stupid: .. |
Re: Funktionszeiger in StringList.Objects speichern und nutz
Sowas geht nicht "direkt", denn function of object ist kein "einfacher" Prozedur-Zeiger, sondern er ist ein Methoden-Zeiger und besteht eigentlich aus 2 Zeigern ala 8 Byte (einmal auf die Funktion und dann nocheiner zum Objekt)
Also paßt er nicht in einen "normalen" 4-Byte-Zeiger rein. Du müßtest dir z.B. mit ![]() |
Re: Funktionszeiger in StringList.Objects speichern und nutz
puh,
schade, nagut dann baue ich ein Object dessen Eigenschaft den Zeiger beinhaltet und packe das dort rein. Thx für die schnellen Antworten |
Re: Funktionszeiger in StringList.Objects speichern und nutz
@himitsu
Hey ich probiere gerade deine Methode über new aus. Also Definiere ich
Delphi-Quellcode:
Wie Rufe ich die ganze Sache jetzt auf?
var
ARead : ^TReadMethod; begin New(ARead); ARead^ := ReadBla; AStringList.AddObject('Bla', ARead); end; TReadMethod(AStringList.Objects[0])^(A,B) funktioniert nicht |
Re: Funktionszeiger in StringList.Objects speichern und nutz
Müsste das nicht so heißen: "TReadMethod(Pointer(AStringList.Objects[0])^)(A,B)" :gruebel:
(Kann´s gerade nicht testen) |
Re: Funktionszeiger in StringList.Objects speichern und nutz
Kann man Methoden überhaupt ohne Objekt aufrufen?
|
Re: Funktionszeiger in StringList.Objects speichern und nutz
Die Methode ReadBla ist innerhalb des Objektes definiert, also existiert ja ein Objekt.
@mleyen ja das könnte vlt funktionieren aber ich sehe gerade das die Zuweisung AStringList.AddObject('Bla', ARead); nicht funktioniet. ARead ist für ihn kein Objekt. Habe ARead nach dem new Beispiel folgendermaßen definiert
Delphi-Quellcode:
TReadMethod = function(A, B : TObject) : boolean of object;
PReadMethod = ^TReadMethod ... var ARead : PReadMethod |
Re: Funktionszeiger in StringList.Objects speichern und nutz
Wieso fügst Du dann nicht das Objekt in die Liste ein statt "mit Gewalt" nur dessen Methode?
|
Re: Funktionszeiger in StringList.Objects speichern und nutz
das Zuweisen das ist schonmal OK
Delphi-Quellcode:
das Auslesen einfach so
var
ARead : PReadMethod; begin New(ARead); ARead^ := ReadBla; AStringList.AddObject('Bla', ARead); end;
Delphi-Quellcode:
Und am Ende nicht das Freigeben (Dispose) vergessen.
PReadMethod(AStringList.Objects[0])^
@DeddyH: wenn er :=ReadBla nutzt, dann wird dieser Code vermutlich direkt in der Klasse ( :=Self.ReadBla ) rumliegen ... also kein Problem :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:25 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