Форум программистов, компьютерный форум, киберфорум
C++/CLI Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/16: Рейтинг темы: голосов - 16, средняя оценка - 4.94
 Аватар для vialet
57 / 57 / 11
Регистрация: 04.03.2010
Сообщений: 244

Создание динамических объектов в динамически созданном объекте

16.03.2012, 09:17. Показов 3287. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем!!! Очень нужна помощь. Необходимо создать динамический groupBox (с этой задачей справился), в котором нужно создать динамические объекты (button, checkBox, comboBox), события которых необходимо обрабатывать. Пожалуйста объясните как это сделать на примере.

Есть еще одна трудность: необходимо одновременно с каждым groupBox'ом создать глобальную переменную. Пробовал заранее создать некоторое множество таких переменных и инициализировать их при создании groupBox, но это не то, т.к. гипотетически число таких переменных сколь угодно большое.

Добавлено через 26 минут
проект необходимо создать в C++/Cli (главное условие)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.03.2012, 09:17
Ответы с готовыми решениями:

Динамическое создание объекта, в динамически созданном объекте
В StackPanel динамически создан Grid, в котором нужно динамически создать Картинку и несколько Текстовых блоков, как обратиться к ранее...

Создание динамических объектов
Как на WPF реализовать динамическую карту объектов, как на рисунке. Каждый объект квадрат имеет следующую структуру. Квадратов...

Создание динамических объектов формы
Как сделать например динамический Image в большом количестве, то есть например по таймеру создавать рандомно 1-10 Image, а затем спустя 2...

7
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
16.03.2012, 16:50
То что предлагается не пример для подражания (мягко сказано), но может пригодиться как направление поиска. Я честно говоря использую статические члены, т.к. всегда знаю сколько потребуется. К тому же массив указателей на не инстанциированные объекты (или список - не важно) не требует много памяти...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
//первая форма dynamical_controlls_test.h
#pragma once
#include "My_Controll_Group.h"
 
namespace dynamical_controlls_test {
 
    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;
 
    public ref class Form1 : public System::Windows::Forms::Form
    {
    public:
        Form1(void)
        {
            InitializeComponent();
            
        }
 
    protected:
        ~Form1()
        {
            if (components)
            {
                delete components;
            }
        }
    private: System::Windows::Forms::Panel^  panel1;
    protected: 
    private: System::Windows::Forms::GroupBox^  groupBox1;
    private: System::Windows::Forms::ComboBox^  comboBox1;
    private: System::Windows::Forms::CheckBox^  checkBox1;
    private: System::Windows::Forms::Button^  button1;
    private: System::Windows::Forms::Button^  button2;
    System::ComponentModel::Container ^components;
#pragma region Windows Form Designer generated code
void InitializeComponent(void)
{
this->panel1 = (gcnew System::Windows::Forms::Panel());
this->groupBox1 = (gcnew System::Windows::Forms::GroupBox());
this->comboBox1 = (gcnew System::Windows::Forms::ComboBox());
this->checkBox1 = (gcnew System::Windows::Forms::CheckBox());
this->button1 = (gcnew System::Windows::Forms::Button());
this->button2 = (gcnew System::Windows::Forms::Button());
this->panel1->SuspendLayout();
this->groupBox1->SuspendLayout();
this->SuspendLayout();
// 
// panel1
// 
this->panel1->Controls->Add(this->groupBox1);
this->panel1->Location = System::Drawing::Point(57, 52);
this->panel1->Name = L"panel1";
this->panel1->Size = System::Drawing::Size(384, 225);
this->panel1->TabIndex = 0;
// 
// groupBox1
// 
this->groupBox1->Controls->Add(this->comboBox1);
this->groupBox1->Controls->Add(this->checkBox1);
this->groupBox1->Controls->Add(this->button1);
this->groupBox1->Location = System::Drawing::Point(6, 19);
this->groupBox1->Name = L"groupBox1";
this->groupBox1->Size = System::Drawing::Size(378, 203);
this->groupBox1->TabIndex = 0;
this->groupBox1->TabStop = false;
this->groupBox1->Text = L"groupBox1";
// 
// comboBox1
// 
this->comboBox1->FormattingEnabled = true;
this->comboBox1->Location = System::Drawing::Point(75, 38);
this->comboBox1->Name = L"comboBox1";
this->comboBox1->Size = System::Drawing::Size(121, 21);
this->comboBox1->TabIndex = 2;
// 
// checkBox1
// 
this->checkBox1->AutoSize = true;
this->checkBox1->Checked = true;
this->checkBox1->CheckState = System::Windows::Forms::CheckState::Checked;
this->checkBox1->Location = System::Drawing::Point(248, 38);
this->checkBox1->Name = L"checkBox1";
this->checkBox1->Size = System::Drawing::Size(80, 17);
this->checkBox1->TabIndex = 1;
this->checkBox1->Text = L"checkBox1";
this->checkBox1->UseVisualStyleBackColor = true;
// 
// button1
// 
this->button1->Location = System::Drawing::Point(248, 154);
this->button1->Name = L"button1";
this->button1->Size = System::Drawing::Size(75, 23);
this->button1->TabIndex = 0;
this->button1->Text = L"button1";
this->button1->UseVisualStyleBackColor = true;
// 
// button2
// 
this->button2->Location = System::Drawing::Point(-2, 468);
this->button2->Name = L"button2";
this->button2->Size = System::Drawing::Size(75, 23);
this->button2->TabIndex = 1;
this->button2->Text = L"button2";
this->button2->UseVisualStyleBackColor = true;
this->button2->Click += gcnew System::EventHandler(this, &Form1::button2_Click);
// 
// Form1
// 
this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
this->ClientSize = System::Drawing::Size(766, 494);
this->Controls->Add(this->button2);
this->Controls->Add(this->panel1);
this->Name = L"Form1";
this->Text = L"Form1";
this->panel1->ResumeLayout(false);
this->groupBox1->ResumeLayout(false);
this->groupBox1->PerformLayout();
this->ResumeLayout(false);
        }
#pragma endregion
private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {
My_Controll_Group^ myGr=gcnew My_Controll_Group(this, this->Location);
 this->panel1->Hide();
myGr->panel1->Show();
             }
};
}
на фолдере Header Files солюшена ->правой кнопкой->добавить New Item->hider->My_Controll_Group(.h)
в добавленном My_Controll_Group.h :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#pragma once
ref class My_Controll_Group{
public:
System::Windows::Forms::Form^ myForm1;
System::Drawing::Point^ myStartPoint1;
 
System::Windows::Forms::Panel^  panel1;
System::Windows::Forms::GroupBox^  groupBox1;
System::Windows::Forms::ComboBox^  comboBox1;
System::Windows::Forms::CheckBox^  checkBox1;
System::Windows::Forms::Button^  button1;
My_Controll_Group(System::Windows::Forms::Form^ myForm,System::Drawing::Point^ myStartPoint){
myForm1=myForm;
myStartPoint1=myStartPoint;
initFunc();
    }
void initFunc();
void addGControllGroup();
};
на фолдере Source Files солюшена ->правой кнопкой->добавить New Item->cpp->My_Controll_Group(.cpp)
в добавленном My_Controll_Group.cpp :
тут слегка подправленная копия блока инициализации первой формы связанного с вашей "динамической группой"
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include "stdafx.h"
#include "Form1.h"
 
using namespace dynamical_controlls_test;
void My_Controll_Group::initFunc(){
    addGControllGroup();
};
 
void My_Controll_Group::addGControllGroup(){
 
myForm1=dynamic_cast<Form1^>(myForm1);
 
this->panel1 = (gcnew System::Windows::Forms::Panel());
this->groupBox1 = (gcnew System::Windows::Forms::GroupBox());
this->button1 = (gcnew System::Windows::Forms::Button());
this->checkBox1 = (gcnew System::Windows::Forms::CheckBox());
this->comboBox1 = (gcnew System::Windows::Forms::ComboBox());
this->panel1->SuspendLayout();
this->groupBox1->SuspendLayout();
myForm1->SuspendLayout();
// panel1
            // 
this->panel1->Controls->Add(this->groupBox1);
this->panel1->Location = System::Drawing::/*Point(myStartPoint1->X+13,myStartPoint1->Y+13);*/Point(13,13);
this->panel1->Name = L"panel1";
this->panel1->Size = System::Drawing::Size(384, 209);
this->panel1->TabIndex = 0;
// 
// groupBox1
// 
this->groupBox1->Controls->Add(this->comboBox1);
this->groupBox1->Controls->Add(this->checkBox1);
this->groupBox1->Controls->Add(this->button1);
this->groupBox1->Location = System::Drawing::/*Point(myStartPoint1->X+3,myStartPoint1->Y-3);/*/Point(3, -3);
this->groupBox1->Name = L"groupBox1";
this->groupBox1->Size = System::Drawing::Size(378, 203);
this->groupBox1->TabIndex = 0;
this->groupBox1->TabStop = false;
this->groupBox1->Text = L"groupBox1";
// 
// button1
// 
this->button1->Location = System::Drawing::/*Point(myStartPoint1->X+248,myStartPoint1->Y+154);/*/Point(248, 154);
this->button1->Name = L"button1";
this->button1->Size = System::Drawing::Size(75, 23);
this->button1->TabIndex = 0;
this->button1->Text = L"button1";
this->button1->UseVisualStyleBackColor = true;
// 
// checkBox1
// 
this->checkBox1->AutoSize = true;
this->checkBox1->Location = System::Drawing::/*Point(myStartPoint1->X+248,myStartPoint1->Y+38);/*/Point(248, 38);
this->checkBox1->Name = L"checkBox1";
this->checkBox1->Size = System::Drawing::Size(80, 17);
this->checkBox1->TabIndex = 1;
this->checkBox1->Text = L"checkBox1";
this->checkBox1->UseVisualStyleBackColor = true;
// 
// comboBox1
// 
this->comboBox1->FormattingEnabled = true;
this->comboBox1->Location = System::Drawing::/*Point(myStartPoint1->X+75,myStartPoint1->Y+38);/*/Point(75, 38);
this->comboBox1->Name = L"comboBox1";
this->comboBox1->Size = System::Drawing::Size(121, 21);
this->comboBox1->TabIndex = 2;
// groupBox1
this->groupBox1->Controls->Add(this->button1);
this->groupBox1->Controls->Add(this->checkBox1);
this->panel1->Controls->Add(this->groupBox1);
this->panel1->ResumeLayout(false);
this->groupBox1->ResumeLayout(false);
this->groupBox1->PerformLayout();
// 
// Form1
// 
myForm1->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
myForm1->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
myForm1->ClientSize = System::Drawing::Size(829, 485);
myForm1->Controls->Add(this->panel1);
myForm1->Name = L"Form1";
myForm1->Text = L"Form1";
myForm1->ResumeLayout(false);
};
//что бы убедиться, что генерится новая группа - по окончании "кодинга" установите в дизайнере чекбоксу свойство чекед в true
1
 Аватар для vialet
