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

Вниз

Как скопировать 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2007.12.02;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.049 c
15-1193828749
Vadiiim
2007-10-31 14:05
2007.12.02
Preview форматов в Windows


15-1194132647
Multy
2007-11-04 02:30
2007.12.02
InterBase, Delphi 7.0 и Vista


3-1184791338
Dik59
2007-07-19 00:42
2007.12.02
Работа с длинным целым


8-1170501964
Совсем новичок
2007-02-03 14:26
2007.12.02
Оперделить угол поворота


2-1194508018
Nucer
2007-11-08 10:46
2007.12.02
TTimer





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский