![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Есть несколько кнопок у которых в событие OnClick прописана одна [D5, WinME]
Кен © (2002-10-31 05:05:00)и таже процедура Button1Click. А как в этой процедуре определить какая кнопка была нажата?
Вроде бы на то какая кнопка нажата должен указывать Sender , но он указывает на Form1, а не на кнопку. Как же определить ?
Есть вариант делать так :
procedure TForm1.N2Click(Sender: TObject);
begin
if ( Button1.Focused = true ) then ...
if ( Button2.Focused = true ) then ...
if ( Button3.Focused = true ) then ...
if ( Button4.Focused = true ) then ...
if ( Button5.Focused = true ) then ...
end;
но не у всех кнопок есть Focused. И вообще это какой то левый способ. Нет ли другого, попроще ?
Кен (2002-11-01 07:47:00) [1]В общем, всем спасибо за помощь ! Я осознал как надо решать эту не простую задачу.
Владислав (2002-10-31 16:54:00) [2]///...
if (Sender is TComponent) then
ShowMessage(TComponent(Sender).Name);
//...
if (Sender is TComponent) and (TComponent(Sender).Name = "Button1") then
ShowMessage("Button1"); //Зависит от опции компилятора Complete boolean eval
Наверное достаточно...
Серго (2002-10-31 14:44:00) [3]
procedure TFmMain.MnItClick(Sender: TObject);//Our OnClick procedure...
var
i:word;
begin
case TComponent(Sender).Tag of
100..199 :
begin
Write(UsResFile,"Тест - "+TstFiles[TComponent(Sender).Tag-101]+". ");
ShowTest(TstPath+"\"+TstFiles[TComponent(Sender).Tag-101]);
end;
200..299:
ShowLesson(LsnPath+"\"+LsnFiles[TComponent(Sender).Tag-201]);
else
begin
i:=TComponent(Sender).Tag-301;
ShowUsReg(GrpPath+"\"+GrpFiles[i],GrpFiles[i]);
end;
end;
end;
...
...
procedure TFmMain.FormCreate(Sender: TObject);
...
MnIt[i]:=TMenuItem.Create(MnTest);
MnTest.Add(MnIt[i]);
MnIt[i].Tag:=100+i+1;
s:=TstFiles[i];
Delete(s,Pos(".txt",s),4);
MnIt[i].Caption:=s;
MnIt[i].OnClick:= MnItClick;....
end;
...
Пример из реальной курсовой - работает.
Zemal (2002-10-31 13:24:00) [4]>> Tano
аха :) вопрос в общем-то элементарный и уже исчерпан полностью, так что и добавить нечего :), поэтому и я тоже отключаюсь :). А про мастеров ты загнул :)... вопрос совсем не для мастеров, а из раздела "для чайников" :).
Tano (2002-10-31 12:58:00) [5]Сразу видно, мастера собрались ;-)
Куда уж нам плюшевым дополнять...
myor (2002-10-31 12:54:00) [6]подключусь, но в последний раз!
присоединяюсь к zemal:
кен, почитай чего-нибудь!
отключаюсь с концами.
Zemal (2002-10-31 12:11:00) [7]>> myor
Аха :). Отключаемся :).
>> Кен
Найди свою Барби и объясни ей, что в события передаётся параметр Sender, что в общем-то является ссылкой на вызвавший объект... и делай с этой ссылкой что хошь :). Ислючение может составить, если ты непосредственно будешь генерировать событие из кода... типа XXX.OnClick(Nil), или подобно этому :). Ещё есть такое слово как Self... это к сведению... почитай где нибудь про него - тоже может пригодиться :).
myor (2002-10-31 12:02:00) [8]согласен с тобой,zemal, куча if-ов или case- это "Г"
(большая глупость). но вопрос сформулирован на определение компонента, а как кен им воспользуется, непонятно. нужно имя, пожалуйста:
label123.caption:=(sender as tbutton).name
нужно сразу к методам и свойствам, ну тогда:
(sender as tbutton).caption:=
(sender as tbutton).visible:=
и т.д.
в любом случае, кену нужно уметь пользоватся sender-ом
но, похоже, эта тема ему уже не интересна. а наша с тобой переписка плавно переходит в чат. я дуиаю, материала для размышления у кена достаточно- отключаемся.
Zemal (2002-10-31 11:29:00) [9]>> myor
Да ненужно ему имени компонента, ему надо работать с методами и свойствами кнопки, которая была нажата... например поменять надпись... в данном случае приведён понятный пример определения класса и приведения к классу. Надо же научить парня работать с переменными класса в динамике, а не статично набивать if TBattom1.Focused then ... :).
myor (2002-10-31 11:14:00) [10]ну вы все , блин, даете!
вопрошающий, тебе нужно имя компонента, бери:
(sender as tbutton).name
Zemal (2002-10-31 10:48:00) [11]Ну да, всё правильно :). Для получения доступа к методам и свойствам именно той кнопки которую нажали надо делать так:
if Sender is TButtom then
begin
with Sender as TButtom do
begin
... // действия с кнопкой которую нажали
Caption := "Караул! На меня нажали!"; // к примеру :)
end
end
else
with Sender as TForm do
begin
... // действия если объект вызвавший не является кнопкой
... // в данном случае объект класса TForm, т.е. форма
Caption := "Нажимай на кнопку, осёл, а не на меня!"
end;
MalkoLinge (2002-10-31 10:08:00) [12]А теперь :) подведем итоги !
Итак
1. Sender- это ВСЕГДА обьект событие которого произошло.
2.операция is- проверяет , имеет ли экземпляр класса тип указанного класса. isработет быстрее as
3.Исходя из этого
if (sender is TButton) then begin // на случай xxx.onclick(nil)
if (sender as TBUTTON).focused then ......
.....................
end;
KSergey (2002-10-31 10:02:00) [13]> dtr © (31.10.02 09:37)
> > KSergey © (31.10.02 08:57)
> >
> Нет. Еслия у формы повешу это же событие onClick, то Sender
> будет форма, а не кнопка.
Ну а я повешу вообще в другом приложении (ну так, гробо) - и вто теперь? Может стоит все же не везде вешать что попало?! ;) Впрочем, не примите за наезд, но все это просто зависит от окружающего кода, верно? Т.е. я предположил, что такого вот
> Anatoly Podgoretsky © (31.10.02 09:32)
> KSergey © (31.10.02 08:57)
> Ты думаешь, попробуй опровергнуть XXX.OnClick(Nil) или XXX.OnClick(Form1),
> а доказательство у автора фопроса "но он указывает на Form1,
> а не на кнопку."
нигде не будет.
А что там у автора - я и вовсе не понял, если честно. То у него формы передаются, то кнопки.
А почему? Зачем и формам и кнопкам вешать один обработчик?... Кошмар какой-то!
dtr (2002-10-31 09:37:00) [14]
> KSergey © (31.10.02 08:57)
>
> Стоп. Senser всегда будет TButton {или что желаешь}, т.к.
> "в событие OnClick прописана одна и таже процедура Button1Click".
>
Нет. Еслия у формы повешу это же событие onClick, то Sender будет форма, а не кнопка.
Anatoly Podgoretsky (2002-10-31 09:32:00) [15]KSergey © (31.10.02 08:57)
Ты думаешь, попробуй опровергнуть XXX.OnClick(Nil) или XXX.OnClick(Form1), а доказательство у автора фопроса "но он указывает на Form1, а не на кнопку."
KSergey (2002-10-31 08:57:00) [16]> Anatoly Podgoretsky © (31.10.02 08:04)
> if Senser is TButton {или что желаешь} then
Стоп. Senser всегда будет TButton {или что желаешь}, т.к. " в событие OnClick прописана одна и таже процедура Button1Click".
> Вроде бы на то какая кнопка нажата должен указывать Sender
> , но он указывает на Form1, а не на кнопку.
Да ну?!! Странное что-то вы говорите... Ну разве что какой-то компонент хитрый, что посылает не себя самого. Вот только зачем?
> Qpwoe! © (31.10.02 06:29)
> Всё равно первый вариант лучше...
>
> Cr@sh © (31.10.02 06:36)
> Первый вариант skiph`a наиболее правильный.
Эо почему, интересно?!
> Кен (31.10.02 07:53)
> Придумал !
> Надо так :
>
> with ( Sender as TRxSpeedButton ) do begin
> Caption := "asdf";
> end;
>
> Тогда asdf пишется на той кнопке, на которую нажали.
> ( TRxSpeedButton - это кнопка из RxLib )
Я не понял, вы сами то знаете что вам надо?!!
Вопрос был " как ... определить какаякнопка была нажата?", и вдруг на самом деле меняете свойство у нажатой снопки?! Это же совсем другой вопрос "как поменять свойство у нажатой кнопки", а не как ее определить.
Более того, вначале было сказано " Вроде бы на то какая кнопка нажата должен указывать Sender, но он указывает на Form1", и вдруг он стл указывать на кнопку... Ничего не понимаю... Так все же "привирали" и таки на кнопку он показывает? ;)
Anatoly Podgoretsky (2002-10-31 08:04:00) [17]if Senser isTButton {или что желаешь} then
Кен (2002-10-31 07:53:00) [18]Придумал !
Надо так :
with ( Sender as TRxSpeedButton ) do begin
Caption := "asdf";
end;
Тогда asdf пишется на той кнопке, на которую нажали.
( TRxSpeedButton - это кнопка из RxLib )
Cr@sh (2002-10-31 06:36:00) [19]Первый вариант skiph`a наиболее правильный.
Qpwoe! (2002-10-31 06:29:00) [20]Всё равно первый вариант лучше...