Текущий архив: 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.49 MB
Время: 0.054 c