![]() |
Re: Funktionszeiger in StringList.Objects speichern und nutz
Zitat:
Delphi-Quellcode:
TMyClass = class
strict private FStringList: TStringList; function ReadBla(AItem, BItem: TObject): Boolean; procedure Rein(const AName: string; const AReadMethod: TReadMethod); function Raus(AIndex: Integer; AItem, BItem: TObject): Boolean; public constructor Create; procedure Test; end; constructor TMyClass.Create; begin inherited Create; FStringList := TStringList.Create; end; procedure TMyClass.Test; begin Rein('Bla', ReadBla); if not Raus(0, nil, nil) then Beep; end; procedure TMyClass.Rein(const AName: string; const AReadMethod: TReadMethod); var AMethod: TMethod; begin TReadMethod(AMethod) := AReadMethod; FStringList.AddObject(AName, AMethod.Code); end; function TMyClass.Raus(AIndex: Integer; AItem, BItem: TObject): Boolean; var AMethod: TMethod; begin AMethod.Data := Self; AMethod.Code := FStringList.Objects[AIndex]; Result := TReadMethod(AMethod)(AItem, BItem); end; |
Re: Funktionszeiger in StringList.Objects speichern und nutz
So: (OOP)
Delphi-Quellcode:
Oder so (QAD):
Type
TSomeFunction = Function (A,B : TSomeType) : TSomeResult; TMetaFunction = Class Private fFunction : TSomeFunction; Public Constructor Create (aFunction : TSomeFunction); Function CallFunction (A,B : TSomeType) : TSomeResult; End; Constructor TMetaFunction.Create(aFunction : TSomeFunction); Begin fFunction := aFunction; End; Function TMetaFunction.CallFunction (A,B : TSomeType) : TSomeResult; Begin Result := fFunction (A,B); End; ... MyFunctions.Add('FooBarFunction', TMetaFunction.Create(@FooBar)); // Muss man nur beim Aufräumen aufpassen. MyResult := TMetaFunction(MyFunctions.Objects[MyFunctions.IndexOf('FooBarFunction')]).CallFunction(A,B);
Delphi-Quellcode:
@uligerhard: Wegen deiner komischen Bezeichner (Rein, Raus) verstehe ich deinen Code nicht. Machst du das immer so?
Var
FunctionNames : TStringList; FunctionPointer : TList; Procedure AddFunction (aName : String; aFunction : TSomeFunction); Begin FunctionNames.Add(aName); FunctionPointer.Add(aFunction); End; Function GetFunction (aName : String) : TSomeFunction; Begin Result := TSomeFunction(FunctionPointer[FunctionName.IndexOf(aName)]); End; ... AddFunction ('FooBarFunction', @FooBar); MyResult := GetFunction('FooBarFunction')(A,B); |
Re: Funktionszeiger in StringList.Objects speichern und nutz
Zitat:
|
Re: Funktionszeiger in StringList.Objects speichern und nutz
Zitat:
Zitat:
(Wobei: Falls die Methoden wirklich nur immer als Self.ReadBla aufgerufen werden, könnte man das Ganze vielleicht so umformulieren, dass das Speichern normaler 4-Byte-Funktionszeiger ausreicht.) Zitat:
|
Re: Funktionszeiger in StringList.Objects speichern und nutz
Zitat:
Zitat:
[/quote]Dann kann man die Funktionszeiger doch auch gleich in FunctionNames.Objects stecken.[/quote] Stimmt. Ich sitze gerade mit JetLag am Nordpazifik, da passiert sowas schon mal. Das ist auch der Grund, wieso ich 'Rein/Raus' nicht kapiert habe, obwohl das sonst eigentlich recht einfach ist. :stupid: |
Re: Funktionszeiger in StringList.Objects speichern und nutz
Zitat:
|
Re: Funktionszeiger in StringList.Objects speichern und nutz
Nachtrag: OOP-Lösung enthält NOCH KEIN FREIGEBEN, dies muß separat geschehen.
Die OOP Lösung habe ich verwendet, wollte das ungetüm nur umgehen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:22 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