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

Вниз

Как скопировать Instance формы?   Найти похожие ветки 

 
Alek Arbuzov   (2007-05-21 13:46) [0]

создана форма определенным с набором свойств (как вариант, и дочерних компонентов). Как скопировать ее и сделать так, чтобы копия работала независимо от оригинала? Ожидаю увидеть на экране 2 одинаковых окна, которые сохраняются в памяти и работают независимо друг от друга.

наугад попробовал:

procedure TestProc();
var
 Source, Dest: TForm;
 pSrc:  ^TForm;
 pDest: ^TForm;
 FormSize: integer;
begin
 Source := TForm.Create(nil);
 Source.SetBounds(10,10,200,200);
 Source.Caption := "Source";
 Source.Show();

 FormSize := Source.InstanceSize;
 pDest := GetMemory(FormSize);
 pSrc := @Source;

 Dest := pDest^;
 Dest.SetBounds(300,300,200,200);
 Dest.Caption := "Destination";
 Dest.show();
end;


в результате на экране одна форма с координатами Dest и названием "Destination"


 
Alek Arbuzov   (2007-05-21 13:49) [1]

заранее спасибо за проявленное внимание!


 
Сергей М. ©   (2007-05-21 13:51) [2]


> Как скопировать ее


function CloneForm(Original: TMyForm): TMyForm;
begin
 Result := TMyForm.Create(Original.Owner);
 Result.Assign(Original);
end;


 
Alek Arbuzov   (2007-05-21 14:01) [3]

тоже пробовал. В результате ошибка "Cannot assign class TForm to a class TForm"


 
Alek Arbuzov   (2007-05-21 14:03) [4]

пробовал так же Assign для других типов. Создалось впечатление, что эта процедура вообще не работает для визуальных компонентов


 
Сергей М. ©   (2007-05-21 14:04) [5]


> Alek Arbuzov   (21.05.07 14:01) [3]


Ты должен в своем классе TMyForm перекрыть виртуальный метод AssignTo, в котором собственно и следует копировать нужные свойства.


 
Alek Arbuzov   (2007-05-21 14:08) [6]

собственно, это и есть проблема.. На форме в процессе работы могут создаваться дочерние компоненты со своими наборами свойств.
Какие и сколько, заранее неизвестно.
Нет ли какого-то штатного метода запомнить форму без ручного описания свойств самой формы и всех компонентов на ней?


 
Сергей М. ©   (2007-05-21 14:13) [7]


> Какие и сколько, заранее неизвестно


Как это неизвестно ? Сам же их понасоздавал, а какие и сколько при этом не знаешь  ?)

"Так не бывает - тут помню, а тут не помню" (с)


> Нет ли какого-то штатного метода запомнить форму без ручного
> описания свойств самой формы и всех компонентов на ней?


Есть.
Но в части "клонируемых" свойст он ограничен только published-свойствами.


 
Alek Arbuzov   (2007-05-21 14:14) [8]

суть задачи заключается в том, чтобы можно было, создав и проинициализировав  форму(Source), сохранить ее копию(Dest). При необходимости повторного использования формы, можно просто взять Dest(или опять же его копию), что избавляет от процесса повторного создания и инициализации.


 
Сергей М. ©   (2007-05-21 14:19) [9]


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


Какой формы-то ? Оригинала или ее клона ? Куда исчезает оригинал после создания его клона и почему нельзя обойтись без клонирования, не разрушая  оригинал и используя его повтороно в любой момент времени ?


 
Alek Arbuzov   (2007-05-21 14:19) [10]

ручная запись и воспроизведение свойств фактически означает ту же инициализацию. Смысл пропадает..


> Есть.
> Но в части "клонируемых" свойст он ограничен только published-
> свойствами.

пожалуйста, подскажите как. С помощью RTTI? (Instance.ClassInfo)?


 
Alek Arbuzov   (2007-05-21 14:23) [11]


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

форма-оригинал после использования может отличаться от только что созданной (например, в поля введены данные). Мне же нужна чистая форма, такая как сразу после создания и инициализации


 
Сергей М. ©   (2007-05-21 14:23) [12]


> Alek Arbuzov   (21.05.07 14:19) [10]


> С помощью RTTI?


Да.

function CloneForm(Original: TMyForm): TMyForm;
var
 ms: TStream;
begin
 ms := TMemoryStream.Create;
 try
   ms.WriteComponent(Original);
   ms.Position := 0;
   Result := TMyForm.Create(Original.Owner);
   ms.ReadComponent(Result);
 finally
   ms.Free;
 end;
end;


 
Alek Arbuzov   (2007-05-21 14:25) [13]

понял, спасибо



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

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

Наверх




Память: 0.49 MB
Время: 0.023 c
2-1194433943
LexXL
2007-11-07 14:12
2007.12.02
вписать картинку в квадрат


15-1194017562
TUser
2007-11-02 18:32
2007.12.02
Посоветйте принтер


15-1193483482
Alkid
2007-10-27 15:11
2007.12.02
Plz. Help : DSL-200 + WinXP 64 + AMD 64


15-1193687653
Udaff
2007-10-29 22:54
2007.12.02
Обновление драйвера монитора (вин хп)


15-1193663181
Jeer
2007-10-29 16:06
2007.12.02
Эфемерный E2k