[Lazarus] How to clone a component
patspiper at gmail.com
Thu Oct 4 14:08:31 CEST 2012
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:
>>>> What is the correct way to clone programmatically a component, ie
>>>> all its properties to another component of the same class (like the
>>>> designer's copy/paste)?
>>>> The code below used to work in Delphi but does not with Lazarus
>>>> is nil).
>>>> 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.
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
More information about the Lazarus