Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.015 c
1-34016
Дмитрий К.К.
2002-11-02 05:34
2002.11.11
Мастерам деревьев, часть 1: GetLastNode


1-33960
Tornado
2002-10-31 16:11
2002.11.11
DOS-команда


14-34211
Muskat
2002-10-19 20:35
2002.11.11
Что может быть?


1-34063
Sam Stone
2002-10-30 16:06
2002.11.11
Размер проги


3-33884
weak
2002-10-22 14:57
2002.11.11
Количество дней в месяце