Дублирование компонентов и их потомков во время выполнения приложения 2
Автор: Xavier
Три подруги: одна вышла замуж за сотрудника компании IBM, вторая за сотрудника компании APPALE, третья за сотрудника Microsoft... После первой брачной ночи расказывают:
Первая: Класс.. Такая надежность, такая устойчивость, такое время наработки на отказ...
Вторая: Кайф просто... Такой дружественный интерфейс, такая совместимость, такая производительность...
Третья: А мой всю ночь расказывал как это будет хорошо...
interfaceuses
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;
beginif C1.ClassType <> C2.ClassType thenraise EComponentError.Create('Типы объектов не совместимы');
if C1 is TWinControl then
TWinControl(C2).Parent := TWinControl(C1).Parent;
S := TMemoryStream.Create; { создаем поток для работы с памятью }with S dobegin
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{ Если BitBtn1 уже существует }
TComponent(BitBtn) := Replicator(BitBtn1);
end;
Статья Дублирование компонентов и их потомков во время выполнения приложения 2 раздела Компоненты и Классы RTTI может быть полезна для разработчиков на Delphi и FreePascal.
Комментарии и вопросы
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.