5

パネルの親をフレームに設定するなど、ランタイム フレームを作成し、既存のパネルを追加することは可能ですか? 追加したら、フレームを複製して使用しますか?

お気に入り:

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

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

次に、fを複製しますか?可能でしたか?どうやって?または他の提案はありますか?e

4

3 に答える 3

5

複製することでこれを解決するとは思わない。必要なのは、次のような関数です。

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;
于 2010-12-09T14:13:21.607 に答える
3

すべてのコントロールには親と所有者があることを覚えておく必要があります。所有者は可能nilですが、コードを使用してこれらのコントロールを解放する必要があるため、ほとんどのコントロールは他のコンポーネントによって所有されています。

したがって、所有者が破壊されると、パネルも破壊されます。そして、パネルがデザインタイムに作成された場合、それはそれが存在するフォームによって所有されます!

そのフォームを破壊すると、パネルが破壊されます。

ただし、実行時にパネルを作成しApplication、フォームではなく所有者として設定すると、複数のフォームやフレームに移動できます。

しかし、それは良いデザインパターンですか?あなたが何をしようとしているのかわかりませんが、それはおそらく悪い考えです!

一般に、設計時にフレーム全体をパネルで設計する方が実用的です。次に、別のパネルまたはコントロールからデータをコピーしてフレームを作成できるコードを追加します。それはより良いデザインパターンでしょう...

于 2010-12-10T08:45:34.900 に答える
1

最初のフレーム(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に保存された情報を取得します(このオプションはテストしていません)。

よろしく。

于 2010-12-10T09:15:13.857 に答える