AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wie Methode als Pointer übergeben?

Ein Thema von BlueStarHH · begonnen am 22. Jul 2018 · letzter Beitrag vom 1. Aug 2018
 
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.691 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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:26 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