Everyone seems to be saying that Delphi doesn't have built in cloning.
This is not quite true. The standard way is to override Assign, or
AssignTo method derived inside TPersistent. All you need to do is
override this in each sub-class. There are many dozens of examples
through the VCL code. If you aren't subclassing from Tpersistent then I
can only wonder why.

k

-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]] On
Behalf Of Nahum Wild
Sent: Friday, 4 October 2002 2:02 p.m.
To: Multiple recipients of list delphi
Subject: RE: [DUG]: Copying an Object


The only problem here being that just the published properties will be
cloned, no internal state variables.

Nahum.

> [EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>
> wrote on
>
>> The term for this is "cloning" an object.
>>
>> There is no built in way of doing this in Delphi, and there are 
>> issues involved in any cloning operation; e.g. are you interested in 
>> a shallow clone (just the one object), or a deep clone (your one 
>> object, and all objects to which it refers)?
>>
>> Probably a google newsgroup search on Delphi+cloning+objects might 
>> give you a few ideas on how to progress...
>
> If your object inherits from TComponent the following code will clone 
> a component. I have used it to clone TButtons and few other simple 
> visual components successfully.
>
>
> unit Cloner;
>
> interface
>
> uses
>   SysUtils, Classes, Controls;
>
> function Replicate(C: TComponent): TComponent;
>
> implementation
>
> procedure CloneComponent(C1: TComponent; C2: TComponent); // // This 
> procedure clones the properties of C1 and writes them to C2. // C1 and

> C2 must be of the same type.  Use it for components that do // not 
> have an Assign method. // var
>   theStream: TMemoryStream;
>   tmpS:      string;
> begin
>   if C1.ClassType <> C2.ClassType then
>     raise EComponentError.Create('Object types are incompatible');
>
>   if C1 is TControl then
>     TControl(C2).Parent := TWinControl(C1).Parent;
>
>   theStream := TMemoryStream.Create; // Create the memory stream.
>
>   with theStream do try
>     tmpS    := C1.Name;
>     C1.Name := EmptyStr;
>     WriteComponent(C1);        // Write C1 properties to stream
>     C1.Name := tmpS; Seek(0, soFromBeginning);  // Position to
>     beginning of stream. ReadComponent(C2);         // read
>     properties from stream into C2   finally Free;
> // IAC, free stream.   end; end;
>
> function Replicate(C: TComponent): TComponent;
> //
> // This function "replicates" component C and returns
> // a new component whose type and properties match
> // those of C.
> //
> begin
>   Result := TComponentClass(C.ClassType).Create(C.Owner); // Create
>   component } CloneComponent(C, Result);
> // Clone it } end;
>
> end.
>
> --------------------------------------------------------------
> -------------
>     New Zealand Delphi Users group - Delphi List - 
> [EMAIL PROTECTED]
>                   Website: http://www.delphi.org.nz
> To UnSub, send email to: [EMAIL PROTECTED]
> with body of "unsubscribe delphi"
> Web Archive at: http://www.mail-archive.com/delphi%40delphi.org.nz/


------------------------------------------------------------------------
---
    New Zealand Delphi Users group - Delphi List - [EMAIL PROTECTED]
                  Website: http://www.delphi.org.nz
To UnSub, send email to: [EMAIL PROTECTED] 
with body of "unsubscribe delphi"
Web Archive at: http://www.mail-archive.com/delphi%40delphi.org.nz/

---------------------------------------------------------------------------
    New Zealand Delphi Users group - Delphi List - [EMAIL PROTECTED]
                  Website: http://www.delphi.org.nz
To UnSub, send email to: [EMAIL PROTECTED] 
with body of "unsubscribe delphi"
Web Archive at: http://www.mail-archive.com/delphi%40delphi.org.nz/

Reply via email to