AGB  ·  Datenschutz  ·  Impressum  







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

Komplexe TList kopieren

Ein Thema von Rakshasa · begonnen am 2. Feb 2011 · letzter Beitrag vom 2. Feb 2011
Antwort Antwort
Benutzerbild von Rakshasa
Rakshasa

Registriert seit: 1. Nov 2003
182 Beiträge
 
Delphi 2007 Professional
 
#1

Komplexe TList kopieren

  Alt 2. Feb 2011, 13:00
Hallo Leute,

für meine Undo-Funktion erstelle ich Kopien meiner aktuellen TList-Sturktur. Die TList besteht aus Record-Pointern, die wiederum selbst mehrere TLists enthalten, Strings, Integer, andere records.

Momentan gehe ich die einzelnen Elemente der TList durch und erstellt manuell einen neuen Pointer, welchen ich dann der neuen TList zuweise. Dieses Verfahren ist aber sehr mühselig; gibt es eine Möglichkeit, den gesamten Speicher, der den Pointer einer TList enthält zu kopieren und diese Kopie dann einer neuen TList zuzuweisen?
  Mit Zitat antworten Zitat
WM_CLOSE

Registriert seit: 12. Mai 2010
Ort: königsbronn
398 Beiträge
 
RAD-Studio 2009 Pro
 
#2

AW: Komplexe TList kopieren

  Alt 2. Feb 2011, 16:01
Bei reinen Werttypen (z.B. Integer) ist das kein großes Prob,
aber sobald man zu Strings stößt, fangen die Probleme an.
Ganz zu schleigen von anderen Objekten wie TLists in dem Record.
Die Variable vom Typ TList speichert ja nur einen Pointer.
Den kannst du kopieren wie du willst, der zeigt immernoch auf dasselbe TList Objekt.
Mit den Strings verhält es sich ähnlich.

Ich hab das mal so getestet:

Delphi-Quellcode:
procedure Test
type
  TMyRecord=record
    str:array[0..5]of char;
    int:Integer;
  end;
  pMyRecord=^tMyRecord;
var
  List1:TList;
  List2:TList;
  i:TMyRecord;
  p:pMyRecord;
begin
  List1:=TList.Create;
  List2:=TList.Create;
  try
    i.int:=0;
    i.str:='Hase';
    ShowMessage(i.str);
    List1.Add(@i);
    ShowMessage(TMyRecord(List1[0]^).str);
    new(p);
    try
      List2.Add(p);
      TMyRecord(List1[0]^):=TMyRecord(List2[0]^);
      Inc(TMyRecord(List2[0]^).int);
      ShowMessage(IntToStr(TMyRecord(List1[0]^).int));
      ShowMessage(IntToStr(TMyRecord(List2[0]^).int));
      TMyRecord(List2[0]^).str:='Ratte';
      ShowMessage(TMyRecord(List1[0]^).str);
      ShowMessage(TMyRecord(List2[0]^).str);
    finally
      dispose(List2[0]);
    end;
  finally
    list1.Free;
    list2.Free;
  end;
end;
Komischerweise hat es sogar ein mal funktioniert. Das Problem bei dem Beispiel dürfte die Referenzzählung des Strings sein.
  Mit Zitat antworten Zitat
Benutzerbild von ChrisE
ChrisE

Registriert seit: 15. Feb 2006
Ort: Hechingen
504 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Komplexe TList kopieren

  Alt 2. Feb 2011, 16:06
Hallo,

keine Ahnung ob es tut, aber was ist mit Delphi-Referenz durchsuchenTList.Assign?

Gruß, Chris
Christian E.
Es gibt 10 Arten von Menschen, die die Binär lesen können und die die es nicht können

Delphi programming rules
  Mit Zitat antworten Zitat
WM_CLOSE

Registriert seit: 12. Mai 2010
Ort: königsbronn
398 Beiträge
 
RAD-Studio 2009 Pro
 
#4

AW: Komplexe TList kopieren

  Alt 2. Feb 2011, 16:17
TList.Assign kopiert nur die Pointer (=Elemente in der Liste) hab es grad getestet.
  Mit Zitat antworten Zitat
webcss

Registriert seit: 10. Feb 2006
255 Beiträge
 
Delphi XE2 Professional
 
#5

AW: Komplexe TList kopieren

  Alt 2. Feb 2011, 16:22
Wie wär's mit Tobject anstatt record,

Dann geschwind ein Basis Object mit einer Clone methode gestrickt und eine ebensolche in eine eigene TList Klasse

und mit MyRootList.Clone ist der Lack fertig?
"Wer seinem Computer Mist erzählt, muss immer damit rechnen..." (unbekannt)
"Der Computer rechnet damit, dass der Mensch denkt..." (auch unbekannt)
mein blog
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#6

AW: Komplexe TList kopieren

  Alt 2. Feb 2011, 17:12
die "ordentliche" Methode:

- statt der Records+Pointer ebenfalls Objekte verwenden
- allen enthaltenen Objekten eine "Clone"-Funktion verpassen
- TList auf eine erweiterte TObjectList ändern, welche diese Clone-Funktion verwendet.

> die Liste übergibt nun in Assign ihren Inhalt an die andere Liste
> dabei wird über .Clone eine Kopie des enthaltenen Objektes erstellt und in die neue Liste eingefügt
> jedes Objekt kopiert in .Clone auch untergeordnete Objekte, welche wiederrum über .Clone kopiert und ins neue Objekt eingetragen werden
> usw.

Also wie schon erwähnt.
Ich weiß aber nicht, ob Delphi 2007 schon TObject.Clone kennt ... wenn doch, dann dieses überschreiben und wenn nicht, dann selber eines einführen.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 2. Feb 2011 um 17:14 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Rakshasa
Rakshasa

Registriert seit: 1. Nov 2003
182 Beiträge
 
Delphi 2007 Professional
 
#7

AW: Komplexe TList kopieren

  Alt 2. Feb 2011, 22:54
Hmm...mit TObject habe ich mich noch nicht beschäftigt, eine .Clone-Function kennt mein Delphi 2007 nicht. Ich werde mal schauen, was ich hier so finden kann; ansonsten wirds wohl erstmal bei manuellen Kopieren bleiben..

Danke!
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#8

AW: Komplexe TList kopieren

  Alt 2. Feb 2011, 23:07
Die Clone-Funktion müsstest Du den Klassen selbst beibringen...
Wenn Du Deine Kopierroutinen im Griff und optimiert hast und diese für Wartbar hältst besteht eh kein Handlungsbedarf. Schneller wird es durch genannte Methoden nicht, nur wartbarer.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  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 06:25 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