![]() |
Wie Methode als Pointer übergeben?
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; |
AW: Wie Methode als Pointer übergeben?
Vielleicht hilft das
Delphi-Quellcode:
type
TFunctionParameter = function(const value : integer) : string; ... function One(const value : integer) : string; begin result := IntToStr(value) ; end; function Two(const value : integer) : string; begin result := IntToStr(2 * value) ; end; function DynamicFunction(f : TFunctionParameter) : string; begin result := f(2006) ; end; ... //Example usage: var s : string; begin s := DynamicFunction(One) ; ShowMessage(s) ; //will display "2006" s := DynamicFunction(Two) ; ShowMessage(s) ; // will display "4012" end; ![]() |
AW: Wie Methode als Pointer übergeben?
Zitat:
|
AW: Wie Methode als Pointer übergeben?
Ein Methoden-Zeiger und auch die Class-Function bestehen aus zwei Pointern (Objekt-Instanz und Funktion-Zeiger)
und es ist unmöglich sie in nur einem Pointer zu speichern. Static-Class-Funktions und reguläre Funktionen haben kein Self und bestehen nur aus einem Zeiger. Einen Zeiger auf eine Variable mit dem Methodenzeiger. * zeigt auf eine Variable irgendwo * oder eine neue Variable mit New erstellt * oder eine eben eine reguläre Funktion verlinken |
AW: Wie Methode als Pointer übergeben?
Zitat:
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:
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:
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;
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; |
AW: Wie Methode als Pointer übergeben?
Zitat:
Delphi-Quellcode:
procedure TMyClass.MyProc;
begin gblClass := Self; Script.AddFunc(procedure Callback(const s: string) begin Result := gblClass.MyFunc(s); end ); end; |
AW: Wie Methode als Pointer übergeben?
Ich würde für jede Methode eine eigene Klasse erstellen.
Der Script-Liste dann jeweils Instanzen der Klassen hinzufügen. Konzept:
Delphi-Quellcode:
TCustomDraw = class
public procedure Draw(ACanvas: TCanvas); virtual; abstract; end; TLine = class(TCustomDraw) constructor Create(x1, y1, x2, y2: Integer); public procedure Draw(ACanvas: TCanvas); override; end; TCircle = class(TCustomDraw) constructor Create(x, y, r: Integer); public procedure Draw(ACanvas: TCanvas); override; end; procedure BuildScript; begin Script.Add(TLine.Create(5, 4, 8, 9)); Script.Add(TCircle.Create(5, 4, 2)); Script.Add(TCircle.Create(8, 9, 2)); end; procedure ExecuteScript(ACanvas: TCanvas); var cmd: TCustomDraw; begin for cmd in Script do cmd.Draw(ACanvas); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:17 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 by Thomas Breitkreuz