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

Visual C++: делаем динамический список компонент

Из компонент можно делать массивы, как и из любых других объектов. Притом, массивы не обязаны быть статическими, как в этом списке дочерних окон, а могут быть и динамическими, если использовать, например, класс списка List.

Решим в качестве примера следующую задачу:

Поддержка динамического списка компонент TextBox произвольной размерности. Реализовать добавление и удаление компонент.

Форма – пустая Windows Forms. В качестве примера будем создавать TextBox в месте щелчка мышью по форме и удалять его при щелчке на самом TextBox.

В классе формы опишем нужные данные:

int cnt; //счетчик объектов
List <TextBox ^> ^F; //динамический список объектов типа TextBox

Для поддержки списка List подключим к проекту соответствующее пространство имён:

using namespace  System::Collections::Generic;

(в верхней части файла .h формы).

Как и в других примерах, инициализируем добавленные нами свойства класса по событию загрузки формы:

private: System::Void MyForm_Load(System::Object^  sender, System::EventArgs^  e) {
 cnt = 0;
 F = gcnew List <TextBox ^>(); //конструктор списка
}

Щелчку по форме мышью соответствует событие MouseClick. Достаточно создать программно новый TextBox и добавить его в список:

private: System::Void MyForm_MouseClick(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e) {
 TextBox ^T = gcnew TextBox();
 T->Text = "Text" + (cnt++);
 T->Location = Point(e->X,e->Y);
 T->Parent = this;
 //!!!
 this->Controls->Add(T);
 F->Add(T);
}

Длина списка не ограничена. Однако если мы хотим удалять компоненты TextBox по какому-то событию, например, по щелчку на них, придётся всем создаваемым TextBox программно назначать обработчик этого события, вставим соответствующую строку кода вместо комментария //!!! :

T->Click += gcnew EventHandler(this, &MyForm::textBox_Click);

и добавим в класс формы функцию-обработчик события Click, удаляющую с неё и из списка тот TextBox, по которому мы щёлкнули:

private: System::Void textBox_Click(System::Object^  sender, System::EventArgs^  e) {
 F->Remove((TextBox ^)sender);
 this->Controls->Remove((TextBox ^)sender);
}

Задача решена полностью, проверено в Visual Studio 2015. Конкретно для этой задачи можно было обойтись и без списка F, ограничившись стандартным контейнером Controls.

08.12.2015, 12:31 [7971 просмотр]


теги: учебное список c++/cli

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