Идёт загрузка страницы...

htp://aptem.net.ru





/|\АРТЕМ.NET.RU /|\ - Портал для программистов и не только: Delphi Visual Basic BORLAND С++ PERL PHP HTML

Дублирование компонентов и их потомков во время выполнения приложения II

Модуль, клонирующий компонент:

-------------------------------------------------------- модуль Clone;


    interface

uses

SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls, Grids, DBGrids, DB, DBTables, Outline;

function Replicator(C: TComponent): TComponent;

implementation

{ Следующая процедура "клонирует" свойства C1 и записывает их в C2.
C1 и C2 должны иметь один и тот же тип. Используйте данный метод для компонентов, не имеющих метода Assign. }

procedure CloneComponent(C1: TComponent; C2: TComponent);
var
S: TMemoryStream;
begin
if C1.ClassType <> C2.ClassType then
raise EComponentError.Create('Типы объектов не совместимы');
if C1 is TWinControl then
TWinControl(C2).Parent := TWinControl(C1).Parent;
S := TMemoryStream.Create;   { создаем поток для работы с памятью }
with S do begin
WriteComponent(C1);         { пишем свойства C1 в поток }
Seek(0, 0);                 { перемещаемся в начало потока }
ReadComponent(C2);          { читаем свойства из потока в C2 }
Free;                       { освобождаем поток }
end;
end;


{ Следующая функция "реплицирует" компонент C и возвращает новый компонент типа и со свойствами компонента C. }

function Replicator(C: TComponent): TComponent;
begin
Result := TComponentClass(C.ClassType).Create(C.Owner);  { создаем компонент }
CloneComponent(C, Result);                               { клонируем его }
end;

end.

Вот как это использовать это:


   
var
BitBtn: TBitBtn;
begin
TComponent(BitBtn) := Replicator(BitBtn1);  { Если BitBtn1 уже существует }
end;

-- Xavier [000644]