パネルの親をフレームに設定するなど、ランタイム フレームを作成し、既存のパネルを追加することは可能ですか? 追加したら、フレームを複製して使用しますか?
お気に入り:
f:= Tframe. create(..)
...
panel3.parent = f; //where panel3 has many controls.
次に、fを複製しますか?可能でしたか?どうやって?または他の提案はありますか?e
複製することでこれを解決するとは思わない。必要なのは、次のような関数です。
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;
すべてのコントロールには親と所有者があることを覚えておく必要があります。所有者は可能nil
ですが、コードを使用してこれらのコントロールを解放する必要があるため、ほとんどのコントロールは他のコンポーネントによって所有されています。
したがって、所有者が破壊されると、パネルも破壊されます。そして、パネルがデザインタイムに作成された場合、それはそれが存在するフォームによって所有されます!
そのフォームを破壊すると、パネルが破壊されます。
ただし、実行時にパネルを作成しApplication
、フォームではなく所有者として設定すると、複数のフォームやフレームに移動できます。
しかし、それは良いデザインパターンですか?あなたが何をしようとしているのかわかりませんが、それはおそらく悪い考えです!
一般に、設計時にフレーム全体をパネルで設計する方が実用的です。次に、別のパネルまたはコントロールからデータをコピーしてフレームを作成できるコードを追加します。それはより良いデザインパターンでしょう...
最初のフレーム(FRAME1)の作成に使用したのと同じコードを使用して、新しいフレーム(FRAME2)を作成する必要があります。その後、FRAME2のFRAME1内に含まれる(実行時に作成される)すべてのコンポーネントを作成する必要があります。
これには、次を使用します。
for i := 0 to (FRAME1.ComponentCount - 1) do
...
cmp := TComponent(FRAME1.Component[i]);
... create cmp on Frame2
2番目の方法を試すことができます。TMemoryStream(SaveComponent)を使用してFRAME1を保存し、後で新しいフレームを作成して、Streamに保存された情報を取得します(このオプションはテストしていません)。
よろしく。