Дублирование компонентов и их потомков во время выполнения приложения 2
Автор: Xavier |
Три подруги: одна вышла замуж за сотрудника компании IBM, вторая за сотрудника компании APPALE, третья за сотрудника Microsoft... После первой брачной ночи расказывают: Первая: Класс.. Такая надежность, такая устойчивость, такое время наработки на отказ... Вторая: Кайф просто... Такой дружественный интерфейс, такая совместимость, такая производительность... Третья: А мой всю ночь расказывал как это будет хорошо... |
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 { Если BitBtn1 уже существует } TComponent(BitBtn) := Replicator(BitBtn1); end; |
Далее: Жизнь и смерть в режиме run-time »»