| Autor |
Beitrag |
DerNetteNachbar
      
Beiträge: 224
|
Verfasst: Di 15.09.09 14:07
Moderiert von Narses: Abgetrennt von [url=www.delphi-forum.de/...?t=94263]hier[/url].
Danke für die tollen Tipps. Jetzt stehe ich allerdings vor einem weiteren Problem was aber zu dem Thema gehört.
Wenn ich Beispielsweise in dem Objekt Arrays, Pointer, und weitere Objekte beinhalte. Müsste ich diese dann alles von vorne bis hinten durchlaufen und neue Pointer erstellen um die alten Werte hineinzuschreiben oder gibt es da eine bessere Möglichkeit alles in einem zu machen.
Danke schon mal im Vorraus.
MfG
Nachbar
|
|
DerNetteNachbar 
      
Beiträge: 224
|
Verfasst: Mi 16.09.09 08:10
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 16.09.09 08:29
Moin!
DerNetteNachbar hat folgendes geschrieben : | | Wenn ich Beispielsweise in dem Objekt Arrays, Pointer, und weitere Objekte beinhalte. Müsste ich diese dann alles von vorne bis hinten durchlaufen und neue Pointer erstellen um die alten Werte hineinzuschreiben |
Neue Pointer erstellen?  Was auch immer du damit meinst...
Wenn du ein Objekt mit dieser Methode duplizieren willst, musst du alle Eigenschaften kopieren. Enthält die Quelle ein dynamisches Array, musst du im Ziel eine Kopie davon anlegen (Dateneigentümerschaft). Enthält die Quelle einen Pointer (allg. Referenz) auf ein anderes Objekt, dann genügt es normalerweise, diesen Pointer durch eine Zuweisung zu kopieren.
Bei Objekten ist das etwas komplizierter, hier genügt ja normalerweise eine Instanz zusammen mit einer Referenzzählung (die letzte Freigabe entfernt dann das Objekt). Man kann aber auch eine Kopie anlegen, kostet halt Speicher.
DerNetteNachbar hat folgendes geschrieben : | | oder gibt es da eine bessere Möglichkeit alles in einem zu machen. |
Die Frage verstehe ich nicht.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
DerNetteNachbar 
      
Beiträge: 224
|
Verfasst: Mi 16.09.09 08:39
Es reicht eben nicht einen Pointer durch eine blosse Zuweisung zu kopieren. Denn dann übernimmt der Pointer aus dem kopierten Objekt dieselbe Adresse die der andere Pointer hat, und genau das soll nicht sein. Es soll ein eigenständiges Objekt sein denn man verändern kann ohne das sich beim dem Kopierenden Objekt sich was verändert.
Ich hoffe ich konnte mich mehr oder weniger verständlich ausdrücken  denn diese Angelegenheit ist mir wirklich wichtig.
MfG
Nachbar
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 16.09.09 10:52
Moin!
DerNetteNachbar hat folgendes geschrieben : | | Es reicht eben nicht einen Pointer durch eine blosse Zuweisung zu kopieren. Denn dann übernimmt der Pointer aus dem kopierten Objekt dieselbe Adresse die der andere Pointer hat, und genau das soll nicht sein. Es soll ein eigenständiges Objekt sein denn man verändern kann ohne das sich beim dem Kopierenden Objekt sich was verändert. |
Du hast deine Frage doch schon selbst beantwortet: leg halt eine weitere Instanz des zu kopierenden Objekts an.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
DerNetteNachbar 
      
Beiträge: 224
|
Verfasst: Mi 16.09.09 11:35
Verstehe ich irgenwie nicht 
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 16.09.09 11:47
Moin!
Dann solltest du jetzt mal ein Beispiel in Codeform bringen, sonst kommen wir da nicht weiter.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
jfheins
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: Mi 16.09.09 11:47
Ich verstehe zwar nicht, was man daran nicht verstehen kann, aber bitte sehr: Ein Beispiel.
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| TMeinObjekt.Assign(copyfrom: TMeinObjekt) begin ... unterobjekt := TUnterklasse.Create(); unterobjekt.assign(copyfrom.unterobjekt) end; |
|
|
DerNetteNachbar 
      
Beiträge: 224
|
Verfasst: Mi 16.09.09 12:03
@jfheins
Ich würde sagen erstmal den ganzen Text lesen dann erst zynische Kommentare abgeben.
Die Antwort die du mir gegeben hast die wurde schon vor langer Zeit geklärt. Es ging um Pointer auf Objekte die man als eigenständiges Objekt kopiert und nicht als regelrechte Kopie(dasgleiche Objekt).
|
|
jfheins
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: Mi 16.09.09 12:17
Pointer auf Objekte?
Du meinst also, diu machst sowas:
Delphi-Quelltext 1: 2: 3: 4: 5:
| var a: pointer; begin a := Pointer(TStringList.Create()); end; |
und willst das dann kopieren?
|
|
DerNetteNachbar 
      
Beiträge: 224
|
Verfasst: Mi 16.09.09 13:18
Nein ich mein sowas:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| ttest = class(TPersistent) public recs: record bla: Byte; blabla: string; end; private test1: pointer |
Und dieser Pointer zeigt wiederum auf eine Klasse die ttest sozusagen enthält.
Initialisation der Klasse:
Delphi-Quelltext 1:
| var test, tests: ttest |
Erstelle ganz normal die beiden Klassen.
Wenn ich jetzt
Delphi-Quelltext 1: 2:
| New(test.test1); test.test := (source as ttest).test1; | Dann kopiert es mir den Pointer samt dem Zeug was drin ist. Jedoch wenn ich was an der Kopie Klasse was ändere so ändert sich bei der andere Klasse auch es.
MfG
Moderiert von Narses: Delphi-Tags hinzugefügt
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 16.09.09 13:32
Moin!
DerNetteNachbar hat folgendes geschrieben : | Nein ich mein sowas:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| ttest = class(TPersistent) public recs: record bla: Byte; blabla: string; end; private test1: pointer |
Und dieser Pointer zeigt wiederum auf eine Klasse die ttest sozusagen enthält. |
Genau hier scheint mir der Hase im Pfeffer begraben zu liegen - das solltest du nochmal sehr ausführlich erläutern!
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
DerNetteNachbar 
      
Beiträge: 224
|
Verfasst: Mi 16.09.09 13:39
Der Pointer test1 ist ein Zeiger auf eine weitere Klasse die ttest2 heisst.
test1= ^ttest2;
tttest2 = class(ttest3)
Und die weitere Klasse stammt wiederum von der dritten Klasse die test3 heisst
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Mi 16.09.09 13:42
Bist du sicher, dass du einen Pointer auf eine KLASSE meinst, und nicht eher, auf eine andere Instanz?
Wenn du doch eine Instanz meinst: Wieso speicherst du das dann als Pointer, und nicht direkt als MyTest: TTest2; ? Im Hintergrund ist dies doch auch nur ein Pointer, nur eben, dass du schon weißt, was für einer. Und dann wiederum könntest du von dieser Klasse ebenfalls ein Assign aufrufen, und hättest die Kopie.
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
DerNetteNachbar 
      
Beiträge: 224
|
Verfasst: Mi 16.09.09 13:54
Ich möchte aber von der Oberklasse aus alle anderen mitspeichern.
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 16.09.09 14:10
Moin!
DerNetteNachbar hat folgendes geschrieben : | | Ich möchte aber von der Oberklasse aus alle anderen mitspeichern. |
Was hat das mit der Typisierung zu tun? Du hebelst hier mit den Pointern das Klassenmodell komplett aus, das sieht mir nach einem schweren OOP-Fehler aus, der vermutlich auch der Grund für dein aktuelles "Problem" ist.
Ich denke, du solltest mal etwas ausführlicher beschreiben, was du da machst und was das für einen Zweck haben soll. So kann man keinen gangbaren Weg vorschlagen.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
DerNetteNachbar 
      
Beiträge: 224
|
Verfasst: Do 17.09.09 08:17
Nein ich hebele mit den Pointer nicht das Klassenmodell aus. Es sind letztendlich Instanzen im Hintergrund auf die der Pointer zeigt. Und um genau diese zu speichern brauche ich ein Tip wie ich dies am besten tun kann.
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 17.09.09 08:22
Moin!
DerNetteNachbar hat folgendes geschrieben : | | Nein ich hebele mit den Pointer nicht das Klassenmodell aus. Es sind letztendlich Instanzen im Hintergrund auf die der Pointer zeigt. Und um genau diese zu speichern brauche ich ein Tip wie ich dies am besten tun kann. |
Wenn du schon alles besser weißt, warum fragst du dann noch hier?
Viel Erfolg noch
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Do 17.09.09 08:31
Ich versteh dich nicht..
Statt
Delphi-Quelltext
einfach
Delphi-Quelltext
intern ist das auch nur ein Pointer - aber du weißt halt direkt, von welchem Typ der ist.
Aber irgendwie schweifen wir vom Thema "Exception bei Assign" ab..
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
DerNetteNachbar 
      
Beiträge: 224
|
Verfasst: Do 17.09.09 08:58
Das geht nicht denn dieser Pointer kann auch auf mehere Instanzen zeigen. Das heisst es ist sozusagen ein dynamisches Array.
|
|