Создатькопиюобъектав Delphi оченьпросто. Конвертируемобъектвтекст, азатем - обратно. Приэтомбудутпродублированывсесвойства, кромессылокнаобработчикисобытий. Дляпреобразованиякомпонентавфайлиобратнонампонадобятсяфункциипотоков WriteComponent(TComponent) и ReadComponent(TComponent). Приэтомвпотокзаписываетсядвоичныйресурс. Последнийспомощьюфункции ObjectBinaryToText можнопреобразоватьвтекст.
Создадимнаихосновефункциипреобразования:
Code: |
function ComponentToString(Component: TComponent): string; var ms: TMemoryStream; ss: TStringStream; begin ss := TStringStream.Create(' '); ms := TMemoryStream.Create; try ms.WriteComponent(Component); ms.position := 0; ObjectBinaryToText(ms, ss); ss.position := 0; Result := ss.DataString; finally ms.Free; ss.free; end; end;
procedure StringToComponent(Component: TComponent; Value: string); var StrStream:TStringStream; ms: TMemoryStream; begin StrStream := TStringStream.Create(Value); try ms := TMemoryStream.Create; try ObjectTextToBinary(StrStream, ms); ms.position := 0; ms.ReadComponent(Component); finally ms.Free; end; finally StrStream.Free; end; end; |
Спомощьюпарыэтихфункциймыможемпреобразоватьлюбойкомпонентвтекст, азатемпроинициализироватьдругойкомпоненттогожеклассаэтимиданными.
Нижеприведенресурсформысоднойкнопкойитекстобработчиканажатиянаэтукнопку.
Code: |
object Form1: TForm1 Left = 262 Top = 129 Width = 525 Height = 153 Caption = 'Form1' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False Scaled = False PixelsPerInch = 96 TextHeight = 13 object Button1: TButton Left = 16 Top = 32 Width = 57 Height = 49 Caption = 'Caption' TabOrder = 0 OnClick = Button1Click end end
procedure TForm1.Button1Click(Sender: TObject); var Button: TButton; OldName: string; begin Button := TButton.Create(self);
//...сохраняем имя компонента OldName := (Sender as TButton).Name;
//...стираем имя компонента, чтобы избежать конфликта имен. //...После этого Button1 станет = nil. (Sender as TButton).Name := '';
//...преобразуем в текст и обратно StringToComponent( Button, ComponentToString(Sender as TButton) );
//...дадим компоненту уникальное(?) имя Button.Name := 'Button' + IntToStr(random(1000));
//...вернем исходному компоненту имя. //...После этого Button1 станет снова указывать на объект. (Sender as TButton).Name := OldName;
//...размещаем новую кнопку справа от исходной Button.parent := self; Button1.Tag := Button1.Tag + 1; Button.Left := Button.Left + Button.Width * Button1.Tag + 1; end; |
Приведенныйметоднедублируетуказателинаобработчикисобытий. Однако, еслитакимобразомдублироватьформы, товседочерниекомпонентыивсеобработчикисохранятся.
составлениестатьи: АндрейЧудин, ЦПРТДБиблио-Глобус
Взято из https://delphi.chertenok
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!