Страница 1 из 1

Вопросы по указателям на методы!

СообщениеДобавлено: 17.09.2011 19:48:22
Плутон
Изучаю указатели. Возникли вопросы.

Зачем нужны указатели на функции и процедуры?
Как работать с ними?
Предположим моя процедура получила в виде параметра указатель на метод(функцию/процедуру). Как запустить метод, на который указатель ссылается?

P.S. Извините, если я где-то что-то не понимаю.
P.S.S. Заранее огромное спасибо!

Re: Вопросы по указателям на методы!

СообщениеДобавлено: 18.09.2011 03:02:45
pda
В большинстве случаев - просто вызываете переменную, в которой храниться адрес, как будто это функция.

Re: Вопросы по указателям на методы!

СообщениеДобавлено: 18.09.2011 10:24:49
Maxizar
Зачем нужны указатели на функции и процедуры?

Ну для очень разных вещей, от вызова функций из DLL, разработки общего интерфейса вызова функций скажем вами, а самих функций другими, до банального применения в визуальных обьектах. Скажем вы когда переопределяете функцию Клик у кнопки, на самом деле вы создаете процедуру, адрес которой присваиваете указателю, который хранит ее и выполняет в нужный момент (когда система скажет Вау был клик на кнопке) :D

Как применять, ну вот я тут набросал пару примитивных примеров, вплоть до вызова в функции другой процедуры, которая передается через указатель.

Код: Выделить всё
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 ну или в другом источнике.

Re: Вопросы по указателям на методы!

СообщениеДобавлено: 18.09.2011 16:13:09
Плутон
Большое спасибо! Мне как-раз надо было переопределить реакцию на событие в одной проге).

Добавлено спустя 5 часов 14 минут 51 секунду:
А как передавать функцию в виде параметра?

p.s. Извините за очередной "нубский" вопрос.

Re: Вопросы по указателям на методы!

СообщениеДобавлено: 19.09.2011 10:34:26
VirtUX
Плутон писал(а):А как передавать функцию в виде параметра?

Maxizar писал(а):function Func5(P:TProc2):String;
begin
  Result:='';

  if P <> NIL then
     P(5);

end;