C++ Builder: динамический массив компонентов и доступ к его элементам
Распространённая у начинающих проблема - динамическое создание массивов компонентов. Ясно, что динамический массив из 5 полей ввода, который создаст сама программа, явно будет удобнее, чем "ручное" размещение на форме каждого из них. Если создание массива компонентов мы одолели, возникает вторая проблема - как не плодить кучу одинаковых обработчиков событий, а заставить множество компонентов обходиться одним обработчиком, различая при этом, какая именно кнопка или поле ввода инициировали событие.
Приведём маленький пример, который отвечает на эти вопросы.
Создадим пустой проект C++ Builder, в интерфейсе модуля (файла Unit1.h
) пропишем в секции public:
массивы указателей на 5 полей ввода, 5 кнопок и общую для всех кнопок функцию-обработчик события OnClick
(щелчка по кнопке):
TEdit *E[5]; TButton *B[5]; void __fastcall ButtonClick (TObject *);
Переключимся на файл Unit1.cpp
. Динамическое создание и размещение компонентов на форме реализуем в любой подходящей функции, например, в обработчике события OnClick
формы:
static bool Created; if (!Created) { Created = true; for (int i=0; i<5; i++) { E[i] = new TEdit (this); E[i]->Name = "Edit"+(String)(i+1); E[i]->Text = ""; E[i]->Top = 20 + i*20; E[i]->Left = 10; E[i]->Width = 100; E[i]->Parent = this; B[i] = new TButton (this); B[i]->Name = "Button"+(String)(i+1); B[i]->Caption = (String)(i+1); B[i]->Top = 20 + i*20; B[i]->Left = 120; B[i]->Parent = this; B[i]->OnClick = ButtonClick; } }
На всякий случай, повторное создание компонентов предотвращается с помощью статической переменной-флажка Created
. Компоненты размещаются парами сверху вниз, слева - поле ввода, а справа - кнопка:
Динамическое размещение компонентов на форме C++ Builder
Наконец, реализуем добавленный нами метод класса TForm1
- функцию ButtonClick
:
void __fastcall TForm1::ButtonClick (TObject *Sender) { String Name = ((TButton *)Sender)->Name; int i = StrToInt(Name.SubString(7,1)); ShowMessage((static_cast<TEdit*>(FindComponent("Edit"+IntToStr(i))))->Text); }
Здесь показано, как узнать, от какой именно из кнопок поступило событие (вычисляем её "номер" i
) и как затем с помощью оператора static_cast
получить доступ к полю ввода с тем же "номером".
Также для различения компонент можно использовать свойство Tag
, присваивая ему различные порядковые значения.
07.09.2014, 19:40 [16897 просмотров]