Создайте точную копию Tpanel на Delphi5
-
11-09-2019 - |
Вопрос
У меня есть 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
рутина.