Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Objekt klonen (hier: TClientDataSet) (https://www.delphipraxis.net/46213-objekt-klonen-hier-tclientdataset.html)

Majortomster 20. Mai 2005 16:03


Objekt klonen (hier: TClientDataSet)
 
Hallo zusammen,

ich stehe im Moment vor dem Problem, ein TClientDataSet Objekt zu erschaffen, das die exakte Kopie eines anderen Objekts dieses Typs ist. Es ist dabei wichtig, dass es sich dann WIRKLICH zwei mal im Speicher befindet (und keine zwei unterschiedlichen Zeiger auf die gleiche Stelle im Speicher).
In Java ist sowas sehr bequem machbar, aber in Delphi bin ich echt am verzweifeln. Hier gibt es keinen Copy-Konstruktor, keine Clone-Methode... (oder hab ich sie einfach nur noch nicht gefunden?)

Wie kann ich das anstellen? Bitte helft mir.

Grüße,
T

P.S.: Ich hab mir mal einen Copy-Konstruktor gebastelt, aber irgendwie scheinen die beiden Objekte doch noch miteinander zu tun zu haben, da sich beim zweiten Objekt gewisse Nebeneffekte zeigen wenn ich am ersten bestimmte Dinge ändere....

SirThornberry 20. Mai 2005 16:09

Re: Objekt klonen (hier: TClientDataSet)
 
bei Delphi-Objecten ist dies in der Regel die "Assign"-Methode. Ob diese auch wirklich funktioniert hängt davon ab ob der Programmierer diese Implementiert hat. Bei den Delphi-Standard-Komponenten sollte dies in dein meisten Fällen wenn nicht sogar immer vorhanden sein.

Majortomster 20. Mai 2005 16:18

Re: Objekt klonen (hier: TClientDataSet)
 
Genau die Methode habe ich auch eben grade gefunden :)
Aber wenn ich sie so benutze:

ziel.Assign(quelle); // (wobei ziel, quelle vom Typ TClientDataSet)

Dann kommt zur Laufzeit eine EConvertError Exception + die Meldung:'TClientDataSet kann nicht zu TClientDataSet zugewiesen werden.'

Ich blicke da nicht durch...
:/

Gruß, T

DGL-luke 20. Mai 2005 16:32

Re: Objekt klonen (hier: TClientDataSet)
 
du kannst mal das hier versuchen:

Delphi-Quellcode:
var obj1,obj2:TDummy;
obj1:=TDummy.create;
obj2:=obj1;
also es vor(!)dem createn einfach zuzuweisen. ob das eine echte kopie ergibt, weiss ich leider nicht genau.

Majortomster 23. Mai 2005 08:25

Re: Objekt klonen (hier: TClientDataSet)
 
Das hab ich auch schon versucht - funktioniert nicht :?

marabu 23. Mai 2005 08:49

Re: Objekt klonen (hier: TClientDataSet)
 
Assign() und Copy()?

Ich weiß zwar nicht was du so vor hast, aber eventuell solltest du mal die BDN-Artikel von Cary Jensen zum Thema lesen und dann nochmal neu anfangen.

Grüße vom marabu

Bernhard Geyer 23. Mai 2005 08:56

Re: Objekt klonen (hier: TClientDataSet)
 
Zitat:

Zitat von DGL-luke
du kannst mal das hier versuchen:

Delphi-Quellcode:
var obj1,obj2:TDummy;
obj1:=TDummy.create;
obj2:=obj1;

Autsch! Das was du da vorschlägst funktioniert bei Objekten nicht. obj2 bekommt die gleiche Referenz wie obj1. D.h. du hast jetzt 2 Zeiger auf das gleiche Objekt. Wenn obj1 und obj2 ein record wären, würde es funktinieren, da dann das Record kopiert würde.

malo 23. Mai 2005 12:40

Re: Objekt klonen (hier: TClientDataSet)
 
Ich weiß nicht genau, aber könnte man nicht prinzipiell eine Klasse von TClientDataSet ableiten und davon eine Instanz erzeugen? Dann hat man zwei verschiedene Klassen, mit exakt den selben Eigenschaften und Methoden ;)

franktron 23. Mai 2005 13:07

Re: Objekt klonen (hier: TClientDataSet)
 
@Majortomster warum willst du dein eigentlich den TClientDataSet kopieren ????

Neuromancer 23. Mai 2005 15:17

Re: Objekt klonen (hier: TClientDataSet)
 
Hallo,

die Lösung mag ein wenig weit hergeholt sein, aber wie wäre es mit einem Umstieg auf ADO?

Das ADODataSet kann (fast) alles, was das CDS auch kann, mit ganz wenigen Ausnahmen: ADT-Felder, Array-Felder und Nested Datasets, wobei ein Nested DataSet mit ca. 10 Zeilen Code sehr schnell nachprogrammiert werden kann.

Warum mein Vorschlag? Das ADODataSet besitzt eine Methode namens "Clone". Aus der Hilfe:

Zitat:

Mit Clone können Sie dem Recordset-Objekt der aufrufenden ADO-Datenmenge eine exakte Kopie des Recordset einer anderen TCustomADODataSet
-Komponente zuweisen. Verläuft die Operation erfolgreich, sind beide Recordsets identisch. Tritt ein Fehler auf, wird das Recordset-Objekt auf nil (Delphi) odr NULL (C++) gesetzt und eine EADOError-Exception ausgelöst.
Im Übrigen habe ich mit ADO weit bessere Erfahrungen als mit MyBase gemacht. Spätestens ab 20.000 Records fängt CDS nämlich an, kräftig zu lamen.
Mal abgesehen, dass, sobald MyBase mit BLObs arbeitet, es zu der lästigen Fehlermeldung "Im Datensatzpuffer befindet sich ein ungültiges BLOb-Handle" kommen kann, dessen Ursache ich bis heute noch nicht herausgefunden habe.

Und bevor jetzt hier in Massen die Augen gerollt werden: Nein, ADO muss nicht unbedingt an eine Connection sprich einen DB-Server geknüpft werden. Es kann durchaus - wie CDS auch - für sich alleine stehen. Alle Eigenschaften, mit der sonst immer so nett für für MyBase geworben wird, beherrscht ADO auch, und meiner Meinung nach sogar besser, umfangreicher und performanter (Speichern auf Platte, Speichern als XML-Datei usw.). Nur wissen das leider die wenigsten..

Und: Nein, ich arbeite nicht bei Microsoft... :zwinker:

Gruß


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:18 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