- Код: Выделить всё
type
Func = function (arg:Integer):Integer;
Pfunc = ^Func;
function test(ITem:Integer):Integer;
var
Form1: TForm1;
implementation
{$R *.lfm}
function test(item:Integer):integer;
begin
result:=item + 100;
end;
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
var
PAfunc:Pfunc;
begin
new(PAfunc);
PAfunc^:=@test;
showmessage(IntToStr(PAfunc^(10)));
dispose(PAfunc);
end;
не так ? ))
Добавлено спустя 35 секунд:аналогично проделывается с методами классов
Добавлено спустя 17 минут 9 секунд:Точно так же параметры указателю на метод передаются ))
- Код: Выделить всё
type
Func = function (arg:Integer):Integer;
Pfunc = ^Func;
ClassMethod = function (arg: Integer):integer of object;
PClassMethod = ^ClassMethod;
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
TAClass = class
function MethodTest(arg: Integer):integer;
end;
function test(ITem:Integer):Integer;
var
Form1: TForm1;
implementation
{$R *.lfm}
function TAClass.MethodTest(arg:Integer):Integer;
begin
result:=arg + 200;
end;
function test(item:Integer):integer;
begin
result:=item + 100;
end;
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
var
PAfunc:Pfunc;
MyClass :TAClass;
FPClassMethod : PClassMEthod;
begin
new(PAfunc);
PAfunc^:=@test;
showmessage(IntToStr(PAfunc^(10)));
dispose(PAfunc);
MyClass := TAClass.Create;
new(FPClassMethod);
FPCLassMEthod^:= @MyClass.MethodTest;
showmessage(IntToStr(FPClassMethod^(15)));
dispose(FPClassMethod);
MyClass.Free;
end;
Добавлено спустя 3 минуты 42 секунды:первое окошечко "выбросит " 110 , второе - 215 . Значит все работает правильно - указатель на функцию или метод "берутся " , при вызове параметры им "отдаются " , указатели уничтожаются без "последствий" - никаких "плохих окошечек с красным крестиком" не выбрасывается
Добавлено спустя 14 минут 4 секунды:- Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
type
TClassPointer = ^TAClass;
var
PAfunc:Pfunc;
MyClass :TAClass;
FPClassMethod : PClassMEthod;
ClassPOinter: TClassPointer;
begin
//вариант со вложенным указателем
//создаем экземпляр
MyClass:=TAClass.Create;
// получаем укзаатели
new(ClassPOinter); //указатель на экземпляр
new (FPCLassMEthod);
ClassPointer^:=MyClass;
// используя указатель на экземпляр получаем указатель на метод ^_^
FPCLassMethod^:=@ClassPointer^.MethodTest;
// вывзываем метод , используя указатель , полученный от указателя ^_^
showmessage(IntToStr(FPClassMethod^(150)));
dispose(ClassPointer);
dispose(FPCLassMethod);
MyClass.Free;
end;
Добавлено спустя 1 минуту 49 секунд:Вам так надо было ? ) "Указатель на метод , полученный от указателя на экземпляр класса, вызываемый с передачей ему параметров " ) ?
