Einzelnen Beitrag anzeigen

Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.468 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: Wie Methode als Pointer übergeben?

  Alt 22. Jul 2018, 14:36
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;
Thomas Mueller
  Mit Zitat antworten Zitat