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

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

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

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

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

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

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

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

Количество компонентов не ограничено.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.09.2014, 19:28
Ответы с готовыми решениями:

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

VCL удаление динамически созданых объектов с формы
Написал игру ханойские башни, так чтобы можно было задавать любое количество колец. Я делаю такой...

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

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

33
☆ Форумчанин(FSC)☆
911 / 292 / 27
Регистрация: 28.04.2013
Сообщений: 2,466
Записей в блоге: 10
27.09.2014, 20:27 2
ЧТо именно не получается?
0
Модератор
9267 / 6045 / 2380
Регистрация: 21.01.2014
Сообщений: 25,810
Записей в блоге: 3
27.09.2014, 22:33 3
Ну вот тебе пример...
На форме размещен 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
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
28.09.2014, 00:30 4
Цитата Сообщение от D1973 Посмотреть сообщение
А дальше подключай мозг и доделай сам в соответствии со своим заданием
Да и нужно не забыть исправить твои ошибки... если подключить мозг лучше с нуля начать писать.
0
0 / 0 / 0
Регистрация: 19.09.2014
Сообщений: 32
28.09.2014, 02:59  [ТС] 5
Не понятно как сделать количество компонентов не ограничено, выбивает ошибку
0
Модератор
9267 / 6045 / 2380
Регистрация: 21.01.2014
Сообщений: 25,810
Записей в блоге: 3
28.09.2014, 08:49 6
Цитата Сообщение от Avazart Посмотреть сообщение
Да и нужно не забыть исправить твои ошибки...
Например?
0
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
28.09.2014, 11:23 7
D1973, за исключением стилистики есть одна существенная ошибка - ты применяешь delete к классу, базовому для TPanel. По условию принципа ООП мы знать не знаем о реализации деструкторов в иерархии TControl => TPanel. Поэтому, если деструктор родительского класса не виртуальный, то деструктор TPanel вызван не будет. Нужно кастовать именно к указателю на панель для удаления.
А на брюзжание Авазарта не обращай внимания, полтора десятка тыщ постов сами собой не появляются.

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

Не по теме:

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

0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
28.09.2014, 14:58 14
Цитата Сообщение от 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
Модератор
9267 / 6045 / 2380
Регистрация: 21.01.2014
Сообщений: 25,810
Записей в блоге: 3
28.09.2014, 15:23 15
Цитата Сообщение от Avazart Посмотреть сообщение
Мы ничего не знаем о GroupBox1, он объявлен локально в предыдущем методе
1. GroupBox1 создается (по условию задачи) в DesignTime, соответственно он определен в *.h файле. В том методе (Button1Click), на который Вы указываете, я не создаю GroupBox1, я просто присвоил переменной G типа TGroupBox значение GroupBox1 (т.к. привел пример только для одного GroupBox, а по условию ТС их должно быть 3, переменная была введена именно для возможности работать с несколькими GroupBox-ами)
2. Вот тут, конечно, немного не так надо было, на это мне уже уважаемый BRcr указал, но, если честно, то я имел в виду только то, что создается 1 панель, а на ней - другие контролы (Лэйбл и Эдит). "Грохнув" панель мы тем самым очищаем контейнер GroupBox, т.е. никакого смещения компонентов не происходит

Добавлено через 41 секунду
Цитата Сообщение от Avazart Посмотреть сообщение
Упражняйтесь дальше.
Стараюсь...
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
28.09.2014, 15:28 16
1.
Цитата Сообщение от andrei1994 Посмотреть сообщение
На форме размещены 3 компонента TGroupBox.
Ничего не сказано про дизайн тайм.
2.
Цитата Сообщение от D1973 Посмотреть сообщение
BRcr указал
BRcr вообще что-то не то сказал, а то что сказал я вы так и не поняли - еще раз в цикле пролет.
0
0 / 0 / 0
Регистрация: 19.09.2014
Сообщений: 32
28.09.2014, 15:29  [ТС] 17
как сделать чтобы на свободном месте создавалась панель? а не поверх предыдущей
0
Модератор
9267 / 6045 / 2380
Регистрация: 21.01.2014
Сообщений: 25,810
Записей в блоге: 3
28.09.2014, 15:45 18
Цитата Сообщение от 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  [ТС] 19
как сделать чтобы создавалось на свободном месте панель с едитом и лабелем, что-то у меня нефига не получается
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
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
28.09.2014, 17:21 20
Цитата Сообщение от 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
28.09.2014, 17:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.09.2014, 17:21
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru