БлогNot. C++ Builder: динамический массив компонентов и доступ к его элементам

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
Динамическое размещение компонентов на форме 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 [16697 просмотров]


теги: c++ программирование builder

К этой статье пока нет комментариев, Ваш будет первым