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

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

08.05.2012, 00:53. Показов 6540. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru