[Lazarus] How to clone a component
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
Are you sure that Delphi SetComponent writes events?
More information about the Lazarus