Nahum If you need to copy the internals of an object then it would reflect badly on your objects design wouldn't it?
Neven ----- Original Message ----- From: "Nahum Wild" <[EMAIL PROTECTED]> To: "Multiple recipients of list delphi" <[EMAIL PROTECTED]> Sent: Friday, October 04, 2002 2:02 PM 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/