Главная страница
    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.101 c
3-1185457647
Квэнди
2007-07-26 17:47
2007.12.02
Триггер в MySql


1-1189438405
rar
2007-09-10 19:33
2007.12.02
MainMenu


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


15-1193713218
Slider007
2007-10-30 06:00
2007.12.02
С днем рождения ! 30 октября 2007 вторник


2-1194417497
F@T@L_Err0r
2007-11-07 09:38
2007.12.02
TChart





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