1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891

Переcоздание TForm

08.05.2012, 00:53. Показов 7027. Ответов 72
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребят, в общем задача простая: есть форма, на ней n-контролов (боксы, едиты, листы и пр.), которые заполняются. Есть кнопка по нажатию которой все контролы должны очищаться, т.е. форма перед нами должна предстать как будто только что созданная.

Очищать каждый элемент вручную - глупо. Использование FindComponent более рационально, однако слишком много разных типов контролов, так что все равно не подходит.

Ну соответственно решил пересоздавать форму по нажатию этой кнопки:

C++
1
2
3
4
5
6
7
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 Form1new = new TForm1(Application);
 this->Close();
 Form1new->Show();
}
Однако возникли следующие проблемы. На закрытие форм класса TForm1 у меня стоит:

C++
1
2
3
4
5
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
 Application->Terminate();
 Action = caFree;
}
Соответственно
C++
1
this->Close();
- вызывает закрытие приложения.

Вот... Но даже если я решу эту проблему, все равно заметно как форма моргает и если предыдущая форма имела какие-то другие координаты, а не по центру (что выставлено по умолчанию для TForm1), то после нажатия кнопки происходит прыжок формы на центр...

Может кто-нибудь подскажет, как по умнее это сделать?

Благодарю!

Добавлено через 3 минуты

Не по теме:

P.S. LK, поправьте тайтл, пожалуйста... Что-то я промаСал

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

копии TForm
мне надо создать больше двух копий TForm. как мне сделать что бы после создания копий, и закрытия главной формы, не закрывались...

Наследник TForm
Доброго времени суток всем. Такая проблема: создал модуль, в нем описал класс: #include <Forms.hpp> class TMyForm : public...

Вопрос по TForm
Есть главная форма приложения Form1. Есть дополнительная форма Form2, которая создаётся сразу же при запуске приложения, но не...

72
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
08.05.2012, 04:27  [ТС]
Студворк — интернет-сервис помощи студентам
Avazart,
Цитата Сообщение от Avazart Посмотреть сообщение
Label1 или Label2 или оба?
Очепятался там.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
TMemoryStream *Ms;
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Ms->Position = 0;
for(int i=0;i<ComponentCount;i++) if(Components[i]!=Label2) Ms->ReadComponent(Components[i]);
FormActivate(Sender);// Можно и без if если вызывать FormActivate
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Ms = new TMemoryStream();
for(int i=0;i<ComponentCount;i++) if(Components[i]!=Label2) Ms->WriteComponent(Components[i]);
Ms->Position = 0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
delete Ms;
}
//---------------------------------------------------------------------------
Таким образом у меня не получается почему-то... Компоненты не очищаются, а менюшка на форме вообще дублируется)) Кстати, а удалять компоненты разве не надо?

А вот таким способом:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
TMemoryStream *Ms;
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 for(;this->ComponentCount!=0;) delete this->Components[0];
 Ms->Position = 0;
 Ms->ReadComponent(Form1);
 FormActivate(Sender);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormActivate(TObject *Sender)
{
Ms = new TMemoryStream();
Ms->WriteComponent(Form1);
Ms->Position = 0;
...
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
delete Ms;
}
//---------------------------------------------------------------------------
все просто замечательно работает! Правда Вы что-то говорили насчет положения...

Добавлено через 5 минут
А, ну да... Положение не запоминается и форма моргает - как будто пересоздается... Блин, что же делать.. Я чувствую, осталось совсем немножко


Цитата Сообщение от The_Immortal Посмотреть сообщение
Таким образом у меня не получается почему-то... Компоненты не очищаются, а менюшка на форме вообще дублируется))
Avazart, а у Вас как? Все норм??
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2012, 04:30
Компоненты надо только если загружается форма так как она является контейнером для компонентов
Правда Вы что-то говорили насчет положения...
Если создаются новые компоненты или удаляются старые то меняет ComponentCount
Avazart, а у Вас как? Все норм??
Да я проверял.
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
08.05.2012, 04:35  [ТС]
Avazart,
Цитата Сообщение от Avazart Посмотреть сообщение
Да я проверял прада у меня было 4-ре компонента всего
А попробуйте, пожалуйста, с TMainMenu.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2012, 04:38
Перепроверил да меню дублируется его надо тоже исключать
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
08.05.2012, 04:46  [ТС]
Avazart, а у меня даже Edit-ы таким образом не очищаются
А почему, не пойму никак...
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2012, 04:49
Исключил так
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
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Ms->Position = 0;
for(int i=0;i<ComponentCount;i++) 
   if(Components[i]!=MainMenu1 && ! Components[i]->ClassNameIs("TMenuItem")) 
                                      Ms->ReadComponent(Components[i]);
FormActivate(Sender);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Ms = new TMemoryStream();
for(int i=0;i<ComponentCount;i++)
if(Components[i]!=MainMenu1 && !Components[i]->ClassNameIs("TMenuItem")) 
                                     Ms->WriteComponent(Components[i]);
Ms->Position = 0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
delete Ms;
}
//---------------------------------------------------------------------------
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
08.05.2012, 04:49  [ТС]
А похоже вообще ничего заново на форму не записывается...
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2012, 04:52
Avazart, а у меня даже Edit-ы таким образом не очищаются
Нельзя точно сказать, из-за меню порядок изменился походу

Добавлено через 2 минуты
А ToolBar есть у Вас? Или что-то подобное...
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
08.05.2012, 04:55  [ТС]
Avazart, а как меню могло повлиять на это?

Добавлено через 1 минуту
Цитата Сообщение от Avazart Посмотреть сообщение
А ToolBar есть у Вас? Или что-то подобное...
Неа. У меня КомбоБоксы, Едиты, Лейблы, Менюха, ДБГриды...

Боксы, кстати, тоже динамически заполняются...
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2012, 04:56
Походу дважды сохраняет, сначала меню + его элементы, а потом отдельно элементы.
У этих ф-ций записи есть свои бока
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
08.05.2012, 04:58  [ТС]
А, еще все что не динамическое (заполняется ниже после лейбла1 и 2) находится в GroupBox'e
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2012, 05:00
Неа. У меня КомбоБоксы, Едиты, Лейблы, Менюха, ДБГриды...
Тогда поидее больше не должно быть проблем
Добавлено через 30 секунд
Проверьте код без с учетом меню
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
08.05.2012, 05:01  [ТС]
Avazart, удалил менюшку - все равно ни один Едит не очищается
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2012, 05:03
А, еще все что не динамическое (заполняется ниже после лейбла1 и 2) находится в GroupBox'e
Заполнение ерунда, главное что не создовались сами компоненты

Добавлено через 1 минуту
Avazart, удалил менюшку - все равно ни один Едит не очищается
Но ошибок не выдает?
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
08.05.2012, 05:05  [ТС]
Avazart, не, такого нет... Все статичное. А у меня вопрос, GroupBox является контейнером для компонентов, которые в нем сидят? Я просто к тому, что может тогда только его считывать?

Добавлено через 23 секунды
Цитата Сообщение от Avazart Посмотреть сообщение
Но ошибок не выдает?
Неа, никаких.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2012, 05:06
Не нормально, с ним(GroupBox) уже проверил работает

Добавлено через 52 секунды
Неа, никаких.
Перепроверь код может где опечатка...
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
08.05.2012, 05:15  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Перепроверь код может где опечатка...
Копипаст:

C++
1
2
3
4
5
6
7
void __fastcall TForm1::FormActivate(TObject *Sender)
{
 Ms = new TMemoryStream();
 for(int i=0;i<ComponentCount;i++) Ms->WriteComponent(Components[i]);
 Ms->Position = 0;
...
}
У Вас правда это висит на FormCreate, но я думаю что нету разницы.


C++
1
2
3
4
5
6
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 Ms->Position = 0;
 for(int i=0;i<ComponentCount;i++) Ms->ReadComponent(Components[i]);
 FormActivate(Sender);
}
Добавлено через 4 минуты
Цитата Сообщение от The_Immortal Посмотреть сообщение
У Вас правда это висит на FormCreate, но я думаю что нету разницы.
Проверил - не помогло
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2012, 05:18
Ну Вас Button1Click вызывает FormActivate может идет пересохранение, переместите в FormCreate чтоб проверить
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
08.05.2012, 05:28  [ТС]
Уже...
Цитата Сообщение от Avazart Посмотреть сообщение
переместите в FormCreate чтоб проверить
Цитата Сообщение от The_Immortal Посмотреть сообщение
Проверил - не помогло
Добавлено через 3 минуты
Я уже и без FormActivate пробовал...

Добавлено через 3 минуты
А вот КомбоБоксы ставят -1 индекс! А Edit-ы почему-то тупят.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2012, 05:29
Очень странно у меня все вроде норм

Если у вас Builder версии до или 2009 я мог бы глянуть если выложите проект
Вложения
Тип файла: rar Очистка.rar (289.0 Кб, 9 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.05.2012, 05:29

Доступ к обьектам TForm
Задача в следующем: есть TForm и в на нём лежит порядка 100 кнопок. Кнопки имеют определённые имена, и именно с помощью этих имён я и хочу...

Класс перехватчик к TForm
Добрый день, добавляю к TForm доп строку namespace SLE { class TF : public Vcl::Forms::TForm { private: AnsiString...

Вопрос по TForm::OnKeyPress
Есть форма. На ней расположен TStringGrid и несколько кнопочек. Хочется отработать нажатие на клавишу (независимо от того, на каком из...

Создание наследника TForm
Всем привет. При попытке создать наследника TForm получаю ошибку &quot;Resource MyClass not found.&quot; Unit1.cpp ...

Вывод текта на TForm
Здравствуйте. Как на TForm вывести RichEdit1-&gt;Text. Пробую через Form1-&gt;Canvas-&gt;TextOutA(0,0,RichEdit1-&gt;Text), но только выводит он всесь...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru