Цитата:
Сообщение от Uniq!
Есть PageControl на нём cxGrid с вьюхой...Как скопировать Его вьюху, вместе с данными и настройками в другой cxGrid лежащий на другой форме.?
|
Не понял, что такое вьюха, да и компонентов таких, cxGrid у меня нет,

но вот есть юнит с функцой, которая копирует компонент туда, где новый владелец
Код:
unit DupCmp;
interface
uses Classes, SysUtils, Controls;
function DuplicateComponents(AComponent, NewOwner, NewParent
: TComponent): TComponent;
procedure RegisterComponentClasses(AComponent: TComponent);
implementation
type
TDuplicator = class(TObject)
private
FResult: TComponent;
procedure OnRead(Cmp: TComponent);
procedure OnSetName(Reader: TReader; Cmp: TComponent; var Name: string);
procedure WriteComponents(Stream: TStream; Root: TComponent);
procedure ReadComponents(Stream: TStream; Owner, Parent: TComponent);
public
function Duplicate(Cmp, Owner, Parent: TComponent): TComponent;
end;
{ TDuplicator }
procedure TDuplicator.OnRead(Cmp: TComponent);
begin
FResult:= Cmp;
end;
procedure TDuplicator.OnSetName(Reader:TReader;Cmp:TComponent;var Name:string);
var
i: integer;
Tmp: string;
begin
i:= 0;
Tmp:= Name;
while Cmp.Owner.FindComponent(Name) <> nil do
begin
Inc(i);
Name:= Tmp + IntToStr(i);
end;
end;
procedure TDuplicator.WriteComponents(Stream: TStream; Root: TComponent);
var
Writer: TWriter;
begin
Writer:= TWriter.Create(Stream, 4096);
try
Writer.Root:= Root.Owner;
Writer.WriteSignature;
Writer.WriteComponent(Root);
Writer.WriteListEnd;
finally
Writer.Free;
end;
end;
procedure TDuplicator.ReadComponents(Stream:TStream;Owner, Parent: TComponent);
var
Reader: TReader;
begin
Reader:= TReader.Create(Stream, 4096);
try
Reader.OnSetName:= OnSetName;
Reader.ReadComponents(Owner, Parent, OnRead);
finally
Reader.Free;
end;
end;
function TDuplicator.Duplicate(Cmp,Owner,Parent:TComponent): TComponent;
var
Stream: TMemoryStream;
begin
FResult:= nil;
RegisterComponentClasses(Cmp);
Stream:= TMemoryStream.Create;
try
WriteComponents(Stream, Cmp);
Stream.Position:= 0;
ReadComponents(Stream, Owner, Parent);
finally
Stream.Free;
end;
Result:= FResult;
end;
procedure RegisterComponentClasses(AComponent: TComponent);
var
i: integer;
begin
RegisterClass(TPersistentClass(AComponent.ClassType));
if AComponent is TWinControl then
for i := 0 to TWinControl(AComponent).ControlCount - 1 do
RegisterComponentClasses(TWinControl(AComponent).Controls[i]);
end;
function DuplicateComponents(AComponent, NewOwner, NewParent:
TComponent): TComponent;
begin
with TDuplicator.Create do
try
Result:= Duplicate(AComponent, NewOwner, NewParent);
finally
Free;
end;
end;
end.
Пример использования
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
DuplicateComponents(cxGrid1, Form2.PageControl, nil); // дублируем cxGrid
end;
}
стрингрид нормально копируется на другую форму, вместе с ячейками и настройками.