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

Программное создание формы

02.07.2010, 16:54. Показов 14427. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В проекте имеется несколько готовых форм, которые не создаются автоматически. Как программно правильно создать(или активизировать) форму и потом:
  1. корректно закрыть(вернуть в состояние до создания(активизации));
  2. корректно уничтожить?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.07.2010, 16:54
Ответы с готовыми решениями:

Программное создание объектов формы
Задача простая - вывести на форму определённое (вычисляемое) количество контейнеров с текстом и потом их программно перемещать в...

Программное создание элементов формы.
Всем привет. Только начал освоение C++, работаю в Borland С++ Builder 6. Возникла потребность создания Edit -ов на форме программным путем,...

Программное создание ярлыка...
Всем привет :) Как программно создать ярлык программы на рабочем столе и в панели быстрого запуска?

9
 Аватар для Danil_e71
32 / 32 / 8
Регистрация: 07.02.2010
Сообщений: 92
02.07.2010, 17:39
C++
1
2
3
FormN->Show();//Показ
FormN->Hide();//Скрытие
FormN->Close();//Убитие
1
 Аватар для Lelik-pahan
1709 / 905 / 207
Регистрация: 25.11.2009
Сообщений: 1,850
02.07.2010, 17:50
А при закрытии формы
C++
1
2
3
4
void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action)
{
Action=caFree; 
}
чтобы выгрузить форму из памяти (если она больше не будет использоваться

и, например, при обращении ко второй форме из первой, не забудь добавить в заголовке Form1
C++
1
#include "Unit1.h"
2
0 / 0 / 1
Регистрация: 16.06.2010
Сообщений: 82
02.07.2010, 18:42  [ТС]
Цитата Сообщение от Danil_e71 Посмотреть сообщение
C++
1
2
3
FormN->Show();//Показ
FormN->Hide();//Скрытие
FormN->Close();//Убитие

А зачем тогда меню:
project options->Forms Auto-create Forms | Available(RAD2010)? если форма все ровно создается?
если у меня скажем 2000 форм в Available они все создадутся при старте программы?

Добавлено через 13 минут
P.S.
FormN->Show(); не работает с Available формой.
есть такой код:
C++
1
2
3
4
TFUserGroups *FUserGroups = new TFUserGroups(Application);
    if (!FUserGroups) {
        return;
    }
форма появляется, но при этом также происходит ошибка Access violation. И при повторном нажатии на кнопку выскакивает ещё одна форма.
0
 Аватар для Lelik-pahan
1709 / 905 / 207
Регистрация: 25.11.2009
Сообщений: 1,850
03.07.2010, 00:22
если ты собираешься использовать 2000 форм, то может стоит не добавлять их все в проект (File->New->form), а создовать програмно, по мере необходимости
C++
1
2
TForm * FormN= new TForm(this); //Где FormN - имя формы
Formik->Show();
а когда форма будет не нужна, удаляй её
C++
1
delete FormN;
2
Эксперт С++
 Аватар для MikeSoft
3957 / 1812 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
03.07.2010, 16:35
Цитата Сообщение от Danil_e71 Посмотреть сообщение
FormN->Close();//Убитие
Данный код не убьёт форму.


umount, когда вы убираете форму из Auto-create Forms, вы, тем самым, указываете, что есть класс, описанный в заголовочном файле, но просите не создавать объекты данного класса.

То есть, для начала нужно создать обьект данного класса:
C++
1
TAboutBox *AboutBox = new TAboutBox(this);
Дальше, форму можно показать:
C++
1
AboutBox->ShowModal();
После чего - прибить:
C++
1
2
delete AboutBox;
AboutBox = NULL;
Если вам необходимо, чтобы форма не блокировала вызывающую, то можно делать так:
C++
1
AboutBox->Show();
Но в этом случае, в динамически создаваемой форме должна выполняться очистка по закрытию:
C++
1
2
3
4
void __fastcall TAboutBox::FormClose(TObject *Sender, TCloseAction &Action)
{
  Action = caFree; 
}
2
0 / 0 / 1
Регистрация: 16.06.2010
Сообщений: 82
05.07.2010, 11:45  [ТС]
Цитата Сообщение от MikeSoft Посмотреть сообщение
Данный код не убьёт форму.


umount, когда вы убираете форму из Auto-create Forms, вы, тем самым, указываете, что есть класс, описанный в заголовочном файле, но просите не создавать объекты данного класса.

То есть, для начала нужно создать обьект данного класса:
C++
1
TAboutBox *AboutBox = new TAboutBox(this);
Дальше, форму можно показать:
C++
1
AboutBox->ShowModal();
После чего - прибить:
C++
1
2
delete AboutBox;
AboutBox = NULL;
Если вам необходимо, чтобы форма не блокировала вызывающую, то можно делать так:
C++
1
AboutBox->Show();
Но в этом случае, в динамически создаваемой форме должна выполняться очистка по закрытию:
C++
1
2
3
4
void __fastcall TAboutBox::FormClose(TObject *Sender, TCloseAction &Action)
{
  Action = caFree; 
}
А как предотвратить создание 2-рой такой же формы?
Пишу так:
C++
1
2
3
4
5
6
7
8
if (FUserGroups) {
        return;
    }
    else if (!FUserGroups) {
        TFUserGroups *FUserGroups = new TFUserGroups(this);
        
        FUserGroups->Show();
    }
не помогает...
0
Эксперт С++
 Аватар для MikeSoft
3957 / 1812 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
05.07.2010, 14:09
umount, глобально объявляем указатель:
C++
1
TAboutBox *AboutBox;
В заголовочном файле (для класса формы, из которой будет вызов) объявляем прототип функции (в области public):
C++
1
void __fastcall TForm1::SetNull();
Описываем саму функцию:
C++
1
2
3
4
void __fastcall TForm1::SetNull()
{
  AboutBox = NULL;
}
В динамически создаваемой форме обрабатываем событие OnClose:
C++
1
2
3
4
5
void __fastcall TAboutBox::FormClose(TObject *Sender, TCloseAction &Action)
{
  Form1->SetNull();
  Action = caFree;
}
В вызываемой форме обрабатываем создание и вызов новой формы:
C++
1
2
3
4
5
6
7
8
9
if (!AboutBox) {
  AboutBox = new TAboutBox(this);
  AboutBox->Show();
} else {
  if (IsIconic(AboutBox->Handle)) {
    AboutBox->WindowState = wsNormal;
  }
  AboutBox->SetFocus();
}
Таким образом, дубликат создан не будет.
2
softmaker
28.10.2011, 01:35
MikeSoft, в примере для динамически создаваемой формы

Code
1
2
3
4
5
void __fastcall TAboutBox::FormClose(TObject *Sender, TCloseAction &Action)
{
   * Form1->SetNull();
   * Action = caFree;
}
не будет ли тут попытки высвобождения памяти по уже обнуленному адресу? Или же такой прием допустим так как высвобождение будет осуществляться вызовом метода Release() этой самой формы, и обнуленный указатель на эту форму уже никак не будет при этом использоваться при высвобождении?

И еще - диспетчер задач в случае с динамической модальной формой типа About четко показывает возврат памяти системе при удалении формы с помощью delete, но в случае многократного динамического создания/удаления НЕмодальной формы память сначала увеличивается при выделении (где-то 4 клика создания/удал.) но не уменьшается при закрытии, а потом остается неизменной независимо от дальнейших циклов создания/удаления формы. Это нормальное поведение системы? Вроде с кодом все верно, все как тут описано, а результат как будто для автосоздаваемой формы...
Эксперт С++
 Аватар для MikeSoft
3957 / 1812 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
30.01.2013, 11:45
Хоть тема и старая, но думаю, ответить всё же стоит (в своё время не заметил этого ответа) ...
Цитата Сообщение от softmaker Посмотреть сообщение
не будет ли тут попытки высвобождения памяти по уже обнуленному адресу?
Нет, не будет, т.к. мы всего лишь обнуляем указатель, объявленный у объекта Form1 класса TForm1 из объекта AboutBox класса TAboutBox.
Цитата Сообщение от softmaker Посмотреть сообщение
но в случае многократного динамического создания/удаления НЕмодальной формы память сначала увеличивается при выделении (где-то 4 клика создания/удал.) но не уменьшается при закрытии, а потом остается неизменной независимо от дальнейших циклов создания/удаления формы. Это нормальное поведение системы?
Да, это нормальное поведение. Диспетчер задач показывает вам использование виртуальной памяти процессом.
Менеджер памяти (в новых версиях IDE - FastMM, если я не ошибаюсь) считает излишним моментальный возврат небольшого количества памяти, что приведет только к снижению быстродействия. Участок памяти в куче (heap) помечен как "свободный" и будет использован самим приложением в случае недостатка памяти в куче. Точно также, операционная система способна претендовать на свободную память в куче.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.01.2013, 11:45
Помогаю со студенческими работами здесь

Программное создание БД на с++
Народ подскажите пожалуйста как создать программно mdb файл. Делал так Variant acs =...

Программное создание каталога
Как это делается? Достаточно ли просто открыть в поток файлового вывода файл в несуществующем каталоге? Или как?

Программное создание формы
Пишу программу в блокноте чтобы лучше выучить язык, у меня возникла такая проблемка установил на форме элемент MainMenuStrip и ToolStrip но...

Программное создание элемента формы
Создаю элемент с помощью процедуры. procedure TForm1.ComboCreate(i: Integer; name: string); begin Combo:=TsComboBoxEx.Create(Form1); ...

Программное создание и удаление ревизита формы в 1с 8.3 УФ
Всем добрый день. Никак не могу понять как удалить ранее программно созданный реквизит формы в обработке Создаю так: ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru