Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Object clonen? (https://www.delphipraxis.net/27450-object-clonen.html)

Phoenix 10. Aug 2004 14:13


Object clonen?
 
Hi,

folgendes Problem: ich habe ein Handvoll Listen (TCollection mit etlichen TCollectionItems, ggf. sogar selber wieder weitere TCollections darunter).

Darüber wird ein Baum aufgebaut, der Objekte repräsentiert (Eine Collection an Objekten, jedes Objekt besitzt eine Collection an Eigenschaften und an Methoden).

Nun will ich ein Objekt (mit allen abhängigen Eigenschaften und Methoden) duplizieren. Mit AssignTo kann ich ja nicht auf private Eigenschaften des Zielobjektes zugreifen. Auch wenn ich ein neues Objekt erzeuge kann ich ja nicht auf dessen private members, die ich aber auch kopieren muss. Und public machen will / sollte ich nicht.

Und vor allem: wie behandle ich abhängige Listen?

Wie mache ich das am geschicktesten und am generischsten (was für ein Wort :gruebel:)?

Bernhard Geyer 10. Aug 2004 14:21

Re: Object clonen?
 
Generisch gar nicht. Du must für jede deiner Klassen (auch bei TCollectionItems) eine neue Version der Assign/AssignTo-Methode schreiben (Dort kannst Du ja auch auf die private-Member zugreifen) und dann von unterer Ebene beginnen diese Assign-Methode so zu füllen das alles kopiert wird.

für die Liste mußt Du eine Schleife der folgenden Art implementieren:
Delphi-Quellcode:
procedure TMyList.Assign(Source: TMyList);
var
  i: Integer;
  CloneItem: TMyCollectionItem;
begin
  for i := 0 to Length-1
  begin
    CloneItem := TMyCollectionItem.Create;
    CloneItem.Assign(Source.Items[i]);
    Add(CloneItem);
  end;
end;

Phoenix 10. Aug 2004 14:24

Re: Object clonen?
 
Zitat:

Zitat von Bernhard Geyer
Generisch gar nicht. Du must für jede deiner Klassen (auch bei TCollectionItems) eine neue Version der Assign/AssignTo-Methode schreiben

:pale: Sowas hatte ich befürchtet...

Na gut. Wenn's nicht anders geht :( Trotzdem Danke.

Phoenix 10. Aug 2004 14:33

Re: Object clonen?
 
Zitat:

Zitat von Bernhard Geyer
Delphi-Quellcode:
procedure TMyList.Assign(Source: TMyList);
var
  i: Integer;
  CloneItem: TMyCollectionItem;
begin
  for i := 0 to Length-1     
  begin
    CloneItem := TMyCollectionItem.Create;
    CloneItem.Assign(Source.Items[i]);
    Add(CloneItem);
  end;
end;

Müsste das nicht
Code:
for i := 0 to Source.Length - 1
heissen? :gruebel:

Bernhard Geyer 10. Aug 2004 14:38

Re: Object clonen?
 
Zitat:

Zitat von Phoenix
Müsste das nicht
Code:
for i := 0 to Source.Length - 1
heissen? :gruebel:

Sicherlich. :-D Diesen Code habe ich aus dem Gedächtnis zusammengebastelt. Ist nur als Idee und nicht als funktionsfähigs Codeschnipsel gedacht.

Phoenix 10. Aug 2004 14:40

Re: Object clonen?
 
Bin mir nicht ganz sicher, ob ich das richtig kapiert habe...

Könnte das bitte mal bitte jemand verifizieren?
Delphi-Quellcode:
// Assign
//
procedure TMyList.Assign(a_sourceList: TMyList);
var
   i: integer;
begin
   for i := 0 to (a_sourceList.Count - 1) do
      Add.Assign(a_sourceList.Items[i]);
end;

// Clone
//
function TMyList.Clone: TMyList;
begin
   result := TMyList.Create;
   result.Assign(self);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:51 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz