создать Tframes во время выполнения: - PullRequest
5 голосов
/ 09 декабря 2010

Можно ли создать фрейм во время выполнения и добавить существующие панели, например, установить родительский элемент для фрейма?и когда он добавлен, дублируйте кадр и используйте его?

вроде:

f:= Tframe. create(..)
...

panel3.parent = f; //where panel3 has many controls.

затем дублируйте f?это было возможно?как?или любой другой suggerstion?е

Ответы [ 3 ]

5 голосов
/ 09 декабря 2010

Не думаю, что вы решите это путем дублирования.Вам нужна такая функция:

function CreateFrameAndHostPanel(Owner: TComponent; Parent: TWinControl; Panel: TPanel): TFrame;
begin
  Result := TFrame.Create(Owner);
  Try
    Result.Parent := Parent;
    Panel.Parent := Result;
  Except
    FreeAndNil(Result);
    raise;  
  End;
end;
3 голосов
/ 10 декабря 2010

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

Таким образом, если владелец будет уничтожен, панель также будет уничтожена. И если панель была создана во время разработки, то она принадлежит той форме, в которой она находится!

Уничтожение этой формы разрушит панель!

Но если вы создаете панели во время выполнения и устанавливаете Application как владельца вместо формы, их можно перемещать по нескольким формам и фреймам.

Но это хороший шаблон дизайна? Я не знаю, что вы пытаетесь сделать, но, скорее всего, это плохая идея!

В целом, было бы более практично проектировать весь каркас с панелями во время разработки. Затем добавьте некоторый код, который позволит создавать кадр путем копирования данных из другой панели или элемента управления. Это был бы лучший шаблон дизайна ...

1 голос
/ 10 декабря 2010

Вы должны создать новый фрейм (FRAME2) с тем же кодом, который вы использовали для создания первого (FRAME1); И позже вы должны создать все компоненты, включенные (созданные во время выполнения) внутри FRAME1 на FRAME2.

Для этого используйте:

for i := 0 to (FRAME1.ComponentCount - 1) do 
  ...
  cmp := TComponent(FRAME1.Component[i]);
  ... create cmp  on Frame2

Вы можете попробовать второй вариант; Сохраните FRAME1, используя TMemoryStream (SaveComponent), а затем создайте новый фрейм и извлеките сохраненную информацию в Stream (у меня нет этой опции)

С уважением.

...