Форум: "Начинающим";
Текущий архив: 2005.11.27;
Скачать: [xml.tar.bz2];
ВнизЗаменить процедуру события OnClick Найти похожие ветки
← →
12next (2005-11-04 15:13) [0]Добрый день. Подскажите пожалуйста
есть процедура:
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-04 16:17) [1]OnClick : TNotifyEvent;
TNotifyEvent = procedure(Sender: TObject) of object;
Т.е. в качестве обработчика должна быть назначен метод (кстати говоря, а не обычная процедура), принимающий ОДИН параметр. Имхо подставить обработчиком процедуру с двумя параметрами у тебя не получится.
Точнее, подставить может и получится, с помощью ухищрений типа "@"
(и уже получилось строчкой @btn.OnClick:=@ChangeCaption), но ТАК ДЕЛАТЬ НЕЛЬЗЯ и сказать к каким последствия это приведет, я не возьмусь :).
Если хочешь назначить процедуру обработчиком своей кнопке, то, к примеру, объяви эту процедуру методом класса TForm :
Form1 = class(TForm)
...
public
procedure ChangeCaption(Sender: TObject);
...
end;
и после создания кнопки:
btn.OnClick := ChangeCaption;
Если же твоя цель создать обработчик именно с двумя параметрами, то ... врядли. Придется тебе обходиться одним параметром. А зачем тебе два?
← →
Pasha L © (2005-11-04 16:26) [2]12next (04.11.05 15:13)
Как я понимаю, тебе нужно каждой кнопке поставить в соответствие определенную строку, которая при нажатии на ту кнопку будет становиться ей кэпшэном. Так сделай простоcase tbutton(sender).name of
. И поставь в соответствие каждой кнопке какую-то строку. Если много кнопок и строк - сделай всё с помощью строкового массива.
← →
dr. Jung (2005-11-04 17:47) [3]2 Pasha L © (04.11.05 16:26) [2]
case
для строк не работает.if ... then
поможет
← →
12next (2005-11-07 21:21) [4]>>Придется тебе обходиться одним параметром. А зачем тебе два?
а зачем нужны процедуры или функции больше чем с одни параметром? :)
← →
Плохиш © (2005-11-07 23:20) [5]
> 12next (07.11.05 21:21) [4]
OnClick - это событие на нажатие кнопки и его вызов инициализируется системой, которой совершенно по кумполу, что ты там куда передать хочешь. У неё есть соглашение о параметрах, она им и пользуется.
← →
Leonid Troyanovsky © (2005-11-08 08:52) [6]
> 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.
← →
Bless © (2005-11-08 08:53) [7]> 12next (07.11.05 21:21) [4]
>
> >>Придется тебе обходиться одним параметром. А зачем тебе
> два?
> а зачем нужны процедуры или функции больше чем с одни параметром?
> :)
Я имел ввиду зачем тебе именно обработчик OnClick с двумя параметрами, а не процедура вообще? Как ты этот второй параметр использовал бы?
Кстати
> Bless © (04.11.05 16:17) [1]
> но ТАК ДЕЛАТЬ НЕЛЬЗЯ
Это я слегка погорячился :) В VCL есть примеры такого кода. Правильнее было сказать, что так делать можно только если четко представляешь, что делаешь.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2005.11.27;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.013 c