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

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

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

Author24 — интернет-сервис помощи студентам
Ребят, в общем задача простая: есть форма, на ней 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.05.2012, 00:53
Ответы с готовыми решениями:

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

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

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

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

72
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
08.05.2012, 04:27  [ТС] 21
Author24 — интернет-сервис помощи студентам
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
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2012, 04:30 22
Компоненты надо только если загружается форма так как она является контейнером для компонентов
Правда Вы что-то говорили насчет положения...
Если создаются новые компоненты или удаляются старые то меняет ComponentCount
Avazart, а у Вас как? Все норм??
Да я проверял.
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
08.05.2012, 04:35  [ТС] 23
Avazart,
Цитата Сообщение от Avazart Посмотреть сообщение
Да я проверял прада у меня было 4-ре компонента всего
А попробуйте, пожалуйста, с TMainMenu.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2012, 04:38 24
Перепроверил да меню дублируется его надо тоже исключать
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
08.05.2012, 04:46  [ТС] 25
Avazart, а у меня даже Edit-ы таким образом не очищаются
А почему, не пойму никак...
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2012, 04:49 26
Исключил так
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  [ТС] 27
А похоже вообще ничего заново на форму не записывается...
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2012, 04:52 28
Avazart, а у меня даже Edit-ы таким образом не очищаются
Нельзя точно сказать, из-за меню порядок изменился походу

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

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

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

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

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

Добавлено через 52 секунды
Неа, никаких.
Перепроверь код может где опечатка...
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
08.05.2012, 05:15  [ТС] 37
Цитата Сообщение от 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
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2012, 05:18 38
Ну Вас Button1Click вызывает FormActivate может идет пересохранение, переместите в FormCreate чтоб проверить
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
08.05.2012, 05:28  [ТС] 39
Уже...
Цитата Сообщение от Avazart Посмотреть сообщение
переместите в FormCreate чтоб проверить
Цитата Сообщение от The_Immortal Посмотреть сообщение
Проверил - не помогло
Добавлено через 3 минуты
Я уже и без FormActivate пробовал...

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

Если у вас Builder версии до или 2009 я мог бы глянуть если выложите проект
Вложения
Тип файла: rar Очистка.rar (289.0 Кб, 7 просмотров)
0
08.05.2012, 05:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.05.2012, 05:29
Помогаю со студенческими работами здесь

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

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

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

Вывод текта на TForm
Здравствуйте. Как на TForm вывести RichEdit1-&gt;Text. Пробую через...


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

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

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