type
TBoolMethod = function : boolean of Object;
var
p : Pointer;
BoolMethod : TBoolMethod absolute p;
procedure TForm1.Button1Click(Sender: TObject);
var b : boolean;
begin
p := Form2.MethodAddress('BoolHallo');
TMethod(BoolMethod).code:= p;
TMethod(BoolMethod).data:=form2;
b := BoolMethod();
if (b) then
showmessage('ja')
else
showmessage('nein');
end;
Warum bitte machst du da einen Umweg über eine globale Variable?! Und noch dazu mit absolute?! Pointer und Methodenzeiger haben unterschiedliche Größe! Du überschreibst durch das Setzen von TMethod.Data komplett andere Daten!
Deklarier einfach eine lokale Variable vom Typ TBoolMethod in deiner Methode und arbeite mit der.
type
TBoolMethod = function : boolean of Object;
var
p : Pointer;
BoolMethod : TBoolMethod absolute p;
procedure TForm1.Button1Click(Sender: TObject);
var b : boolean;
begin
p := Form2.MethodAddress('BoolHallo');
TMethod(BoolMethod).code:= p;
TMethod(BoolMethod).data:=form2;
b := BoolMethod();
if (b) then
showmessage('ja')
else
showmessage('nein');
end;
Warum bitte machst du da einen Umweg über eine globale Variable?! Und noch dazu mit absolute?! Pointer und Methodenzeiger haben unterschiedliche Größe! Du überschreibst durch das Setzen von TMethod.Data komplett andere Daten!
Deklarier einfach eine lokale Variable vom Typ TBoolMethod in deiner Methode und arbeite mit der.
Das hatte ich zunächst versucht, aber nicht hinbekommen.
So funktioniert es jetzt bei mir.
type
TBoolMethod = function : boolean of Object;
procedure TForm1.Button1Click(Sender: TObject);
var b : boolean;
BoolMethod : TBoolMethod;
p : Pointer;
M : TMethod;
begin
p := Form2.MethodAddress('BoolHallo');
M.code:= p;
M.data:=form2;
BoolMethod := TBoolMethod(M);
b := BoolMethod();
if (b) then
showmessage('ja')
else
showmessage('nein');
end;
program tmethodptr;
{$mode objfpc}
type
{$M+}
TTest = class
published
function BoolFunc: Boolean;
private
fBool: Boolean;
public
procedure Test;
end;
type
TBoolFunc = function: Boolean of object;
function TTest.BoolFunc: Boolean;
begin
Result := fBool;
end;
procedure TTest.Test;
var
b: TBoolFunc;
begin
TMethod(b).Code := MethodAddress('BoolFunc');
TMethod(b).Data := Self;
fBool := False;
Writeln(b());
fBool := True;
Writeln(b());
end;
var
t: TTest;
begin
t := TTest.Create;
t.Test;
end.