Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.11;
Скачать: CL | DM;

Вниз

Как скопировать дочернюю форму?   Найти похожие ветки 

 
Faraday   (2005-06-15 16:47) [0]

Суть такая: создаю дочернюю форму. На каком-то этапе хочу ее запомнить целиком. Потом закрываю и убиваю форму. Хочу снова ее создать в том виде, как ее запомнил.
Например что-типа такого:
var SaveForm:TfmForm1;
         Forma:TfmForm1;
//------------
//первый раз создаю форму
Forma := TfmForm1.Create(Application);
//запоминаю ее
SaveForm:=Forma;
Forma.ShowModal;
Forma.Free; //убиваю
//второй раз хочу показать сохраненную
Forma:=SaveForm;
Forma.ShowModal;
Forma.Free;

Вообщем, что-типа такого. Ну как не пробовал одни ошибки. Кто научит уму-разуму?


 
Jeer ©   (2005-06-15 16:50) [1]

Бред.

А второй раз так не пробовал ?
Forma := TfmForm1.Create(Application);


 
ferr ©   (2005-06-15 16:51) [2]

Зачем убивать?


 
Jeer ©   (2005-06-15 16:52) [3]

Наверное досаждает очень.


 
Юрий Зотов ©   (2005-06-15 17:16) [4]

> Faraday   (15.06.05 16:47)  

> //запоминаю ее
> SaveForm:=Forma;

Здесь запоминается ссылка на форму, а не сама форма. Сама же форма после Forma.Free существовать перестает и запомненная ссылка становится неверной (указывает "в никуда"). Поэтому при попытке работать с ней получаем ошибку.

Не надо убивать форму - просто прячьте и показывайте ее, когда нужно.


 
Digitman ©   (2005-06-15 18:08) [5]


> хочу ее запомнить целиком


форма - такой же равноправный объект, как и все прочие.

"уникальность" объекта определяется "уникальностью" совокупности его свойств.

отсюда вывод : чтобы сохранить/восстановить объект, нужно сохранить/восстановить его свойства


 
Faraday   (2005-06-16 07:15) [6]

В примере я написал ShowModal для простоты. На самом деле форма MDIChild и я ее просто создаю и показываю. Запоминать ее нужно для того, чтобы избежать ее создания при повторном открытии (много компонент и она долго создается). Поэтому второй раз Forma := TfmForm1.Create(Application) не хочу использовать.
Так как форма MDIChild, то спрятать я ее не могу, только свернуть. Следовательно, надо после первого создания формы ее где-то сохранить. С первым экземпляром может user делать что хочет, а при повторном открытии из памяти копировать ее копию.
Сейчас вроде понятней вопрос сформулировал.


> отсюда вывод : чтобы сохранить/восстановить объект, нужно
> сохранить/восстановить его свойства

Согласен, вопрос как?


 
Digitman ©   (2005-06-16 08:38) [7]


> Сейчас вроде понятней вопрос сформулировал


наоборот - еще больше мути поднял)


> второй раз Forma := TfmForm1.Create(Application) не хочу
> использовать


Да мало ли что ты не хочешь !
Ты уничтожил объект (доч.форму), и он более не существует.
Чтобы работать с объектом, его нужно сначала создать, так что без явного или неявного вызова  конструирующего метода класса этого объекта - хоть из штанов выпрыгни ! - никак не обойтись.


> Так как форма MDIChild, то спрятать я ее не могу, только
> свернуть


думаю, можно и спрятать, но не "в лоб" (Hide-метод и иже с ними), а прямыми вызовами WinAPI-ф-ций (это - к Игорю Шевченко)


> надо после первого создания формы ее где-то сохранить


пока она существует, не надо ее никуда сохранять
вот если ты уничтожишь объект формы с перспективой воссоздать ее позже (в том же виде, в каком форма была на момент уничтожения), то тогда да, есть резон сохранить где-то ее свойства для их последующего считывания и назначения вновь создаваемому тобой объекту-форме.

Но ! Этот вариант тебя , как ты говоришь , не устраивает по причине "долгого" создания объекта-формы. Поэтому нет резона заниматься сохранением/восстановлением свойств.


 
msguns ©   (2005-06-16 10:15) [8]

>Faraday   (16.06.05 07:15) [6]
>На самом деле форма MDIChild и я ее просто создаю и показываю. Запоминать ее нужно для того, чтобы избежать ее создания при повторном открытии (много компонент и она долго создается).

Если не секрет, а что за компоненты ? Если не визуальные, то, очевидно, имеет смысл вынести их в некий датамодуль, перманентно "живущий" в приложении, и экземпляры-"дочки" будут просто юзать их для своих нужд ?


 
Erik1 ©   (2005-06-16 11:06) [9]

Все ясно, у нас в проекте также делается. Надо фактически сделать форме Hide. Делается это так:
Это для активации.
procedure TBaseForm.ShowBase;
begin
 if Active then
   Show
 else
   Perform(CM_RECREATEWND, 0, 0);
 fActive := True;
 Windows.SetFocus(Handle);
end;

Это при закрытии.
procedure TBaseForm.DoClose(var Action: TCloseAction); //Sender: TObject;
begin
 CloseForm := True;
 FormClosing;
 if FormManager.FormClosed(Self) or not PreserveForm then
   Action := caFree;

 if Assigned(OnDeactivate) then
   OnDeactivate(Self);

 if Action <> caFree then
 begin
   Action := caNone;
   if Assigned(OnClose) then
     OnClose(Self, Action);
   DestroyHandle;
   Application.ControlDestroyed(Self);
 end;

 fActive := False;
 fCloseTime := DateTimeToTimeStamp(Sysutils.Time).Time;
 inherited;
 CloseForm := False;
end;
Свойство PreserveForm определяет как закрывать форму , с сохранением или полностью уничтожить. Разумеется при данной технологии необходим FormManager.


 
Faraday   (2005-06-16 13:25) [10]


> Если не секрет, а что за компоненты ?

Компоненты визуальные, но большинство создается в RunTime, поэтому небыстро (так как много).

> Надо фактически сделать форме Hide

Hide не спасет - если пользователь захочет открыть десять дочерних форм одновременно (а там должны быть разные данные)? То есть, я хочу в памяти держать уже созданную форму (но без открытых наборов данных) и каким-то путем (копированием? или наследованием?) делать ее копию - в копии отрывать нужные DataSetы и показывать пользователю.


 
Erik1 ©   (2005-06-16 16:51) [11]

Ты сам себе противоречиш, либо тебе надо сохранять даные либо нет! А об оптимизации можеш и сам подумать надо ли тебе закрывать все DataSet, осбожождать еще какието ресурсы. Здесь дают только идеи, а не пишут за тебя проект.


 
evvcom ©   (2005-06-16 16:59) [12]


> но большинство создается в RunTime, поэтому небыстро (так
> как много).

Даже те, которые понакиданы на форму в designtime, во время выполнения точно также создаются, только информация берется из ресурсов, поэтому "способ создания" здесь вряд ли влияет на скорость создания формы. Ищи причину в другом.


 
Юрий Зотов ©   (2005-06-21 13:21) [13]

> Faraday   (16.06.05 13:25) [10]

> я хочу в памяти держать уже созданную форму (но без открытых
> наборов данных) и каким-то путем (копированием? или
> наследованием?) делать ее копию...

Что касается изготовления копии формы путем наследования, то наследуются классы, а не их экземпляры. В связи с чем очень советую поглубже вникнуть в парадигму ООП.

А что касается изготовления копии формы путем ее копирования, то это не проблема, а в справке даже есть пример (см. TStream Read/WriteComponent). Но по скорости это то же самое, что и просто написать Create (потому что Create запускает точно тот же самый механизм) - в связи с чем так и остается непонятным, что же Вы все-таки хотите получить.


 
Faraday   (2005-06-21 15:57) [14]

Всем спасибо за ответы. Согласно советам я "глубже вник в ООП" и научился сохранять форму и компоненты в потоке, а потом восстанавливать их. Действительно, время чтения/восстановления из потока даже несколько больше (в отличие от справки я не преобразовывал в текстовый формат - работал напрямую с потоком), чем просто через Create. На rsdn.ru есть хорошая статья на эту тему -"Сериализация объектов стандартными средствами Delphi".



Страницы: 1 вся ветка

Текущий архив: 2005.07.11;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.059 c
1-1118261613
SniZ
2005-06-09 00:13
2005.07.11
Сжатие строки


8-1110900767
Adolf
2005-03-15 18:32
2005.07.11
написать текст на Image1


3-1117191709
ArtSam
2005-05-27 15:01
2005.07.11
DCOM, Socket. Помогите: как их настроить для обеспечения работы


6-1112839768
inew
2005-04-07 06:09
2005.07.11
Странная работа Indy SmtpServer.


14-1118085760
Gero
2005-06-06 23:22
2005.07.11
Ищу ветку