Delphi5에서 TPANEL의 정확한 사본을 만듭니다
-
11-09-2019 - |
문제
사용자 조치, 데이터 검증 등에 따라 여러 동적 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
루틴.