patspiper wrote 30 lines
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 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.
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
Stephano