Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Заменить процедуру события OnClick [D5, D6, D7, WinXP]


12next ©   (2005-11-04 15:13:00) 

Добрый день. Подскажите пожалуйста

есть процедура:
procedure ChangeCaption(Sender: TObject; aCaption: TCaption);
begin
 TButton(Sender).Caption:=aCaption;
end;

я динамически создаю кнопку например:
...
bnt:=TButton.Create(Form1);
btn.Parent:=Form1;
btn.left:=10;
btn.top:=10;
@btn.OnClick:=@ChangeCaption(Sender, 'Button5');
Выдает Error: Variable Reguired
а, если написать так:
@btn.OnClick:=@ChangeCaption; работает, но мне нужно передавать параметры.
Подскажите как это можно реализовать?


Bless   (2005-11-08 08:53:00) [1]

> 12next   (07.11.05 21:21) [4]
>
> >>Придется тебе обходиться одним параметром. А зачем тебе
> два?
> а зачем нужны процедуры или функции больше чем с одни параметром?
>  :)


Я имел ввиду зачем тебе именно обработчик OnClick с двумя параметрами, а не процедура вообще? Как ты этот второй параметр использовал бы?
Кстати


> Bless ©   (04.11.05 16:17) [1]
>  но ТАК ДЕЛАТЬ НЕЛЬЗЯ

Это я слегка погорячился :) В VCL есть примеры такого кода. Правильнее было сказать, что так делать можно только если четко представляешь, что делаешь.


Leonid Troyanovsky   (2005-11-08 08:52:00) [2]


> 12next   (04.11.05 15:13)  

> есть процедура:
> procedure ChangeCaption(Sender: TObject; aCaption: TCaption);
> begin
>  TButton(Sender).Caption:=aCaption;
> end;

> я динамически создаю кнопку например:

> bnt:=TButton.Create(Form1);
..
> @btn.OnClick:=@ChangeCaption(Sender, 'Button5');
..
> мне нужно передавать параметры.
> Подскажите как это можно реализовать?


type
 TButtonX = class(TButton)
 private
   FClickCaption: String;
 public
   procedure Click; override;
   property ClickCaption : String read FClickCaption write FClickCaption;
 end;

procedure TButtonX.Click;
begin
 inherited;
 Caption := ClickCaption;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 with TButtonX.Create(nil) do
   begin
     Parent := Self;
     ClickCaption := 'Button5';
   end;
end;


--
Regards, LVT.


Плохиш   (2005-11-07 23:20:00) [3]


> 12next   (07.11.05 21:21) [4]

OnClick - это событие на нажатие кнопки и его вызов инициализируется системой, которой совершенно по кумполу, что ты там куда передать хочешь. У неё есть соглашение о параметрах, она им и пользуется.


12next   (2005-11-07 21:21:00) [4]

>>Придется тебе обходиться одним параметром. А зачем тебе два?
а зачем нужны процедуры или функции больше чем с одни параметром? :)


dr. Jung   (2005-11-04 17:47:00) [5]

2 Pasha L ©   (04.11.05 16:26) [2]

caseдля строк не работает. if ... thenпоможет


Pasha L   (2005-11-04 16:26:00) [6]

12next   (04.11.05 15:13)
Как я понимаю, тебе нужно каждой кнопке поставить в соответствие определенную строку, которая при нажатии на ту кнопку будет становиться ей кэпшэном. Так сделай просто case tbutton(sender).name of. И поставь в соответствие каждой кнопке какую-то строку. Если много кнопок и строк - сделай всё с помощью строкового массива.


Bless   (2005-11-04 16:17:00) [7]

OnClick : TNotifyEvent;

TNotifyEvent = procedure(Sender: TObject) of object;

Т.е. в качестве обработчика должна быть назначен метод (кстати говоря, а не обычная процедура), принимающий ОДИН параметр. Имхо подставить обработчиком процедуру с двумя параметрами у тебя не получится.
Точнее, подставить может и получится, с помощью ухищрений типа "@"
(и уже получилось строчкой @btn.OnClick:=@ChangeCaption), но ТАК ДЕЛАТЬ НЕЛЬЗЯ и сказать к каким последствия это приведет, я не возьмусь :).

Если хочешь назначить процедуру обработчиком своей кнопке, то, к примеру, объяви эту процедуру методом класса TForm :

Form1 = class(TForm)
 ...
 public
   procedure ChangeCaption(Sender: TObject);
 ...
end;

и после создания кнопки:


btn.OnClick := ChangeCaption;


Если же твоя цель создать обработчик именно с двумя параметрами, то ... врядли. Придется тебе обходиться одним параметром. А зачем тебе два?


Наверх

Титульная страница Поиск, карта сайта Написать письмо