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 просмотр]