Autor Beitrag
DerNetteNachbar
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 224



BeitragVerfasst: Di 15.09.09 14:07 
Moderiert von user profile iconNarses: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 224



BeitragVerfasst: Mi 16.09.09 08:10 
PUSH
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 16.09.09 08:29 
Moin!

user profile iconDerNetteNachbar hat folgendes geschrieben Zum zitierten Posting springen:
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? :gruebel: Was auch immer du damit meinst... :nixweiss:

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. :nixweiss:

user profile iconDerNetteNachbar hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 224



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 16.09.09 10:52 
Moin!

user profile iconDerNetteNachbar hat folgendes geschrieben Zum zitierten Posting springen:
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. :nixweiss:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
DerNetteNachbar Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 224



BeitragVerfasst: Mi 16.09.09 11:35 
Verstehe ich irgenwie nicht ;-)
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 16.09.09 11:47 
Moin!

user profile iconDerNetteNachbar hat folgendes geschrieben Zum zitierten Posting springen:
Verstehe ich irgenwie nicht ;-)
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Mi 16.09.09 11:47 
Ich verstehe zwar nicht, was man daran nicht verstehen kann, aber bitte sehr: Ein Beispiel.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
TMeinObjekt.Assign(copyfrom: TMeinObjekt)
begin
...
unterobjekt := TUnterklasse.Create();
unterobjekt.assign(copyfrom.unterobjekt)
end;
DerNetteNachbar Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 224



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Mi 16.09.09 12:17 
Pointer auf Objekte?

Du meinst also, diu machst sowas:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
var
a: pointer;
begin
a := Pointer(TStringList.Create());
end;

und willst das dann kopieren?
DerNetteNachbar Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 224



BeitragVerfasst: Mi 16.09.09 13:18 
Nein ich mein sowas:
ausblenden 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:
ausblenden Delphi-Quelltext
1:
var test, tests: ttest					

Erstelle ganz normal die beiden Klassen.

Wenn ich jetzt
ausblenden 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 user profile iconNarses: Delphi-Tags hinzugefügt
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 16.09.09 13:32 
Moin!

user profile iconDerNetteNachbar hat folgendes geschrieben Zum zitierten Posting springen:
Nein ich mein sowas:
ausblenden 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! :idea:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
DerNetteNachbar Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 224



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 224



BeitragVerfasst: Mi 16.09.09 13:54 
Ich möchte aber von der Oberklasse aus alle anderen mitspeichern.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 16.09.09 14:10 
Moin!

user profile iconDerNetteNachbar hat folgendes geschrieben Zum zitierten Posting springen:
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. :nixweiss:

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. :idea:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
DerNetteNachbar Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 224



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 17.09.09 08:22 
Moin!

user profile iconDerNetteNachbar hat folgendes geschrieben Zum zitierten Posting springen:
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? :nixweiss:

Viel Erfolg noch
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Do 17.09.09 08:31 
Ich versteh dich nicht..
Statt
ausblenden Delphi-Quelltext
1:
Test1: pointer;					

einfach
ausblenden Delphi-Quelltext
1:
Test1: TTest;					

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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 224



BeitragVerfasst: 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.