Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.87/30: Рейтинг темы: голосов - 30, средняя оценка - 4.87
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891

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

08.05.2012, 00:53. Показов 6563. Ответов 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
8488 / 6155 / 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
8488 / 6155 / 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
8488 / 6155 / 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
8488 / 6155 / 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
8488 / 6155 / 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
8488 / 6155 / 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
8488 / 6155 / 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
8488 / 6155 / 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
8488 / 6155 / 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
8488 / 6155 / 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
Ответ Создать тему
Новые блоги и статьи
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита, которое может. . .
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". На примере нетипового документа разработанного в конфигурации КА2. В качестве источника данных указан регистр накопления, в который записываются данные о. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru