![]() |
TObject kopieren und zuweisen
Hallo,
ich habe ein Object TMembers. Wie kann ich bei folgendem Code der Variablen B eine Kopie zuweisen?
Code:
jetzt soll p.zahl 12589 und s.zahl 12 zurückgeben. Da gab es irgendetwas mit p := ^s; oder so ähnlich..
s := tMember.Create;
s.zahl := 12; p := s; p.zahl := 12589; Danke für die Hilfe Helen |
Re: TObject kopieren und zuweisen
Hallo helen,
so wie Du das vor hast geht es definitiv nicht. p und s zeigen auf dasselbe Objekt !!! Du brauchst 2 Objekte
Code:
s := tMember.Create;
P := tMember.Create; s.zahl := 12; p.zahl := 12589; ... s.Free p.Free |
Re: TObject kopieren und zuweisen
Sorry, hab ich vergessen, ich meinte natürlich
Code:
s := tMember.Create;
P := tMember.Create; ... //will aber hier p := s; //durchführen, um die StringDaten von S an p zu übergeben und dann erst ändern ... s.zahl := 12; p.zahl := 12589; s.Free p.Free |
Re: TObject kopieren und zuweisen
Moin!
Code:
Durch diese Zuweisung überschreibst du aber die angelegte Instanz von p und somit hast du in p und in s danach einen Instanzenzeiger auf ein und das selbe Objekt, nämlich s. Würde dieser Code in C++ geschrieben werden (vorausgesetzt die beiden Objekte sind nicht als "Zeiger auf" definiert), dann würde C++ automatisch den CopyConstructor aufrufen und bei p ein neues Objekt anlegen, welches den Inhalt von s übernimmt.
p := s;
Die beiden Variablen s und p sind intern nur Zeiger auf die Objekte und durch die Zuweisung überschreibst du den einen Zeiger. Mit anderen Worten: Intern hast du zwar immer noch irgendwo im Speicher beide Instanzen rumliegen, weisst aber nur noch von s wo diese liegt (weil p und s darauf zeigen). Du hast dann keine Möglichkeit mehr zu wissen, wo denn die Instanz vom originalen p liegt. Nochwas: Um das zu verdeutlichen sollte eigentlich deine Freigabe am Ende schief gehen:
Code:
Da s und p auf die gleiche Instanz zeigen, gibt s.Free die Instanz frei und danach probiert das p auch nochmal, aber da existiert dort keine Instanz mehr, also wird das fehlschlagen mit einer EAccessViolation an einer ziemlich krummen Adresse (die wo vorher die Instanz mal lag).
s.Free
p.Free Nochwas:
Code:
Nachdem du s.zahl die 12 zugewiesen hast, kannst du ja mal vor der Ausführung der nächsten Anweisung (12589 auf p.Zahl zuweisen) mal nachschauen was p.Zahl für einen Wert hat: Ich vermute mal ganz stark 12...
s.zahl := 12;
p.zahl := 12589; Lösung zu deinem Problem: Lege dir entweder einen CopyConstructor an oder bastle dir einen Assign Methode... Bsp Copy Constructor:
Delphi-Quellcode:
Dann kannst du deine Kopier so anlegen:
Type
TMember = Class Public Zahl : Integer; Constructor Create; Overload; // normaler Constructor Constructor Create(AMember : TMember); Overload; // Copy Constructor End; ..... Constructor TMember.Create(AMember : TMember); Begin inherited Create; Zahl := AMember.Zahl; // alles kopieren was an Vars definiert ist End;
Delphi-Quellcode:
Nochwas dazu:
p := TMember.Create(s); // copy constructor aufrufen
Wenn deine TMember Klasse auch private oder Protected Variablen besitzt die auch kopiert werden sollen aber ja nach aussen nicht sichtbar sind (da private/protected), so kannst du diese trotzdem im Constructor kopieren und drauf zugreifen, da alle Klassen in einer Unit untereinander friend Klassen sind. In C++ müsstest du sowas extra noch definieren, Delphi hat das einfach über die Unit gelöst... MfG Muetze1 |
Re: TObject kopieren und zuweisen
Wenn ich seinen Post durchlese, denk ich mal, dass er das weiss.
Er will ja nicht wissen warums nicht geht sondern WIE es geht. Ich kann ihm leider nicht helfen, da ich das in Delphi noch net probiert habe. Aber schreibt ihm doch mal die Lösung hin und erklärt ihm nicht dauernd was, was ihm bekannt ist :-D <edit> ah da is ja nu ne lösung, ich hab nix gesagt. Allerdings gings doch echt irgendwie über Zeiger <edit> |
Re: TObject kopieren und zuweisen
Hallo zusammen,
das eigentliche Ziel der ganzen Aktion soll sein, dass ein ein Object habe, welches auf die Variable a hört. Nun will ich dieses Object (ohne viel aufwand) kopieren und der Variablen b zuweisen. Wenn ich nun Daten aus Object a ändere, sollen die Änderungen nicht automatisch auch bei Object b auftauchen. Bei C++ ging das irgendwie so: a := b^; Tut's das auch bei Delphi? |
Re: TObject kopieren und zuweisen
Du musst deine Objekte von TPersistent ableiten (und nicht direkt von TObject) !!
Dann musst du die Methode Assign überschreiben:
Delphi-Quellcode:
Zu guter Letzt Assign benützen, um Objekte zu kopieren:
procedure TAdresse.Assign(Source: TPersistent); // override;
var i: integer; begin if Source is TAdresse then begin for i := Low(FNamen) to High(FNamen) do FNamen[i] := TAdresse(Source).FNamen[i]; FStrasse := TAdresse(Source).FStrasse; FOrt := TAdresse(Source).FOrt; FLand := TAdresse(Source).FLand; FPLZ := TAdresse(Source).FPLZ; end else Inherited; // wichtig, immer wenn du mit Source nichts anfangen kannst inherited aufrufen end;
Delphi-Quellcode:
zielobject.Assign(quellobject);
|
Re: TObject kopieren und zuweisen
Hm naja der Ansatz mit dem CopyConstructor ist doch ganz schlüssig.
Und du brauchst die Anweisungen zum "Kopieren aller Attribute per Hand" ja nur einmal anzugeben. |
Re: TObject kopieren und zuweisen
Hallo,
was du suchst ist in Delphi mit der Methode Assign gelöst worden. Diese Methode wird allerdings erst in TPersistent eingeführt. Wenn du dein Objekt unbedingt von TObject ableiten willst, kannst du dir das Assign ja nachprogrammieren:
Delphi-Quellcode:
Dann noch zum Probieren:
type TMember = class(TObject)
private FZahl: Integer; public procedure Assign(o: TMember); property Zahl: Integer read FZahl write FZahl; end; ---- procedure TMember.Assign(o: TMember); begin Zahl := o.Zahl; end;
Delphi-Quellcode:
mfg
procedure MemberProbe;
var s, p: TMember; begin s := TMember.Create; p := TMember.Create; try s.Zahl := 12; p.Assign(s); ShowMessage('Wert von p vor Assign :' + IntToStr(p.Zahl)); p.Zahl := 12589; ShowMessage('Wert von p nach Assign :' + IntToStr(p.Zahl)); ShowMessage('Wert von s :' + IntToStr(s.Zahl)); finally FreeAndNil(s); FreeAndNil(p); end; // end finally end; edit: was vergessen :oops: |
Re: TObject kopieren und zuweisen
Moin!
@helen: Wie ich schon gesagt hatte: Copy Constructor oder Assign Methode einfügen. Bei letzterem hast du den Nachteil, das du erstmal die Instanz erzeugen musst und dann kannst du erst Assign() benutzen... Und wie oben schon beschrieben wird in C++ bei folgendem automatisch der Copy Constructor aufgerufen
Code:
@shmia: Die Objekte deswegen von TPersistent abzuleiten würde ich als Overkill bezeichnen, vor allem, da diese Methode nix besonderes ist und einfach selber zu implementieren ist...
TMyClass MyClass1; // die Instanzen werden automatisch angelegt
TMyClass MyClass2; MyClass1.Zahl = 4; MyClass2 = MyClass1; // hier wird automatisch der Copy Constructor aufgerufen von MyClass2 MfG Muetze1 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz