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


Автор: Kusik 18.11.2009, 17:59
Есть бесформенный проект. В теле между begin..end создаю форму, панель и кнопки (массив кнопок). Но как дошел до присвоения процедуры на OnClick при попытке описать процедуру, которая должна выполнятся на нажатие кнопки (любой в массиве) вылазит следующая ошибка:

Statement Expected but 'PROCEDURE' found

тело dpr-файла выглядит следующим образом:

Код

program blablabla;

uses ...;

var
 ...
 btns:array[1..15] of tButton;

begin

 procedure click;   //<-тут и вылазит эта ошибка
 begin
  //чтото делаем
 end;
 ...
 //Динамическое создание формы, панели и в цикле кнопок
 btns[i].OnClick:=click; //тут естественно тоже ошибка
 ...
end;


Подскажите, что я делаю не так или чего не хватает?


M
Rrader
Пользуйтесь кнопкой "Код" для подсветки синтаксиса!

Автор: Демо 18.11.2009, 18:12
Цитата(Kusik @  18.11.2009,  17:59 Найти цитируемый пост)
procedure click;   //<-тут и вылазит эта ошибка begin  //чтото делаем end;


Обработчик должен быть объектного типа:

Код

  TDummyClass=class
    procedure Click(Sender: TObject);
  end;
...

var
  Dummy: TDummyClass;
...

btns[i].OnClick := Dummy.Click;

Автор: Kusik 18.11.2009, 18:25
все равно, таже ошибка. может нехватает какойнить директивы. это не пас-файл.
делал класс левый, и ему присваивал эту процедуру, но все равно, даже если так написать после бегина:

Код

...
begin

 procedure Dummy.click(Sender: TObject);    //чезанах?!1
 begin
  ShowMessage('  ');
 end;

то ошибка таже и повторяется


Автор: Демо 18.11.2009, 18:35
Блин, ты ж наверняка не первый раз видишь код для реализации класса.
Код

procedure TDummyClass.Click(Sender: TObject);
begin
  ShowMessage('ok');
end;

Автор: Kusik 18.11.2009, 18:39
ну ладно, написал не так. да. не первый раз конечно же. ошибка говорит о том что чегото нехватает. а чего  хз. как не пиши эту процедуру, хоть относительно класса, хоть отфона, ошибка та же. уже сварился%)

Автор: Демо 18.11.2009, 19:38
Kusik, 

Ну так получил нужный результат или нет?

Добавлено @ 19:43
Тьфу... Понял, что ЕЩЁ у тебя не получается.

В файле проекта консольного приложения нет секции implementation.

Если у тебя есть модуль отдельный - включи фиктивный класс в него, реализацию тоже там сделай.
Или создай смодуль с одним этим классом...

Добавлено @ 19:45
Код

unit Unit2;

interface

type

  TDummyClass=class
    procedure Click(Sender: TObject);
  end;

implementation

{ TDummyClass }

procedure TDummyClass.Click(Sender: TObject);
begin
  //В качестве Sender будет передаваться твой Btns[i]
end;

end.



А в файле проекта всё остаётся так же:

Код

var
  Dummy: TDummyClass;
...
Btns[i].OnClick := Dummy.Click;

Автор: Frees 18.11.2009, 22:50
Код

var
 ...
 btns:array[1..15] of tButton;


procedure ClickBtn(Sender: TObject);   //<-тут уже НЕ вылазит эта ошибка
 begin
  //чтото делаем
 end;

begin
....
 @btns[i].OnClick:=@ClickBtn; 
....
end.

Автор: kami 19.11.2009, 01:55
Цитата(Frees @  18.11.2009,  22:50 Найти цитируемый пост)
//<-тут уже НЕ вылазит эта ошибка

Синтаксически, может и не вылазит. 
Но как быть с параметром Self, неявно передаваемым при вызове любого метода объекта?

Автор: Frees 19.11.2009, 07:17
Цитата(kami @  19.11.2009,  04:55 Найти цитируемый пост)
Но как быть с параметром Self, неявно передаваемым при вызове любого метода объекта?

согласен, self будет nil, но Sender будет правильный 

Автор: CodeMonkey 19.11.2009, 13:13
Frees, а ты вообще свой код проверял? smile  указатель (4 байта) <-> метод (8 байт).

Добавлено через 5 минут и 36 секунд
http://gunsmoker.blogspot.com/2008/12/static-delphi.html

Цитата(Kusik @  18.11.2009,  18:39 Найти цитируемый пост)
ошибка говорит о том что чегото нехватает. а чего  хз.

Текст ошибки, как и полный код, являются военной тайной?

Автор: Frees 19.11.2009, 14:07
Цитата(CodeMonkey @  19.11.2009,  16:13 Найти цитируемый пост)
Frees, а ты вообще свой код проверял

проверял работает

Добавлено @ 14:11
Цитата
@btns[i]....


Автор: CodeMonkey 19.11.2009, 14:28
Цитата(Frees @  19.11.2009,  14:07 Найти цитируемый пост)
работает

 smile  и как же это это работает?

Автор: Frees 19.11.2009, 14:39
Цитата(CodeMonkey @  19.11.2009,  17:28 Найти цитируемый пост)
smile  и как же это это работает?

не совсем конечно правельно в клике не будет self а так все норм.

вот так я проверял...может что и недоглядел...
Код

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure BtnClick(Sender: TObject);
begin
  ShowMessage('BtnClick');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  @Button1.OnClick := @BtnClick;
end;

Автор: Демо 19.11.2009, 15:00
Frees, 

На всякий случай проверь и такую процедуру:

Код

procedure BtnClick(Sender: TObject);
begin
  ShowMessage('BtnClick, CallerName: '+TButton(Sender).Name);
end;



 smile 

Автор: Frees 19.11.2009, 15:16
Цитата(Демо @  19.11.2009,  18:00 Найти цитируемый пост)
На всякий случай проверь и такую процедуру:

действительно сендер тоже нил...

Автор: CodeMonkey 19.11.2009, 16:37
А, дьявол, @ слева я не заметил.
Прошу пардону.


Тем не менее, правильным будет:
Код
type
  TDummyClass=class
    class procedure Click(Sender: TObject);
  end;

class procedure TDummyClass.Click(Sender: TObject);
begin
  // ...
end;

...

Btns[i].OnClick := TDummyClass.Click;

Автор: Frees 19.11.2009, 19:17
Цитата(CodeMonkey @  19.11.2009,  19:37 Найти цитируемый пост)
Тем не менее, правильным будет:

правельнее сделать класс контейнер всех этих кнопок, а то какойто полу ООП получается

Добавлено через 4 минуты и 5 секунд
я что то понять не могу почему в моем варианте Sender nil

Автор: Демо 19.11.2009, 19:48
Цитата(Frees @  19.11.2009,  19:17 Найти цитируемый пост)
я что то понять не могу почему в моем варианте Sender nil


Так он не передаётся в процедуру.

Автор: CodeMonkey 19.11.2009, 21:28
Цитата(Frees @  19.11.2009,  19:17 Найти цитируемый пост)
я что то понять не могу почему в моем варианте Sender nil 

Потому что в OnClick ты присвоил указатель на метод. Указатель на объект не менялся.

Автор: Kusik 20.11.2009, 12:14
Не могу не согласится с Демо, т.к. придется именно мудуль и делать с левым классом и процедурами. 

Frees, да, согласен, так проще, безусловно. Когда форма уже существует.- в описании формы связать какую процедуру с нажатием на кнопку. Но форма у меня создается так же как и кнопки. Да и вобще сам проект это только dpr-файл (уже и .res удалил, чтобы не путаться) Я вообще искал решение, надеясь что можно обойтись 1 файлом - dpr. Но, как указал Демо, на то, что в проекте нет секции implementation, пришлось создавать левый Юнит (.pas), описывать в нем левый класс и те процедуры, которые я хотел бы пристегнуть на определенные события в дпр-файле.

Автор: Kusik 20.11.2009, 14:05
все. так и сделал, через левый модуль. спасибо за помощь

Автор: CodeMonkey 20.11.2009, 21:07
Цитата(Kusik @  20.11.2009,  12:14 Найти цитируемый пост)
Но, как указал Демо, на то, что в проекте нет секции implementation, пришлось создавать левый Юнит (.pas), описывать в нем левый класс и те процедуры, которые я хотел бы пристегнуть на определенные события в дпр-файле. 

Вообще-то отдельный модуль здесь не нужен. И секция implementation тем более не при чём.

Автор: Демо 20.11.2009, 21:33
Цитата(CodeMonkey @  20.11.2009,  21:07 Найти цитируемый пост)
Вообще-то отдельный модуль здесь не нужен. И секция implementation тем более не при чём.


Уг. Точно. Ступил. Не нужен модуль. Всё в файле проекта реализуется.


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