Форум: "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.041 c