Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как скопировать Instance формы? [D7, WinXP]


Alek Arbuzov ©   (2007-05-21 13:46:00) 

создана форма определенным с набором свойств (как вариант, и дочерних компонентов). Как скопировать ее и сделать так, чтобы копия работала независимо от оригинала? Ожидаю увидеть на экране 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 14:25:00) [1]

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


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


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

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


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


> 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;


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


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


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


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

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


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

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


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

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


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


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


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

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


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


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


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

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


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


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


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


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

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


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

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


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


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


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


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо