![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Заменить процедуру события 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;
Если же твоя цель создать обработчик именно с двумя параметрами, то ... врядли. Придется тебе обходиться одним параметром. А зачем тебе два?