Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.033 c
1-1119431432
Darkwing
2005-06-22 13:10
2005.07.11
Создание файла больше 4 ГБ.


14-1118557681
Fl@sh
2005-06-12 10:28
2005.07.11
UserGate &amp; VPN


14-1118079262
Cheater
2005-06-06 21:34
2005.07.11
Как сделать такую вещь в Excel?


14-1118295615
Ega23
2005-06-09 09:40
2005.07.11
А куда дни рождения делись?


9-1111325628
Ландграф Павел
2005-03-20 16:33
2005.07.11
Предложение сделать вместе игру





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский