С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/47: Рейтинг темы: голосов - 47, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 19.09.2014
Сообщений: 32

Динамическое создание и удаление объектов VCL

27.09.2014, 19:28. Показов 10064. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не получается сделать программу на C++ Bilder

Разработать приложение, которое динамически создает и удаляет объекты VCL.

На форме размещены 3 компонента TGroupBox. Под каждым компонентом TGroupBox размещен компонент TCheckBox. Внизу формы размещены кнопки «Добавить» и «Удалить».

По нажатию на кнопку «Добавить» в выбранных TGroupBox на свободном месте создать объект на основе TPanel и размещенных внутри ее компонентов TLabel и TEdit. В Label записать номер TGroupBox, а в TEdit – координаты созданного компонента – X и Y.

При нажатии на кнопку «Удалить» – удалить все компоненты с выбранных TGroupBox.

Количество компонентов не ограничено.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.09.2014, 19:28
Ответы с готовыми решениями:

Динамическое создание VCL-объектов из dll
Тренируюсь использовать динамически dll. Пока все вроде получается, но есть одна неясность. Задача примерно такая: сделать из dll...

VCL удаление динамически созданых объектов с формы
Написал игру ханойские башни, так чтобы можно было задавать любое количество колец. Я делаю такой цикл for( int i = 0 ; i<count...

Создание собственного VCL компонента. Динамическое изменение количества колонок в зависимости от размера объекта
Доброго времени суток всем. Решил при создании своего компонента на основе TStringGrid инкапсулировать в него ряд свойств. Хочется...

33
☆ Форумчанин(FSC)☆
 Аватар для 2ima
911 / 292 / 27
Регистрация: 28.04.2013
Сообщений: 2,466
Записей в блоге: 10
27.09.2014, 20:27
ЧТо именно не получается?
0
Модератор
 Аватар для D1973
9908 / 6445 / 2455
Регистрация: 21.01.2014
Сообщений: 27,358
Записей в блоге: 3
27.09.2014, 22:33
Ну вот тебе пример...
На форме размещен 1 компонент GroupBox1. Внизу формы размещены кнопки «Добавить» и «Удалить».
По нажатию на кнопку «Добавить» в GroupBox1 в случайном месте создается объект на основе TPanel и внутри ее компоненты TLabel и TEdit. В Label записано имя TGroupBox, а в TEdit – координаты созданного компонента – X и Y. При нажатии на кнопку «Удалить» – удаляются все компоненты на GroupBox1
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
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
 
TLabel *L;
TPanel *P;
TEdit *E;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{
  TGroupBox *G = GroupBox1;
  P = new TPanel(G);
  P->Parent = G;
  P->Name = "Panel" + IntToStr(G->Tag);
  P->Left = 8;
  P->Top = 20;
  P->Width = G->Width - P->Left * 2;
  P->Height = G->Height - 28;
  int x, y;
  Randomize();
  x = Random(P->Width - 130);
  y = Random(P->Height - 30);
  L = new TLabel(P);
  L->Parent = P;
  L->Name = "Label" + IntToStr(G->Tag);
  L->AutoSize = true;
  L->Caption = P->Parent->Name;
  L->Left = x;
  L->Top = y;
  E = new TEdit(P);
  E->Parent = P;
  E->Name = "Edit" + IntToStr(G->Tag);
  E->Top = L->Top + L->Height + 5;
  E->Left = L->Left;
  E->Text = String().sprintf(L"X = %d, Y = %d", x, y);
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button2Click(TObject *Sender)
{
  for(int i = 0; i < GroupBox1->ControlCount; i++)
   {
     TControl *C;
     C = GroupBox1->Controls[i];
     delete C;
   }
}
//---------------------------------------------------------------------------
А дальше подключай мозг и доделай сам в соответствии со своим заданием
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
28.09.2014, 00:30
Цитата Сообщение от D1973 Посмотреть сообщение
А дальше подключай мозг и доделай сам в соответствии со своим заданием
Да и нужно не забыть исправить твои ошибки... если подключить мозг лучше с нуля начать писать.
0
0 / 0 / 0
Регистрация: 19.09.2014
Сообщений: 32
28.09.2014, 02:59  [ТС]
Не понятно как сделать количество компонентов не ограничено, выбивает ошибку
0
Модератор
 Аватар для D1973
9908 / 6445 / 2455
Регистрация: 21.01.2014
Сообщений: 27,358
Записей в блоге: 3
28.09.2014, 08:49
Цитата Сообщение от Avazart Посмотреть сообщение
Да и нужно не забыть исправить твои ошибки...
Например?
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
28.09.2014, 11:23
D1973, за исключением стилистики есть одна существенная ошибка - ты применяешь delete к классу, базовому для TPanel. По условию принципа ООП мы знать не знаем о реализации деструкторов в иерархии TControl => TPanel. Поэтому, если деструктор родительского класса не виртуальный, то деструктор TPanel вызван не будет. Нужно кастовать именно к указателю на панель для удаления.
А на брюзжание Авазарта не обращай внимания, полтора десятка тыщ постов сами собой не появляются.

andrei1994, какую ошибку-то? Здесь телепатов не водится.
1
0 / 0 / 0
Регистрация: 19.09.2014
Сообщений: 32
28.09.2014, 12:28  [ТС]
Код от D1973 работает спасибо, только я не понимаю может чуть условие "Количество компонентов не ограничено" это как? нажимаешь на кпопку добавить и они создаются не ограничено количество раз или как?
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
28.09.2014, 12:44
Цитата Сообщение от andrei1994 Посмотреть сообщение
только я не понимаю может чуть условие "Количество компонентов не ограничено"
А эту фразу можно понять в двух различных смыслах?
0
0 / 0 / 0
Регистрация: 19.09.2014
Сообщений: 32
28.09.2014, 13:35  [ТС]
Я точно не понимаю как это должно выглядеть в программе, объясни мне где должны они создаваться не ограничено , я прогу отладил просто может я что не учел, объясни я проверю так ли, если косяк скину код
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
28.09.2014, 13:43
Приведенный код уже соответствует заданию по части неограниченности количества. Не хватает только размещения новых панелек на свободном месте. Сделай Left и Top панелей хотя бы рандомно, так же, как задается расположение лейблов.
0
0 / 0 / 0
Регистрация: 19.09.2014
Сообщений: 32
28.09.2014, 14:38  [ТС]
Можешь написать код как в соответствии с заданием ,чтобы на свободном месте создавалась панель с лабелем и едитом , а то я недавно начал изучать плохо ориентируюсь , как все сдвигать пропорционально
0
Модератор
 Аватар для D1973
9908 / 6445 / 2455
Регистрация: 21.01.2014
Сообщений: 27,358
Записей в блоге: 3
28.09.2014, 14:49
Цитата Сообщение от BRcr Посмотреть сообщение
Нужно кастовать именно к указателю на панель
Ага, это догнал...

Не по теме:

Цитата Сообщение от BRcr Посмотреть сообщение
за исключением стилистики
Подскажи, гуру, как правильно... :senor:

0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
28.09.2014, 14:58
Цитата Сообщение от BRcr Посмотреть сообщение
полтора десятка тыщ постов сами собой не появляются.
Как и опыт)
Цитата Сообщение от BRcr Посмотреть сообщение
По условию принципа ООП мы знать не знаем о реализации деструкторов в иерархии
Про динамическую индитификацию тоже вероятно не знаем.
Цитата Сообщение от BRcr Посмотреть сообщение
если деструктор родительского класса не виртуальный
Если бы до ка бы ... Виртуальный деструктор тоже одно из условий ООП, если предполагается возможность наследования.

Добавлено через 4 минуты
Тут
C++
1
2
3
4
5
6
7
8
9
void __fastcall TForm2::Button2Click(TObject *Sender)
{
  for(int i = 0; i < GroupBox1->ControlCount; i++)
   {
     TControl *C;
     C = GroupBox1->Controls[i];
     delete C;
   }
}
Сразу две ошибки:

1. Мы ничего не знаем о GroupBox1, он объявлен локально в предыдущем методе.
2. "Проскок" в цикле: удаляя C, он автоматически удаляется из контейнера GroupBox1->Controls[], другие компоненты в нем смещаются.

P.S: Упражняйтесь дальше.
0
Модератор
 Аватар для D1973
9908 / 6445 / 2455
Регистрация: 21.01.2014
Сообщений: 27,358
Записей в блоге: 3
28.09.2014, 15:23
Цитата Сообщение от Avazart Посмотреть сообщение
Мы ничего не знаем о GroupBox1, он объявлен локально в предыдущем методе
1. GroupBox1 создается (по условию задачи) в DesignTime, соответственно он определен в *.h файле. В том методе (Button1Click), на который Вы указываете, я не создаю GroupBox1, я просто присвоил переменной G типа TGroupBox значение GroupBox1 (т.к. привел пример только для одного GroupBox, а по условию ТС их должно быть 3, переменная была введена именно для возможности работать с несколькими GroupBox-ами)
2. Вот тут, конечно, немного не так надо было, на это мне уже уважаемый BRcr указал, но, если честно, то я имел в виду только то, что создается 1 панель, а на ней - другие контролы (Лэйбл и Эдит). "Грохнув" панель мы тем самым очищаем контейнер GroupBox, т.е. никакого смещения компонентов не происходит

Добавлено через 41 секунду
Цитата Сообщение от Avazart Посмотреть сообщение
Упражняйтесь дальше.
Стараюсь...
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
28.09.2014, 15:28
1.
Цитата Сообщение от andrei1994 Посмотреть сообщение
На форме размещены 3 компонента TGroupBox.
Ничего не сказано про дизайн тайм.
2.
Цитата Сообщение от D1973 Посмотреть сообщение
BRcr указал
BRcr вообще что-то не то сказал, а то что сказал я вы так и не поняли - еще раз в цикле пролет.
0
0 / 0 / 0
Регистрация: 19.09.2014
Сообщений: 32
28.09.2014, 15:29  [ТС]
как сделать чтобы на свободном месте создавалась панель? а не поверх предыдущей
0
Модератор
 Аватар для D1973
9908 / 6445 / 2455
Регистрация: 21.01.2014
Сообщений: 27,358
Записей в блоге: 3
28.09.2014, 15:45
Цитата Сообщение от andrei1994 Посмотреть сообщение
На форме размещены 3 компонента TGroupBox. Под каждым компонентом TGroupBox размещен компонент TCheckBox. Внизу формы размещены кнопки «Добавить» и «Удалить».
1. Я понял так, что все это великолепие создается именно в процессе проектирования, а уже потом на каждый из GroupBox-ов мы динамически добавляем компоненты TPanel, а на них ... (и т.д.)
2. Еще раз повторюсь: я привел пример, что в контейнере GroupBox будет ОДНА панель. (Про условие ТС "Количество компонентов не ограничено" я помнил, но предоставил ему подумать, как это будет выглядеть), поэтому удаляя Панель внутри ГрупБокса, тем самым я очищал его полностью. Вроде бы я так и написал, что создал ПРИМЕР, а не выполнил за ТС задание.
Цитата...
"Ну вот тебе пример...
На форме размещен 1 компонент GroupBox1. Внизу формы размещены кнопки «Добавить» и «Удалить».
По нажатию на кнопку «Добавить» в GroupBox1 в случайном месте создается объект (не объектЫ) на основе TPanel и внутри ее компоненты TLabel и TEdit. В Label записано имя TGroupBox, а в TEdit – координаты созданного компонента – X и Y. При нажатии на кнопку «Удалить» – удаляются все компоненты на GroupBox1"
0
0 / 0 / 0
Регистрация: 19.09.2014
Сообщений: 32
28.09.2014, 17:11  [ТС]
как сделать чтобы создавалось на свободном месте панель с едитом и лабелем, что-то у меня нефига не получается
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
if(CheckBox1->Checked==true){
    TGroupBox *G = GroupBox1;
    P = new TPanel(G);
    P->Parent = G;
    P->Name = "Panel" + IntToStr(G->Tag);
    P->Left = 8;
    P->Top = 20;
    int x=15, y=1;
    L = new TLabel(P);
    L->Parent = P;
    L->Name = "Label" + IntToStr(G->Tag);
    L->AutoSize = true;
    L->Caption = P->Parent->Name;
    L->Left = x;
    L->Top = y;
    E = new TEdit(P);
    E->Parent = P;
    E->Name = "Edit" + IntToStr(G->Tag);
    E->Top = L->Top + L->Height + 3;
    E->Left = L->Left;
    E->Text = String().sprintf(L"X = %d, Y = %d", x, y);
    E->ReadOnly=true;
 }
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
28.09.2014, 17:21
Цитата Сообщение от Avazart Посмотреть сообщение
Если бы до ка бы ... Виртуальный деструктор тоже одно из условий ООП, если предполагается возможность наследования.
Ну и что? Единолично заставишь весь белый свет следовать этому условию?
Лучше руководствоваться соображениями практичности. Правда, если уж ими руководствоваться до конца, то никаких кастов не нужно будет, но это уже из другой оперы...
Цитата Сообщение от Avazart Посмотреть сообщение
динамическую индитификацию
Про такого монстра транслитерации, как "индитификация" я точно ничего не знаю.

Цитата Сообщение от D1973 Посмотреть сообщение
Подскажи, гуру, как правильно...
Пост Гуру у нас UI занимает почти безраздельно. Я себя больше дошколенком чувствую.
Подразумевал я всего-навсего излишества: глобальные переменные и объявление в теле цикла.

И, кстати, Avazart совершенно правильно заметил некорректность цикла очистки:
C++
1
2
3
4
5
6
7
8
9
10
11
12
    TPanel * p;
    for ( int i( 0 ); i < GroupBox1->ControlCount; )
    {
        if ( p = dynamic_cast < TPanel * > ( GroupBox1->Controls[ i ] ) )
        {
            delete p;
        }
        else
        {
            ++i;
        }
    }
Добавлено через 3 минуты
Цитата Сообщение от andrei1994 Посмотреть сообщение
как сделать чтобы создавалось на свободном месте панель с едитом и лабелем
C++
1
2
3
4
5
6
7
8
    P->Name = "";
    P->Left = Random( G->Width - 300 );
    P->Top = Random( G->Height - 100 );
    P->Width = 300;
    P->Height = 100;
//...
    L->Left = 10;
    L->Top = 10;
Добавлено через 2 минуты
Не совсем, чтобы на свободном, правда, - так, на случайном. Хочешь четко по заданию - размещай панельки одну рядом с другой, как клетки шахматной доски.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.09.2014, 17:21
Помогаю со студенческими работами здесь

Динамическое создание объектов
Здравствуйте, подскажите пожалуйста как решить задачку... Пусть известно кол-во строк = 10 как сделать так чтоб в одной строке было:...

Динамическое создание объектов
Всем привет! Задача По нажатию кнопки &quot;Create&quot; создается двумерный массив элементов TCheckBox и располагается на форме. По...

Динамическое создание объектов класса
Всем привет. При компиляции выдает ошибку Unit1.cpp(26): E2451 Undefined symbol 'product' и Unit1.cpp(43): E2451 Undefined symbol...

Динамическое создание и удаление компонентов.
Понадобилось динамическое создание нескольких компонентов, при нажатии на кнопку. Несколько нажатий - несколько раз создаются компоненты....

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru