AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Object clonen?

Ein Thema von Phoenix · begonnen am 10. Aug 2004 · letzter Beitrag vom 10. Aug 2004
Antwort Antwort
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.611 Beiträge
 
#1

Object clonen?

  Alt 10. Aug 2004, 13:13
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 )?
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Object clonen?

  Alt 10. Aug 2004, 13:21
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;
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.611 Beiträge
 
#3

Re: Object clonen?

  Alt 10. Aug 2004, 13:24
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
Sowas hatte ich befürchtet...

Na gut. Wenn's nicht anders geht Trotzdem Danke.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.611 Beiträge
 
#4

Re: Object clonen?

  Alt 10. Aug 2004, 13:33
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?
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Object clonen?

  Alt 10. Aug 2004, 13:38
Zitat von Phoenix:
Müsste das nicht
Code:
for i := 0 to Source.Length - 1
heissen?
Sicherlich. Diesen Code habe ich aus dem Gedächtnis zusammengebastelt. Ist nur als Idee und nicht als funktionsfähigs Codeschnipsel gedacht.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.611 Beiträge
 
#6

Re: Object clonen?

  Alt 10. Aug 2004, 13:40
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;
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz