Текущий архив: 2002.11.11;
Скачать: CL | DM;
Вниз
Есть несколько кнопок у которых в событие OnClick прописана одна Найти похожие ветки
← →
Кен (2002-10-31 05:05) [0]и таже процедура 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. И вообще это какой то левый способ. Нет ли другого, попроще ?
← →
skiph © (2002-10-31 05:20) [1]Можно сделать так:
procedure TForm1.N2Click(Sender: TObject);
begin
if (Sender as TButton).Name="Button1" then ...
....
end;
Но есть другой вариант. Для каждой кнопкиопределяешь уникальное значение Tag (если в программе он тебе не нужен), т.е. для Button1.Tag=1, Button2.Tag=2 и т.д. И тогда процедума будет иметь более "красивый" вид:
procedure TForm1.N2Click(Sender: TObject);
begin
case (Sender as TButton).Tag of
1:...
2:...
3:...
....
end;
end;
← →
Qpwoe! © (2002-10-31 06:29) [2]Всё равно первый вариант лучше...
← →
Cr@sh © (2002-10-31 06:36) [3]Первый вариант skiph`a наиболее правильный.
← →
Кен (2002-10-31 07:53) [4]Придумал !
Надо так :
with ( Sender as TRxSpeedButton ) do begin
Caption := "asdf";
end;
Тогда asdf пишется на той кнопке, на которую нажали.
( TRxSpeedButton - это кнопка из RxLib )
← →
Anatoly Podgoretsky © (2002-10-31 08:04) [5]if Senser is TButton {или что желаешь} then
← →
KSergey © (2002-10-31 08:57) [6]> 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 09:32) [7]KSergey © (31.10.02 08:57)
Ты думаешь, попробуй опровергнуть XXX.OnClick(Nil) или XXX.OnClick(Form1), а доказательство у автора фопроса "но он указывает на Form1, а не на кнопку."
← →
dtr © (2002-10-31 09:37) [8]
> KSergey © (31.10.02 08:57)
>
> Стоп. Senser всегда будет TButton {или что желаешь}, т.к.
> "в событие OnClick прописана одна и таже процедура Button1Click".
>
Нет. Еслия у формы повешу это же событие onClick, то Sender будет форма, а не кнопка.
← →
KSergey © (2002-10-31 10:02) [9]> 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,
> а не на кнопку."
нигде не будет.
А что там у автора - я и вовсе не понял, если честно. То у него формы передаются, то кнопки.
А почему? Зачем и формам и кнопкам вешать один обработчик?... Кошмар какой-то!
← →
MalkoLinge © (2002-10-31 10:08) [10]А теперь :) подведем итоги !
Итак
1. Sender - это ВСЕГДА обьект событие которого произошло.
2.операция is - проверяет , имеет ли экземпляр класса тип указанного класса. is работет быстрее as
3.Исходя из этого
if (sender is TButton) then begin // на случай xxx.onclick(nil)
if (sender as TBUTTON).focused then ......
.....................
end;
← →
Zemal © (2002-10-31 10:48) [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;
← →
myor (2002-10-31 11:14) [12]ну вы все , блин, даете!
вопрошающий, тебе нужно имя компонента, бери:
(sender as tbutton).name
← →
Zemal © (2002-10-31 11:29) [13]>> myor
Да ненужно ему имени компонента, ему надо работать с методами и свойствами кнопки, которая была нажата... например поменять надпись... в данном случае приведён понятный пример определения класса и приведения к классу. Надо же научить парня работать с переменными класса в динамике, а не статично набивать if TBattom1.Focused then ... :).
← →
myor (2002-10-31 12:02) [14]согласен с тобой,zemal, куча if-ов или case- это "Г"
(большая глупость). но вопрос сформулирован на определение компонента, а как кен им воспользуется, непонятно. нужно имя, пожалуйста:
label123.caption:=(sender as tbutton).name
нужно сразу к методам и свойствам, ну тогда:
(sender as tbutton).caption:=
(sender as tbutton).visible:=
и т.д.
в любом случае, кену нужно уметь пользоватся sender-ом
но, похоже, эта тема ему уже не интересна. а наша с тобой переписка плавно переходит в чат. я дуиаю, материала для размышления у кена достаточно- отключаемся.
← →
Zemal © (2002-10-31 12:11) [15]>> myor
Аха :). Отключаемся :).
>> Кен
Найди свою Барби и объясни ей, что в события передаётся параметр Sender, что в общем-то является ссылкой на вызвавший объект... и делай с этой ссылкой что хошь :). Ислючение может составить, если ты непосредственно будешь генерировать событие из кода... типа XXX.OnClick(Nil), или подобно этому :). Ещё есть такое слово как Self... это к сведению... почитай где нибудь про него - тоже может пригодиться :).
← →
myor (2002-10-31 12:54) [16]подключусь, но в последний раз!
присоединяюсь к zemal:
кен, почитай чего-нибудь!
отключаюсь с концами.
← →
Tano (2002-10-31 12:58) [17]Сразу видно, мастера собрались ;-)
Куда уж нам плюшевым дополнять...
← →
Zemal © (2002-10-31 13:24) [18]>> Tano
аха :) вопрос в общем-то элементарный и уже исчерпан полностью, так что и добавить нечего :), поэтому и я тоже отключаюсь :). А про мастеров ты загнул :)... вопрос совсем не для мастеров, а из раздела "для чайников" :).
← →
Серго (2002-10-31 14:44) [19]
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;
...
Пример из реальной курсовой - работает.
← →
Владислав © (2002-10-31 16:54) [20]///...
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-11-01 07:47) [21]В общем, всем спасибо за помощь ! Я осознал как надо решать эту не простую задачу.
Страницы: 1 вся ветка
Текущий архив: 2002.11.11;
Скачать: CL | DM;
Память: 0.53 MB
Время: 0.013 c