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 <[email protected]> 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

--
_______________________________________________
Lazarus mailing list
[email protected]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus

Reply via email to