Главная страница
    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.47 MB
Время: 0.044 c
15-1193772030
Михаил5
2007-10-30 22:20
2007.12.02
Подскажите разводку кросс-кабеля


2-1194603858
alsov
2007-11-09 13:24
2007.12.02
Почему StrToFloat обрезает строку?


2-1194608983
DimOk
2007-11-09 14:49
2007.12.02
GetActiveOLEObject касательно v77.application


15-1193785860
Германн
2007-10-31 02:11
2007.12.02
Directory is busy


15-1193838867
pathfinder
2007-10-31 16:54
2007.12.02
Создание справки.





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