Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Funktionszeiger in StringList.Objects speichern und nutzen (https://www.delphipraxis.net/143613-funktionszeiger-stringlist-objects-speichern-und-nutzen.html)

Master_BB 19. Nov 2009 10:12


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:
var
  AMethod : TReadMethod;
begin
  AMethod := ReadBla;
  AStringList.AddObject('Bla', AMethod);
end;
Das funktioniert, obwohl ich mir nicht sicher bin ob AMethod wirklich ein Object ist.
Jetzt habe ich das Problem wie rufe ich AMethod aus AStringList auf?

Delphi-Quellcode:
  (AStringList.objects[0] as TReadMethod)(AObject, BObject); //FUNKTIONIERT NICHT!
Wenn mir da jemand weiterhelfen könnte wäre das sehr schick.

Gruß

wicht 19. Nov 2009 10:21

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: ..

himitsu 19. Nov 2009 10:21

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 Delphi-Referenz durchsuchenNew Speicher für einen Metodenzeiger reservieren und den Zeiger zu diesem Speicher dann der Liste hinzufügen.

Master_BB 19. Nov 2009 10:26

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

Master_BB 19. Nov 2009 10:37

Re: Funktionszeiger in StringList.Objects speichern und nutz
 
@himitsu

Hey ich probiere gerade deine Methode über new aus.
Also Definiere ich
Delphi-Quellcode:
var
  ARead : ^TReadMethod;
begin
  New(ARead);
  ARead^ := ReadBla;
  AStringList.AddObject('Bla', ARead);
end;
Wie Rufe ich die ganze Sache jetzt auf?
TReadMethod(AStringList.Objects[0])^(A,B) funktioniert nicht

mleyen 19. Nov 2009 10:40

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)

DeddyH 19. Nov 2009 10:41

Re: Funktionszeiger in StringList.Objects speichern und nutz
 
Kann man Methoden überhaupt ohne Objekt aufrufen?

Master_BB 19. Nov 2009 10:48

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

DeddyH 19. Nov 2009 10:56

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?

himitsu 19. Nov 2009 11:01

Re: Funktionszeiger in StringList.Objects speichern und nutz
 
das Zuweisen das ist schonmal OK
Delphi-Quellcode:
var
  ARead : PReadMethod;
begin
  New(ARead);
  ARead^ := ReadBla;
  AStringList.AddObject('Bla', ARead);
end;
das Auslesen einfach so
Delphi-Quellcode:
PReadMethod(AStringList.Objects[0])^
Und am Ende nicht das Freigeben (Dispose) vergessen.


@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.
Seite 1 von 2  1 2      

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