문제

사용자 조치, 데이터 검증 등에 따라 여러 동적 TPANEL이 생성되고 (및 Pnlmain이 부모 임) TPANEL 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