Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.27;
Скачать: CL | DM;

Вниз

Заменить процедуру события 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.041 c
5-1113916284
giorgi
2005-04-19 17:11
2005.11.27
TPropertyEditor


2-1131691494
DimonS
2005-11-11 09:44
2005.11.27
Объясните такую ситуацию.


2-1131347777
mennn
2005-11-07 10:16
2005.11.27
Ошибка при компиляции


14-1131311266
Yeg
2005-11-07 00:07
2005.11.27
Олимпиалы и прочии конкурсы по программированию...


4-1127504463
polaroid
2005-09-23 23:41
2005.11.27
Прозрачная форма (глюки с прозрачностью чёрного цвета)