Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.022 c
6-1115775430
Lex_!
2005-05-11 05:37
2005.11.27
HTML код в TWebBrowser


9-1121006782
grouzd[E]v
2005-07-10 18:46
2005.11.27
glBindTexture


14-1130906774
Ксардас
2005-11-02 07:46
2005.11.27
Что-то не пойму в чем проблема....


14-1131347851
Rouse_
2005-11-07 10:17
2005.11.27
Кто меня искал?


14-1131228298
alexdrob
2005-11-06 01:04
2005.11.27
Браузер отображает не все страницы.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский