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

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

08.05.2012, 00:53. Показов 6536. Ответов 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
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2012, 01:06
Если Form1 у тебя главная форма то при Close(); приложение закроется и так без всяких
C++
1
Application->Terminate();
В противном же случае форма при Close() не уничтожается а просто становится не видимой.
Очищать каждый элемент вручную - глупо
Для этого достаточно создать ф-цию очистки компонентов, и вызывать ее в нужных местах
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
08.05.2012, 01:38  [ТС]
Avazart,
Цитата Сообщение от Avazart Посмотреть сообщение
В противном же случае форма при Close() не уничтожается а просто становится не видимой.
Именно поэтому я и делаю
C++
1
Application->Terminate();
т.к. Form1 - у меня не главная форма.


Цитата Сообщение от Avazart Посмотреть сообщение
Для этого достаточно создать ф-цию очистки компонентов
А можно намекнуть как ее сделать? Через FindComponent имеете в виду?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2012, 01:54
C++
1
2
3
4
5
6
void Clear()
 {
  Form1->Edit1->Clear();
  Form1->Memo1->Clear();
  //...итд
 }
Но, можно и проход по Form1->Components[] вписать внутрь, как впринципе и FindComponent()

Добавлено через 7 минут
Есть еще вариант сохранять форму в файл или поток, а потом загружать с них.
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
08.05.2012, 02:00  [ТС]
Avazart,
Цитата Сообщение от Avazart Посмотреть сообщение
Но, можно и проход по Form1->Components[] вписать внутрь, как впринципе и FindComponent()
Ну да, я изначально рассматривал этот вариант, спасибо!

Но все-таки интересно, как отследить, что запрос на закрытие формы пришел, скажем, по нажатию крестика на форме и тогда уже закрывать приложение, а если это было вызвано:
C++
1
this->Close(); // с кнопки
, то тогда ничего не делать.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2012, 02:19
Объявить глобальную переменную bool CanClose=true, и проверять её.

C++
1
2
3
4
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
if(CanClose) Application->Terminate();
}
C++
1
2
3
4
5
6
7
8
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 Form1new = new TForm1(Application);
 CanClose=false;
 this->Close();
 CanClose=true;
 Form1new->Show();
}
Добавлено через 4 минуты
Но это все сплошное бокопорство по тому как Form1 попрежнему висит в памяти.

Добавлено через 8 минут
Сохранение динамических компонентов тут есть ф-ции сохранения можешь их попробывать
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
08.05.2012, 02:20  [ТС]
Avazart,
Цитата Сообщение от Avazart Посмотреть сообщение
Но это все сплошное бокопорство по тому как Form1 попрежнему висит в памяти.
Хм... Почему же?
C++
1
Action = caFree;
разве не спасает? Или Вы что имели в виду?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2012, 02:25
Ну её можно вызвать Form1->Show() и она появится.

Добавлено через 3 минуты
Пробуй
C++
1
TMemoryStream *Ms = new TMemoryStream();
C++
1
2
Ms->WriteComponent(Form1); // Сохранение чистой формы
Ms->Position = 0;
C++
1
2
Ms->Position = 0;
Ms->ReadComponent(Form1);// Очистка
C++
1
delete Ms;
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
08.05.2012, 02:27  [ТС]
Avazart, но после
C++
1
2
Application->Terminate();
Action = caFree;
в памяти же ничего не останется, так? Мне просто это главное.

Кстати, а если всякие там
C++
1
2
Form1->Activate(); 
Form1->Repaint();
по этой кнопке вызывать.. Не пойдет? Блин, было бы чего-нить типа Recreate()
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2012, 02:32
Да, но новую форму придется удалять через delete, а значит предыдущий код не канает, нужно сразу делать не Close(), а delete Form1 и создавать новую на её место, но блымать все равно будет

Добавлено через 1 минуту
Чуть не забыл перед загрузкой с потока надо сделать
C++
1
for(;this->ComponentCount!=0;) delete this->Components[0] ;
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
08.05.2012, 02:36  [ТС]
Avazart,
Цитата Сообщение от Avazart Посмотреть сообщение
Чуть не забыл перед загрузкой с потока надо сделать
да-да, а то я Вам уже хотел жаловаться, что у меня он ругнулся на component already existed

Щас буду тестить!
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2012, 02:40
Проблема будет с положением формы оно будет первоначальным, так как свойства Left,Top тоже сохранятся
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
08.05.2012, 02:41  [ТС]
Avazart, хм... Все равно ругается, доходит до первого элемента на форме и говорит, что компонент уже создан.

Посмотрите, пожалуйста, правильно ли я распихал все:

C++
1
2
3
4
5
6
7
8
9
    
TMemoryStream *Ms = new TMemoryStream();
 
void __fastcall TForm1::FormActivate(TObject *Sender)
{
 Ms->WriteComponent(Form1);
 Ms->Position = 0;
...
}
C++
1
2
3
4
5
6
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 for(;this->ComponentCount!=0;) delete this->Components[0];
 Ms->Position = 0;
 Ms->ReadComponent(Form1);
}
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2012, 02:45
Поэтому лучший способ ф-ция или обработчик для очистки.Я обычно делаю кнопочку "Очистить" для пользователя.
Миниатюры
Переcоздание TForm  
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
08.05.2012, 02:48  [ТС]
Avazart, блин, как жалко! Я уж обрадовался, что так по-простому прокатит

Дык а в чем может быть проблемка?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2012, 02:50
У меня нормально работает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
TMemoryStream *Ms;
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 for(;this->ComponentCount!=0;) delete this->Components[0];
 Ms->Position = 0;
 Ms->ReadComponent(Form1);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Ms = new TMemoryStream();
Ms->WriteComponent(Form1);
Ms->Position = 0;
}
//---------------------------------------------------------------------------
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
08.05.2012, 03:22  [ТС]
Avazart, да работает! Но блин... Теперь другая проблема
На самом деле форма еще включает заголовок (Label2), который динамически меняется...

То есть на активацию формы у меня прописано:

C++
1
2
3
4
5
6
7
8
9
void __fastcall TForm1::FormActivate(TObject *Sender)
{      
        String ucount;
    String sql = "запрос";
    selec5(sql); // выполнение запроса
    ucount = Form1->ADOQuery5->FieldByName("Counts")->AsString;
    this->Label2->Caption = ucount;
...
}
Для общей картины - на самом верху формы лейблы ("Label1" "Label2"):
"Формируется задание для: " "ucount".

А вот уже ниже идут все компоненты которые надо очищать потом.
Соответственно после нажатия кнопки должно произойти очистка формы, но при этом должна быть произведена выборка, по результатам которой будет отражаться соответствующий Label2... А мы минуем FormActivate

Вот так =/
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2012, 03:33
Есть такой вариант, решает проблему блымания и положения

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;
}
//---------------------------------------------------------------------------
Главное чтоб порядок и количество компонентов на форме не менялось
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
08.05.2012, 03:45  [ТС]
Avazart,

C++
1
2
3
4
void __fastcall TForm1::FormCreate(TObject *Sender)
{
for(int i=0;i<ComponentCount;i++) if(Components[i]!=Label12) Ms->ReadComponent(Components[i]);
}
Stream read error


Добавлено через 1 минуту
Тьфу ты! Позицию же не выставил!
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2012, 03:50
C++
1
if(Components[i]!=Label12)
Label1 или Label2 или оба?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.05.2012, 03:50
Помогаю со студенческими работами здесь

Доступ к обьектам 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), но только выводит он всесь...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Жизнь в неопределённости
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