Недавно добавленные исходники

•  DeLiKaTeS Tetris (Тетрис)  4 832

•  TDictionary Custom Sort  6 826

•  Fast Watermark Sources  6 606

•  3D Designer  9 570

•  Sik Screen Capture  6 946

•  Patch Maker  7 392

•  Айболит (remote control)  7 342

•  ListBox Drag & Drop  6 199

•  Доска для игры Реверси  98 189

•  Графические эффекты  7 514

•  Рисование по маске  6 797

•  Перетаскивание изображений  5 652

•  Canvas Drawing  6 031

•  Рисование Луны  5 821

•  Поворот изображения  5 272

•  Рисование стержней  3 865

•  Paint on Shape  3 019

•  Генератор кроссвордов  3 976

•  Головоломка Paletto  3 152

•  Теорема Монжа об окружностях  3 990

•  Пазл Numbrix  2 635

•  Заборы и коммивояжеры  3 446

•  Игра HIP  2 361

•  Игра Go (Го)  2 278

•  Симулятор лифта  2 676

•  Программа укладки плитки  2 236

•  Генератор лабиринта  2 792

•  Проверка числового ввода  2 399

•  HEX View  2 733

•  Физический маятник  2 424

 
скрыть

Delphi Sources

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





Похожие по теме исходники

Очередность выполнения процессов