[Lazarus] How to clone a component

Mattias Gaertner nc-gaertnma at netcologne.de
Fri Oct 5 08:46:39 CEST 2012


On Thu, 04 Oct 2012 15:08:31 +0300
patspiper <patspiper at gmail.com> wrote:

> On 04/10/12 10:45, patspiper wrote:
> > On 04/10/12 09:57, patspiper wrote:
> >> On 04/10/12 09:19, Mattias Gaertner wrote:
> >>> On Thu, 04 Oct 2012 00:33:07 +0300
> >>> patspiper <patspiper at gmail.com> wrote:
> >>>
> >>>> Hi,
> >>>>
> >>>> What is the correct way to clone programmatically a component, ie 
> >>>> assign
> >>>> all its properties to another component of the same class (like the 
> >>>> IDE
> >>>> designer's copy/paste)?
> >>>>
> >>>> The code below used to work in Delphi but does not with Lazarus 
> >>>> (result
> >>>> is nil).
> >>>>       RegisterClass(TMyComponent);
> >>>>       Clipboard.SetComponent(MyComponent);
> >>>>       Result:= TMyComponent(Clipboard.GetComponent(Self, Self));
> >>> It should work in Lazarus too.
> >> It does not. It seems due to the fact that TClipboard.GetComponent 
> >> uses pcfComponent while TClipboard.SetComponent uses pcfCustomData 
> >> instead. Substituting pcfCustomData by pcfComponent did the job, but 
> >> then the copied (original) component seems to lose its events. I will 
> >> test further and report.
> > The copied (original) component's events are fine. However, it is the 
> > clone's events which are not as desired. Its methods code+data are 
> > equal to the original component's methods code+data whereas the data 
> > part should point to the clone itself for proper operation of the 
> > clone. Any ideas on how this should be handled?
> 
> I have gathered the following presumed bugs:
> 
> 1- TClipboard.GetComponent uses pcfComponent while 
> TClipboard.SetComponent uses pcfCustomData instead.

Please report this bug.

 
> 2- Clipboard.SetComponent/GetComponent do not save/restore events. 
> Events are nil. This is the clipboard text of a button with an assigned 
> OnClick event (note the missing OnClick):
> object Button1: TButton
>    Left = 24
>    Height = 25
>    Top = 16
>    Width = 139
>    Caption = 'Button1'
>    Font.Height = -20
>    Font.Name = 'Sans'
>    ParentFont = False
>    TabOrder = 0
> end

Are you sure that Delphi SetComponent writes events?

Mattias




More information about the Lazarus mailing list