57 / 57 / 11
Регистрация: 04.03.2010
Сообщений: 244
19.03.2012, 11:36  [ТС]
CSS
1
2
[хотел бы уточнить можно ли с помощью этого кода создать еще динамические объекты, которые предварительно не были добавлены в форму. 
если просто испльзовать другие имена (например groupBox2), то возникает множество ошибок
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
19.03.2012, 12:21
Этот код - информация к размышлению, и ни в коем разе не для буквального применения.
Цитата Сообщение от vialet Посмотреть сообщение
другие имена (например groupBox2)
Переименовать поля класса? Нет. Создавайте другие экземпляры, где нужно. Один или несколько можно сделать членами вашей формы. Их будет видно везде в форме.
Цитата Сообщение от IGPIGP Посмотреть сообщение
myGr->panel1->Show();
myGr - это экземпляр класса My_Controll_Group...
Однако если с основами ООП у Вас сложно, то лучше с этого начать. Иначе будете постоянно пытаться создавать объекты и глобальные и динамические одновременно.
Кстати, аргумент конструктора - точка. В реализации не задействован. Посмотрите функцию инициализации. То есть все группы в этом коде имеют одну Location. Можно дополнить класс другими полями...Вот это и нужно написать самостоятельно, т.к. я не знаю ни размеров ни расположения будущих групп на Вашей форме. А с именами проблем нет.
1
 Аватар для vialet
57 / 57 / 11
Регистрация: 04.03.2010
Сообщений: 244
19.03.2012, 12:33  [ТС]
то есть необходимо для каждого такого набора динамически созданных объектов созлать свой экземппляр класса, например:
C++
1
2
My_Controll_Group^ myGr1 = gcnew My_Controll_Group(this, this->Location);
My_Controll_Group^ myGr2 = gcnew My_Controll_Group(this, this->Location);
и т.д.

А как обрабатывать события, например клик на button1, принадлежащей myGr2, обращаться к подобным объектам как myGr2->button1.
Я понял вас еще вначале, что это, так сказать, демонстрационный код, просто пытаюсь в нем разобраться, чтобы двигаться дальше
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
19.03.2012, 13:14
Цитата Сообщение от vialet Посмотреть сообщение
Я понял вас еще вначале
В классе есть указатель на форму, следовательно можно объявить и подключить в нём и события. В целом там еще много работы - деструктор можно сделать по образу и подобию деструктора формы введя компоненты и контейнер или удалить компоненты индивидуально. Добавить поля и аргументы конструктора, что бы более комфортно работать... Но самое интересное в том, что (это лично моя спорная мысль) чем более развитый класс получается тем больше желание генерить для каждой такой "динамической" группы дочернюю форму.
C++
1
My_Controll_Group^ myGr2 = gcnew My_Controll_Group(this, this->Location);
Вот точку не this->Location, а надо передать свою для каждого класса т.к. это точка начала координат его панельки в форме. В конструкторе надо корректно посчитать (или задать относительно панели) координаты элементов.
Извините за сбивчивость - тороплюсь. Будут вопросы, отвечу позже.
1
 Аватар для vialet
57 / 57 / 11
Регистрация: 04.03.2010
Сообщений: 244
19.03.2012, 13:34  [ТС]
и все же как обрабатывать события таких динамически созданных объектов. Для обычных заранее известно, можно в свойствах выбрать нужное событие и его обработать, например
C++
1
2
3
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
//обработчик
}
А зесь как??????
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
19.03.2012, 17:55
Цитата Сообщение от vialet Посмотреть сообщение
можно в свойствах выбрать нужное событие и его обработать, например
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
Опять не вполне понял, что Вы имеете ввиду...
На событие button_click можно подписаться уже, создав экземпляр:

C++
1
2
3
4
5
6
7
8
9
private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {
My_Controll_Group^ myGr=gcnew My_Controll_Group(this, this->Location);
myGr->button1->Click+=gcnew System::EventHandler(this, &Form1::button1_Click);
 this->panel1->Hide();
myGr->panel1->Show();
             }
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
             this->Text="heh...";
         }
Добавлено через 1 час 15 минут
Вот фрагмент из cpp файла:
Цитата Сообщение от IGPIGP Посмотреть сообщение
C++
1
2
3
4
5
myForm1->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
myForm1->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
myForm1->ClientSize = System::Drawing::Size(829, 485);
myForm1->Controls->Add(this->panel1);
myForm1->Name = L"Form1"; myForm1->Text = L"Form1"; myForm1->ResumeLayout(false);
Если не хотите что бы эти поля Вашей Form1 устанавливались в значения заданные её конструктором (они могут меняться в ходе выполнения), оставьте только:
C++
1
myForm1->Controls->Add(this->panel1);
Ну, а как перед созданием нового экземпляра получить точку привязки предыдущего, его номер возможно... и высчитать номер и местоположение будущего объекта - Ваша задача.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.03.2012, 17:55
Помогаю со студенческими работами здесь

HELP::Создание->удаление динамических объектов
Доброй ночи! У меня возникла такая проблема я динамически создаю объекты типа кнопка: void __fastcall TMainForm::Button1Click(TObject...

Создание динамических объектов в WinCC
Подскажите пожалуйсто как сделать динамические объекты через скрипты, мне задачу поставили чтоб объекты двигались и была динамика на окне,...

Создание динамических объектов в фреймах
Искал в нете материала не нашел! В принципе по логике вещей сложного ничего нет, но когда создаю объекты на фрейме динамически то их не...

Использование динамических объектов с использованием других динамических объектов
Есть 2 массива, один создаёт Combobox, второй - Memo. Они создаются в количестве связаное с количеством записей в Базе Данных. Мне нужно...

Создание динамических графческих объектов в winCC
Всем привет! Имеется ли возможность в wincc создания динамически графических объектов? Если да, может ли кто показать пример


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru