Вопрос

У меня есть tpanel pnlmain, где создается несколько динамических Tpanels (и Pnlmain является их родителем) в соответствии с действиями пользователя, проверки данных и т. Д. Каждая панель содержит одну цветную сетку, полную строк. Помимо панелей, есть некоторые компоненты стрел с открытым исходным кодом и изображение. Целая куча вещей.

Теперь я хочу, чтобы пользователь мог распечатать эту панель (я спросил, как это сделать по этому вопросу), но перед печати, пользователь должен быть представлен с новой формой, содержащей копию 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