Показать сообщение отдельно
  #2  
Старый 14.04.2013, 23:50
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от 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;
}
стрингрид нормально копируется на другую форму, вместе с ячейками и настройками.
Ответить с цитированием