Консультация № 139823
11.07.2008, 17:41
0.00 руб.
0 3 2
Здравствуйте!
У меня в с++ билдере 6 в программе есть несколько кнопок. Они называются Button1, Button2, ... Могу ли я по числу N обратится к кнопке ButtonN ?
Спасибо.

Обсуждение

Неизвестный
11.07.2008, 17:45
общий
Попробуйте использовать функцию FindComponent:<b>TComponent* __fastcall FindComponent(const AnsiString AName);</b>
Неизвестный
11.07.2008, 18:04
общий
это ответ
Здравствуйте, Asteriks!
Не очень красивое решение, но другого не знаю: можно создать массив указателей на элемент типа кнопка и скопировать соответсвенно значения указателей в массив, а потом просто обращаться к ним по индексу. Подозреваю, что в борланде предусматрели более элегантное решение.

Приложение:
...TButton buttons[3];buttons[1]=button1;buttons[2]=button2;buttons[3]=button3;...buttons[N]->Show();//Других функций не помню :)...
давно
Старший Модератор
17042
808
12.07.2008, 13:40
общий
это ответ
Здравствуйте, Asteriks!
Действительно, в Borland C++ Builder имеется более изящное решение. Щелчок по кнопке вызывает событие OnClick, которое обрабатывается в функции, принимающей в качестве аргумента указатель на объект, который это событие (щелчок) вызвал - TObject* Sender. Для получения доступа к свойствам этого объекта, нужно прямо указать, что это кнопка, выполнив приведение типов:

(TButton*)Sender

Допустим, у нас есть форма, на которой три кнопки: Button1, Button2 и Button3. Присвоим свойству Tag каждой кнопки значение 1, 2 или 3, соответственно. Реализуем обработчик события OnClick для первой кнопки (см. приложение).
В этом обработчике переменной i присваивается номер тега текущей (вызывающей событие OnClick) кнопки: int i = ((TButton*)Sender)->Tag;
После этого в качестве обработчика события OnClick каждой из последующих кнопок назначьте обработчик щелчка по первой кнопке - Button1Click (воспользуйтесь выпадающим списком реализованных обработчиков на вкладке Events инспектора объектов (Object Inspector).
P.S. С помощью кнострукции ((TButton*)Sender)-> можно получить доступ к любому свойству текущей (щёлкнутой) кнопки. Например, дополните обработчик, приведённый в приложении, следующей строкой и посмотрите, что получится:

((TButton*)Sender)->Caption = "Щёлкнуто!";

Удачи!

Приложение:
//---------------------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender){ int i = ((TButton*)Sender)->Tag; AnsiString sMessage = "Нажата кнопка номер " + IntToStr(i); ShowMessage(sMessage);}//---------------------------------------------------------------------------
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
Форма ответа