Es ist zwar schon mehrfach angesprochen worden, aber hier mal ein konkretes Beispiel. Der Einfachheit halber geben die Funktionen lediglich einen Integer-Wert zurück:
Delphi-Quellcode:
type
TMyFunc = function: Integer of object;
function CallObjectFunction(Instance: TObject; const FuncName: string): Integer;
var
Func: TMyFunc;
MVar: TMethod;
begin
MVar.Data := Instance;
MVar.Code := Instance.MethodAddress(FuncName);
Assert(Assigned(MVar.Code));
Func := TMyFunc(MVar);
result := Func();
end;
type
{$METHODINFO ON} // falls das nicht geht, müssen die Methoden published sein!
TTestObject = class
public
function Test1: Integer;
function Test2: Integer;
end;
function TTestObject.Test1: Integer;
begin
result := 42;
end;
function TTestObject.Test2: Integer;
begin
result := 4711;
end;
procedure TestIt;
var
res: Integer;
TestObject: TTestObject;
begin
TestObject := TTestObject.Create;
try
res := CallObjectFunction(TestObject, 'Test1');
Assert(res = 42);
res := CallObjectFunction(TestObject, 'Test2');
Assert(res = 4711);
finally
TestObject.Free;
end;
end;