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

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

08.05.2012, 00:53. Показов 7019. Ответов 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
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
08.05.2012, 07:03
Студворк — интернет-сервис помощи студентам
The_Immortal, кажись, обсуждалось и не один раз -

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

2. Менее понятный способ (не делал) .
WriteComponentResFile Function
ReadComponentResFile Function
ReadComponentResFile (C++)

Как сохранить всю форму в файл (как Delphi в *.dfm)
(к сожалению, пример на делфии)

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
constructor TForm1.Create(AOwner: TComponent); // override;
var
  fname: String;
begin
  { Для динамически создаваемых контролов, может требоваться
  RegisterClasses(..); }
  fname := FormFilename;
  if FileExists( fname ) then
    begin
      CreateNew(AOwner);
      ReadComponentResFile(fname, Self);
    end
  else
    inherited Create( AOwner );
end;
 
procedure TForm1.FormCloseQuery( Sender: TObject;
   var CanClose: Boolean);
begin
  WriteComponentResFile(FormFileName, Self);
end;
 
{Peter Below, Vladimir Titov}
1
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2012, 16:34
я как-то по электронке неразрывный пробел отсылал и на форуме выкладывал , а здесь "пустое свойство" не сохраняется
Если сохранять в файл то это можно увидить свойства просто нет
Миниатюры
Переcоздание TForm  
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2012, 16:40
Можно прописать его ручками Text = '' файле и тогда эдит будет очищаться
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
08.05.2012, 16:47  [ТС]
LK, Заюзал пример на делфи - он применителен, когда считывание данных формы в файл и извлечение происходит в разные моменты времени. В данном случае запись данных в файл происходит на закрытие формы, а извлечение - на создание формы. Мне же надо сделать в пределах одной сессии, т.е. когда форма не закрывается.
Поэтому, когда вызываю ReadComponentResFile вылетает ошибка, что такой-то элемент формы уже создан
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2012, 16:47
LK,WriteComponentResFile() ReadComponentResFile() дадут тот же эффект
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
08.05.2012, 16:51  [ТС]
Avazart, а может с WriteComponentResFile прокатит? Просто у меня опять проблема с уже имеющимеся компонентами Я так и не понял, как Вы ее вчера обошли...

Добавлено через 1 минуту
Цитата Сообщение от Avazart Посмотреть сообщение
Если сохранять в файл то это можно увидить свойства просто нет
А можно примерчик, как Вы в файл сохраняете?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2012, 16:54
а может с ReadComponentResFile прокатит?
Не прокатит это одно тоже с тем что я предложил по сути
А можно примерчик, как Вы в файл сохраняете?
Я уже это кидал Сохранение динамических компонентов
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
08.05.2012, 16:57  [ТС]
Avazart,
Цитата Сообщение от Avazart Посмотреть сообщение
Я уже это кидал
Чего-то не могу применить для моего случая...
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2012, 17:09
Это глючные и не понятные методы, не понимаю почему их не обкатали
Чего-то не могу применить для моего случая...
Эти ф-ции написаны что бы сохранять один компонент, но в читаемом виде
WriteComponentResFile() делает тоже самое только, в не читаемом виде

Добавлено через 10 минут
Если бы можно было как-то программно получить список-значение всех свойств компонента.
C# как я помню есть такой способ...а вот в Buildere ?
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
08.05.2012, 17:30  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Если сохранять в файл то это можно увидить свойства просто нет
Так а можно примерчик кода, как Вы это поместили в файл?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2012, 17:48
Можно решить так (не решает проблему с "блыманием" формы)
Пишим код
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
25
26
27
28
29
30
31
32
33
34
namespace my
 {
 void SaveComponent(TComponent* Component,String FileName)
  {
  TMemoryStream *Ms = new TMemoryStream();
  Ms->WriteComponent(Component);
  TFileStream *Fs = new  TFileStream(FileName,fmCreate);
  Ms->Position = 0;
  ObjectBinaryToText(Ms,Fs);
  delete Fs,Ms;
  }
 
  void LoadComponent(TComponent* Component,String FileName)
  {
  TFileStream *Fs = new TFileStream(FileName,fmOpenRead);
  TMemoryStream *Ms = new TMemoryStream();
  ObjectTextToBinary(Fs,Ms);
  Ms->Position = 0;
  Ms->ReadComponent(Component);
  delete Fs,Ms;
  }
 }
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
my::SaveComponent(Form1,"1.txt");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
for(;this->ComponentCount!=0;) delete this->Components[0];
my::LoadComponent(Form1,"1.txt");
}
//---------------------------------------------------------------------------
Запускаем на кномку пока не жмем.
Открываем 1.txt в текстовом редакторе правим его ручками:
Аккуратно удаляем из него свойства формы, и заменяем свойства нужных компонентов.
Сохраняем и жмем кнопку.

Таким же образом можно переписать ф-ции для загрузки каждого в отдельности компонента решив проблему с "блыманием"...
Миниатюры
Переcоздание TForm  
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
09.05.2012, 23:02
Цитата Сообщение от Avazart Посмотреть сообщение
Открываем 1.txt в текстовом редакторе правим его ручками
ага, а на рисуночке правите Unit1.dfm в явном виде .
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.05.2012, 00:11
ага, а на рисуночке правите Unit1.dmf в явном виде
Я только показал что надо править.А вообще можно напрямую от туда копирнуть в txt-файл и там править
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.05.2012, 00:11

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
73
Ответ Создать тему
Новые блоги и статьи
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
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 и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru