Дублирование компонентов и их потомков во время выполнения приложения 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]