Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как правильно работать с процедурными типами?


Автор: danilsl 29.8.2007, 16:49
Привет всем.
Вот такой код:
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TProcType = procedure(Parametr:integer);

  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    procvar:TProcType;
    procedure gg(Parametr:integer);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  procvar(3);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  procvar:=@TForm1.gg;
end;

procedure TForm1.gg(Parametr: Integer);
begin
  ShowMessage(IntToStr(Parametr));
end;

end.

Я рассчитывал  smile , что в ShowMessage(IntToStr(Parametr)) выскочит тройка, однако вылезло 10781088. Подскажите, что я не так делаю.
Заранее всем спасибо.

Автор: lukas 29.8.2007, 16:55
прально... она возвращает адресс процедуры.. а не параметр!  smile 

Автор: skyboy 29.8.2007, 16:57
учитывая, что у тебя не процедура, а метод, то тип надо объявить так:
Код

type
  TProcType = procedure(Parametr:integer) of object;

Ибо методу ещё и передается объект, к которому этот метод относится. По всей видимости, этот аргумент должен идти первым(или последним). И если ты работаешь с методом как с обычной процедурой(как у тебя и есть), то процедура будет обрабатывать и аргумент-указатель на объект, а при приведении к типу integer там будет всяко не тройка, а довольно большое число-адрес. Что у тебя и наблюдается. А если мы указываем тип "procedure(...) of object", то указываем пропускать аргумент-указатель и работать только с объявленными программистом аргументами.

Автор: lukas 29.8.2007, 17:04
попробуй так...

Код

procedure TForm1.FormCreate(Sender: TObject);
begin
  @procvar:=@TForm1.gg;
end;

Автор: danilsl 29.8.2007, 17:05
Всем спасибо, разобрался.

Автор: skyboy 30.8.2007, 09:20
Цитата(lukas @  29.8.2007,  16:04 Найти цитируемый пост)
@procvar:=@TForm1.gg;

зачем? в коде есть ещё одна неувязка: 
Код

procedure TForm1.gg(parametr: integer);
...
procvar:= TForm1.gg;
...

Т.е. метод относится к конкретному объекту, а работать с ним пытаются как с методом класса. Учитывая, что работа с полями объекта не происходит, вроде бы все ничего, но лучше ошибок не создавать себе и либо объявить метод методом класса:
Код

TForm1 = class(TForm)
...
class procedure gg(PArametr: integer);
...
procvar:= TForm1.gg;

либо получать метод через объект, а не через класс
Код

TForm1 = class(TForm)
...
 procedure gg(Parametr: integer);
...
 procvar:= Self.gg;
...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)