Einzelnen Beitrag anzeigen

shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#15

Re: Objekt kopieren

  Alt 25. Mai 2007, 14:05
Das Kopieren von Objekten findet über die Methode Assign statt!
Dazu muss das Zielobjekt von TPersistent abgeleitet sein.

Die Assign-Methode hat immer folgenden Aufbau:
Delphi-Quellcode:
procedure TVerpackung.Assign(Source: TPersistent);
begin
   if Source is TVerpackung then
   begin
      FIdVerp := TVerpackung(Source).IdVerp;
      FBezeichnung := TVerpackung(Source).Bezeichnung;
      FVLength := TVerpackung(Source).VLength;
      FVHeight := TVerpackung(Source).VHeight;
      FVWidth := TVerpackung(Source).VWidth;
      FTara := TVerpackung(Source).Tara;
      FPicture.Assign(Source); // Unterobjekt kopieren
      ...
   end
   else
      // Ganz wichtig:
      // wenn ich die Klasse von "Source" nicht kenne,
      // dann immer inherited aufrufen
      // Könnte sein, dass ein Parentklasse die Zuweisung vornehmen kann
      // falls nicht, hat die VCL noch einen Supertrick in der Hinterhand
      // es wird die Methode AssignTo aufgerufen
      // falls dies auch fehlschlägt, gibt's ein Exception
      inherited;
end;
Der Copy-Constructor ist der schnelle Ersatz für folgenden Code:
Delphi-Quellcode:
objA := TEinObjekt.Create;
objA.Assign(objB);
Der Copy-Constructor macht dann Sinn, wenn in .Create viele Properties zugewiesen werden,
nur um dann in .Assign überbügelt zu werden.
Ganz allgemein ist aber die Assign-Methode wertvoller, da mit ihr auch Objekte unterschiedlicher Klassen
kopiert werden können.

Wenn ein Objekt UnterObjekte hat, dann gibt es zwei Varianten:
1.) nur Hauptobjekt wird kopiert. Bei den Unterobjekten werden nur Referenzen kopiert (2 Zeiger auf's gleiche Objekt)
2.) "Deep-Copy": auch die Unterobjekte werden sauber über Assign kopiert. Alle Objekte sind nun völlig unabhängig voneinander.

Delphi-Quellcode:
constructor TPageCollection.Create(pc: TPageCollection);
begin
  inherited Create;
  FInnerList := TList.Create;
  // die TList-Klasse weiss nicht, dass seine Items Objekte sind
  // also wird hier kein "Deep-Copy" ausgeführt
  FInnerList.Assign(pc.FInnerList);
Es wäre nun zu prüfen, ob TObjectList.Assign einen Depp-Copy ausführt.
Andreas
  Mit Zitat antworten Zitat