Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,145
Записей в блоге: 3

Сравнение динамически созданных форм и статики

20.02.2014, 16:38. Показов 2284. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Интересует вопрос сравнение динамически созданных форм и статики. Где и какие плюсы…конечно понимаю все зависит от поставленной задачи.
Ну вот к примеру есть тестовый проект, и создаю динамически 3 формы…..так же есть второй тестовый проект, там 3 формы в статике…сделал замеры…в принципе как по занимаемом месте на диске так и в памяти все равно(+-20кб).
Так вот вопрос для тех кто видит гораздо глубже чем я , что луче использовать (как на больших так и маленьких проектах, где используется с десяток форм)? Кто знает, с какими проектами в будущем столкнусь…что бы быть готовым
С Уважением
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.02.2014, 16:38
Ответы с готовыми решениями:

События динамически созданных объектов
Доброго всем времени суток! Суть вопроса такова: я динамически в пользовательском классе создаю объект класса TTimer. Мне необходимо...

Покраска динамически созданных StringGrid
Всем доброго времени суток. Кто может подсказать как можно покрасить занятые текстом ячейки и вывести при наведение на эту ячейку Hint с...

Поиск динамически созданных TabSheet
Помогите пожалуйста. Есть TPageControl, на нем динамически созданы вкладки (количество может быть разное). На форме динамически...

32
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
20.02.2014, 23:51
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Dinkin Посмотреть сообщение
Байт все верно
Хорошо. Будет о чем поговорить. Сейчас не готов, время позднее...

Добавлено через 46 минут
Всетки попробую, не спится.
Вот вы создаете "статические" формы. И весь механизм создания - просто мышка.
Но вам, видимо, по ходу дела хочется создавать 20-50 совершенно разных форм. Ваше право. Но если вы выскользнули из пеленочек ИДЕ-ВСЛ, вам придется о многом думать самому. В первую очередь - о геометрии. Готовы? А если этих форм и впрямь 20-50, как вы с ними управитесь? Значит придется придумывать свои собственные механизмы. Хорошая работа. Не простая. Но интересная. Творческая.
Лично я пару лет поигрался в Бюльдера, сначала просто балдел от возможностей, даже получилось пару приличных проектов. А потом с Qt познакомился. Там есть такая штука - лайоуты. И они так чудесно обеспечивают всю геометрию! В общем, на Десигнер (аналог ВСЛ) посмотрел, да и плюнул. Возможно, зря. Но получилось создать собственные механизмы, возможно, неуклюжие с точки зрения высоких материй, но меня вполне устраивающие.
Однако, это ни сколько не реклама Кути. Дело в том, что эти лайоуты навярняка есть и в Бюльдере. Они даже в ВС 502 есть, только там я не понял их смысла (молод был)
Идея ваша (если я опять же правильно понял) мне симпатична. Программа по ходу работы лучше знает, какие формы ей нужны, так пусть она их и создает! Но тут ей ваша мышка не поможет. "Сама, девочка, сама".

Добавлено через 1 минуту
Цитата Сообщение от Dinkin Посмотреть сообщение
в принципе как по занимаемом месте на диске так и в памяти все равно(+-20кб)
А вот на это плюньте и разотрите! Счет идет на Гиги (пока)
1
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,145
Записей в блоге: 3
21.02.2014, 00:12  [ТС]
Байт спасибо за спокойный и внятный ответ(дружелюбно-повествовательную форму)))))

Просто у меня есть проект в котором у меня все "динамично " создано (то есть без перетаскивания компонентов на форму)....и столкнулся с тем что порой приходится создавать формы второго поколения (то есть дочерняя от дочерней). А так как я просто любитель (не заядлый кодер), стало интересно а правильно ли я делаю....или стоит все сделать "статично" и то что я зря заморачиваюсь со связями.

Следующий момент что подтолкнуло написать к гуру на форуме, почему при удалении "динамичной формы", порой остаются компоненты что на ней =)

Добавлено через 1 минуту
PS был интересен вопрос так же с заимаемыми ресурсами, так как приложения на RAD занимают порядком памяти, стараюсь экономить и оптимизировать каждый байт
0
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
21.02.2014, 01:07
Цитата Сообщение от Dinkin Посмотреть сообщение
почему при удалении "динамичной формы", порой остаются компоненты что на ней =)
Это как? Компоненты остаются, а форма удаляется?
Цитата Сообщение от Dinkin Посмотреть сообщение
стараюсь экономить и оптимизировать каждый байт
Сколько же у вас оперативки, что вы каждый байт считаете?
Создавать формы кодом больно хлопотно, поэтому только IDE. Но иногда в IDE просто невозможно. Писать форму кодом когда можно в IDE - это создание себе проблем.
1
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,145
Записей в блоге: 3
21.02.2014, 01:16  [ТС]
Цитата Сообщение от gumi250 Посмотреть сообщение
Это как? Компоненты остаются, а форма удаляется?
Грубо говоря на форме есть TEdit (который объявлен в заголовке)..при удалении через Action = caFree; иногда получается что условие

C
1
if(Edit->Visible) ShowMessage("Yes");
является верным.

Цитата Сообщение от gumi250 Посмотреть сообщение
Сколько же у вас оперативки, что вы каждый байт считаете?
Оперативки 16 гиг,не жалуюсь...но это не значит что приложению надо давать волю =). Ну просто занимает приложение в памяти 30 мб , (после Builder 6, что занимало всего 8 мб) как то смущает
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.02.2014, 01:27
Цитата Сообщение от Dinkin Посмотреть сообщение
является верным.
А где само условие то прописано ?

Добавлено через 4 минуты
Цитата Сообщение от Dinkin Посмотреть сообщение
Оперативки 16 гиг,не жалуюсь...но это не значит что приложению надо давать волю =). Ну просто занимает приложение в памяти 30 мб , (после Builder 6, что занимало всего 8 мб) как то смущает
Ну так а в чем проблема? пиши под BCB6, а лучше на асме ...
0
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
21.02.2014, 02:46
Цитата Сообщение от Dinkin Посмотреть сообщение
Грубо говоря на форме есть TEdit (который объявлен в заголовке)..при удалении через Action = caFree; иногда получается что условие
А что так можно что то удалить? Я обычно удаляю банально через delete. И если форма удаляется она естественно удаляет все свое содержимое. Если в условии
C++
1
if(Edit->Visible) ShowMessage("Yes");
есть вероятность не существования Edit, то правельнее будет сначало проверить вообще существование Edit, а уж только потом обращаться к его св-вам.
1
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
21.02.2014, 10:05
Я тут опять со своими любимыми картинками:


Когда говорят о необходимости создавать формы динамически имеют в виду тот факт, что экземпляр формы, будучи созданным, занимает сколько-то памяти. Но если форма нужна нечасто и лишь на короткое время, то ее не обязательно создавать вместе с запуском всего приложения и уничтожать тольлко лишь по его завершению. Можно посередине работы программы создать ее, а когда она станет более не нужной, уничтожить, тем самым заняв память под нее лишь на короткое время.
Не хотите мурдыкаться с ручным созданием форм? Создайте ее в редакторе (Меню File->New->Form). Так же набросайте требуемые вам компоненты, все дела. Но только уберите ее из автосоздания (Меню Project->Options), перенеся из левой колонки в правую:

Либо ручками: (Меню Project->View Source):
Project2.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
#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
USEFORM("Unit1.cpp", Form1);
USEFORM("Unit2.cpp", Form2);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
        try
        {
                 Application->Initialize();
                 Application->CreateForm(__classid(TForm1), &Form1);
                 //Application->CreateForm(__classid(TForm2), &Form2);//<-Вот оно автосоздание
                 Application->Run();
        }
        catch (Exception &exception)
        {
                 Application->ShowException(&exception);
        }
        catch (...)
        {
                 try
                 {
                         throw Exception("");
                 }
                 catch (Exception &exception)
                 {
                         Application->ShowException(&exception);
                 }
        }
        return 0;
}

Далее сделайте ее динамически создаваемой:
Unit1.cpp
C++
1
2
3
4
5
6
7
8
9
10
#include "Unit1.h"
#include "Unit2.h"
 
void __fastcall TForm1::BShowClick(TObject *Sender)
{
TForm2 *Form2 = new TForm2(this->Owner);
//TForm2 *Form2;
//Application->CreateForm(__classid(TForm2), &Form2);
Form2->Show();
}

И допишите, чтобы по закрытию формы она не пряталась, а уничтожалась:
Unit2.cpp
C++
1
2
3
4
5
void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action)
{
Action = caFree;
//this->Free();
}

Архив с проектом: DinamicForm.rar
1
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,145
Записей в блоге: 3
21.02.2014, 10:33  [ТС]
SatanaXIII отличный показательный пример,спасибо.

На счет того как так получается, что при удалении формы , что условие компонента работает. то делаю следующим образом :

Создаю в шапочке едик

C++
1
2
3
4
5
6
7
8
9
10
11
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
 
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TEdit * edit;
TForm *form;
//---------------------------------------------------------------------------
Далее создаю форму к и кидаю на него этот компонент

C
1
2
3
4
5
6
7
8
9
10
void __fastcall TForm1::NewForm(TObject *Sender)
{
 
form = new TForm(this);
form->OnClose= FormClose;
 
edit=new  TEdit(this);
edit->Parent=form;
 
form->show()

Далее хреначу форму. по суте она же ссобой должна все подчистить где является родителем.....но порой если проверять выше упомянутое условие....оно всплывает как истина
C
1
2
3
4
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
Action = caFree;
}

А на счет писать в других средах, мне интереснее и попонятнее именно Builder (просто Rad немного пофункциональние, потому и на него перешел)

Благодаря Вам (тем кто откликнулся на тему), стало понятно что статика или динамика не влияет на расход ресурсов системы, что было для меня важно
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
21.02.2014, 11:18
Цитата Сообщение от Dinkin Посмотреть сообщение
Создаю в шапочке едик
Когда вы так делаете, то созданный Edit будет виден во всем приложении. Вы делаете его глобальным. Если вы хотите сделать его членом какой-то одной формы, то следует его разместить в описании самой формы:
Вот так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TButton *Button1;
        TButton *Button2;
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
        void __fastcall Button2Click(TObject *Sender);
private:    // User declarations
        void __fastcall NewForm(TObject *Sender);
public:     // User declarations
        __fastcall TForm1(TComponent* Owner);
        TEdit * edit; // <- Вот он
};

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

Цитата Сообщение от Dinkin Посмотреть сообщение
Далее хреначу форму. по суте она же ссобой должна все подчистить где является родителем.....но порой если проверять выше упомянутое условие....оно всплывает как истина
Все правильно. Когда вы хреначите форму, то большая часть памяти от нее просто бросается и про нее забывается. Форма при своем уничтожении не выставляет свои булевые значения в false. Точно так же она не зануляет какие-то свои переменные. Она вообще ничего не делает. Кто там что наворочил в том участке памяти, который она раньше занимала, никого не волнует. Следовательно, каждый раз обращаясь к edit->Visible вы подбрасываете монетку.

P.S. Вот вы пишите:
C++
4
form = new TForm(this);
То есть вы при создании новой формы указываете ей хозяином ту форму, с которой создаете. this это указатель на текущую форму. Такой подход чреват тем, что при уничтожении формы, с которой была создана дочерняя, автоматически будет уничтожена и сама дочерняя. Это конечно пожалуйста, но если только это нужно. Если же вы хотите сохранить дочернюю форму после уничтожения той, с которой она была создана, то указывайте ей хозяином this->Owner. То есть владельца порождающей формы (обычно это само приложение). Но если вы хотите создать форму вообще зависящую только от приложения, и автоматически уничтожаемую только с завершением оного, то пишите конкретно:
C++
1
form = new TForm( Application );
1
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,145
Записей в блоге: 3
21.02.2014, 11:32  [ТС]
"Форма при своем уничтожении не выставляет свои булевые значения в false" это для меня новость, так же как и new TForm(this);.....с этим у меня были проблемы и не понятные ошибки, Огроменное спасибо!!!!!!
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.02.2014, 12:23

Не по теме:

Цитата Сообщение от Dinkin Посмотреть сообщение
"Форма при своем уничтожении не выставляет свои булевые значения в false" это для меня новость, так же как и new TForm(this);
:wall:=-O Пипец ...



Добавлено через 6 минут
Visual Component Library: Вид изнутри, удаление и установка компонентов
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
22.02.2014, 11:40
Цитата Сообщение от Dinkin Посмотреть сообщение
"Форма при своем уничтожении не выставляет свои булевые значения в false" это для меня новость, так же как и new TForm(this);.....с этим у меня были проблемы и не понятные ошибки, Огроменное спасибо!!!!!!
Вот именно поэтому неправильно выносить объявление компонентов формы за пределы объявления самого класса формы. После того, как форма разрушена, мы получаем кучку невалидных указателей, которые не обнулены и за обращение по которым можно схлопотать access violation. Следовательно, при разрушении формы нам нужно проделывать дополнительную работу по обнулению связанных с ней указателей на компоненты.
В том же случае, когда соблюдается принцип инкапсуляции ООП и все связанное непосредственно с объектом хранится внутри этого объекта, получаем обычную картину. Разрушаем форму, обнуляем указатель на нее - и все, получить доступ к какому-либо невалидному указателю мы уже просто не можем.

Кстати, если вся эта ерунда из-за простеньких диалогов с эдитами и прочим, то есть множество готовых диалогов как в VCL( Vcl.Dialogs ), так и в WinAPI( Dialog Boxes ) и не надо ничего городить. Например, с эдитом - InputBox.
1
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,145
Записей в блоге: 3
24.02.2014, 10:41  [ТС]
"Например, с эдитом - InputBox. "
Век живи,век учись, про него совсем забыл, благодарю
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.02.2014, 10:41
Помогаю со студенческими работами здесь

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

Удаление динамически созданных TSpeedButton
Имеется такой вот код, оптимизации 0, но сейчас не об этом. При попытке удалить массив из But, происходит ошибка. Project...

Удаление динамически созданных объектов
Помогите плз. Пишу курсач по МИО. Вот ща работаю над интерфейсом. Я по нажатию кнопку создаю динамически объект edit. Хочу теперь при...

Удаление динамически-созданных компонентов
Использую класс, компонентами которого кроме всего прочего, являются StaticText и Edit, графическое изображение. Создаю экземпляр класса...

События динамически созданных компонентов
В проекте динамически создаются компоненты TShape нажатием мыши на форме. Для компоненты необходимо обработать событие OnMouseDown,в...


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
влияние грибов на сукцессию
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, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru