質問

ユーザーアクション、データ検証などに従って、いくつかの動的なtpanelが作成されている(およびpnlmainが親である)Tpanel pnlmainがあります。すべてのパネルには、文字列でいっぱいの1色のグリッドが含まれています。パネルとは別に、オープンソースの矢印コンポーネントと写真がいくつかあります。たくさんのもの。

今、私はユーザーにこのパネルを印刷できるようにしたい(私はそれをする方法を尋ねた この質問について)、しかし、印刷する前に、ユーザーにはpnlmainのコピーを含む新しいフォームを提示する必要があります。このフォームでは、ユーザーはいくつかの変更を行い、いくつかのコンポーネントを追加してから、pnlmainのカスタマイズされたコピーを印刷する必要があります。印刷後、ユーザーはこのフォームを閉じて、元のpnlmainで元のフォームに戻ります。そして - ご想像のとおり、元のpnlmainはそのままのままでなければなりません。

それで、Tpanel全体をコピーする賢い方法はありますか? pnlmain.controlsリストを介して手動で繰り返すことができることを知っています。

役に立ちましたか?

解決

子のコントロールを反復するようにベースのコードですが、とにかく悪くはありません;-)

procedure TForm1.btn1Click(Sender: TObject);

    function CloneComponent(AAncestor: TComponent): TComponent;
      var
        XMemoryStream: TMemoryStream;
        XTempName: string;
      begin
        Result:=nil;
        if not Assigned(AAncestor) then
          exit;
        XMemoryStream:=TMemoryStream.Create;
        try
          XTempName:=AAncestor.Name;
          AAncestor.Name:='clone_' + XTempName;
          XMemoryStream.WriteComponent(AAncestor);
          AAncestor.Name:=XTempName;
          XMemoryStream.Position:=0;
          Result:=TComponentClass(AAncestor.ClassType).Create(AAncestor.Owner);
          if AAncestor is TControl then TControl(Result).Parent:=TControl(AAncestor).Parent;
          XMemoryStream.ReadComponent(Result);
        finally
          XMemoryStream.Free;
        end;
      end;

    var
      aPanel: TPanel;
      Ctrl, Ctrl_: TComponent;
      i: integer;
    begin
      //handle the Control (here Panel1) itself first
      TComponent(aPanel) := CloneComponent(pnl1);
      with aPanel do
      begin
        Left := 400;
        Top := 80;
      end;

      //now handle the childcontrols
      for i:= 0 to pnl1.ControlCount-1 do begin
        Ctrl := TComponent(pnl1.Controls[i]);
        Ctrl_ := CloneComponent(Ctrl);
        TControl(Ctrl_).Parent := aPanel;
        TControl(Ctrl_).Left := TControl(Ctrl).Left;
        TControl(Ctrl_).top := TControl(Ctrl).top;
      end;
    end;

からのコード delphi3000 論文

他のヒント

コードが多すぎる... ObjectBinaryTotextとObjectTextTobinaryストリーミングを使用してうまく機能します。 Delphi 7にはコードの例があり、2009年(または2006年、見たことのないことを知らない)はまだわかりません。これらの機能のD5ヘルプファイルを参照してください(ここではD5を利用できません)。

RTTIを使用してすべてのプロパティをコピーして行います。すべてのコントロールを繰り返す必要がありますが、プロパティ値を設定する必要がある場合、RTTIはプロセスの自動化に役立ちます。底に向かって例を挙げることができます この記事, 、あるヘルパーコードへのリンクがあります。 CopyObject ルーティーン。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top