Зачем нужны указатели на функции и процедуры?
Ну для очень разных вещей, от вызова функций из DLL, разработки общего интерфейса вызова функций скажем вами, а самих функций другими, до банального применения в визуальных обьектах. Скажем вы когда переопределяете функцию Клик у кнопки, на самом деле вы создаете процедуру, адрес которой присваиваете указателю, который хранит ее и выполняет в нужный момент (когда система скажет Вау был клик на кнопке)
Как применять, ну вот я тут набросал пару примитивных примеров, вплоть до вызова в функции другой процедуры, которая передается через указатель.
- Код: Выделить всё
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
ComboBox1: TComboBox;
procedure Button1Click(Sender: TObject);
private
procedure NewClick(Sender: TObject);
{ private declarations }
public
{ public declarations }
end;
TProc1 = procedure();
TProc2 = procedure(a:Integer);
TFunc3 = function():String;
TFunc4 = function(a:word):String;
TFunc5 = function(P:TProc2):String;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
//procedure NewClick(Sender: TObject);
//begin
// Form1.Caption:='NewClick';
//end;
procedure Proc1();
begin
Form1.Caption:='';
end;
procedure Proc2(a:Integer);
begin
Form1.Caption:=IntToStr(a);
end;
function Func3():String;
begin
Result:='Func3';
Form1.Caption:='Func3';
end;
function Func4(a:word):String;
begin
Result:=IntToStr(a);
Form1.Caption:=Result;
end;
function Func5(P:TProc2):String;
begin
Result:='';
if P <> NIL then
P(5);
end;
procedure TForm1.NewClick(Sender: TObject);
begin
Caption:='NewClick';
end;
procedure TForm1.Button1Click(Sender: TObject);
var P1:TProc1;
P2:TProc2;
F3:TFunc3;
F4:TFunc4;
F5:TFunc5;
begin
P1:=@Proc1;
P2:=@Proc2;
F3:=@Func3;
F4:=@Func4;
F5:=@Func5;
case ComboBox1.ItemIndex of
0:begin
if P1<>Nil then
P1;
end;
1:begin
if P2<>Nil then
P2(125);
end;
2:begin
if F3<>Nil then
F3;
end;
3:begin
if F4<>Nil then
F4(4);
end;
4:begin
if F5<>Nil then
F5(P2);
end;
5:begin
Button1.OnClick:=@NewClick;
Button1.Click;
end;
end;
end;
end.
Так же как вы заметили, я переопределил процедуру клик у кнопки...
Ну тут наверное самое сложное, это понять что указатель на процедуру\функцию и указатель на метод это разные вещи, в указателе на метод еще
НЕ явно передается указатель на Self
Подробнее об этом можно прочитать скажем тут:
Обработчики событий в Delphi ну или в другом источнике.