Wie kann ich eine Methode einer Klasse an eine Funktion, die einen Pointer erwartet, übergeben?
Delphi-Quellcode:
TScript = class(TObject)
public
procedure AddFunc(Func: Pointer);
end;
TMyClass = class(TObject)
private
Script: TScript;
public
function MyFunc(const s: string): string;
procedure MyProc;
end;
...
procedure TMyClass.MyProc;
begin
Script.AddFunc(@MyFunc); //<-- FEHLER: E2036 Varaible erforderlich
end;
Wie himitsu schon schreibt: Das geht nicht.
In der Regel behilft man sich damit, dass man eine function schreibt, die dann mittels einer globalen Referenz die Methode der Klasse aufruft.
Delphi-Quellcode:
var
gblClass: TMyClass;
function Callback(const s: string): string;
begin
Result := gblClass.MyFunc(s);
end;
procedure TMyClass.MyProc;
begin
gblClass := Self;
Script.AddFunc(@Callback);
end;
Häufig haben 3rd Party Bibliotheken (oder auch Windows APIs) zu diesem Zweck einen zusätzlichen Pointer-Parameter, der es einem erlaubt sowohl die function als auch die Objektreferenz zu übergeben. Dann geht es ohne die globale Referenz:
Delphi-Quellcode:
TScript = class(TObject)
public
procedure AddFunc(Func: Pointer; data: pointer);
end;
function Callback(data: pointer; const s: string): string;
begin
Result := TMyClass(data).MyFunc(s);
end;
procedure TMyClass.MyProc;
begin
Script.AddFunc(@Callback, Self);
end;