![]() |
Object ersetzen aber trotzdem behalten
Hi,
ich hab mal wieder ne Frage bezüglich TObject und TObjectList ;-) Angenommen ich habe folgende TObjectList:
Delphi-Quellcode:
Ich möchte nun Item[1] durch einen neuen Eintrag ersetzen, ihn aber dennoch als Objekt behalten. Wie kann ich das anstellen?
begin
auto1 := TAuto.Create; auto1.Marke := 'Opel'; auto1.Modell := 'Astra'; autoSammlung.Add(auto1); autoSammlung[0].Marke = 'Opel'; autoSammlung[0].Modell = 'Astra'; autoSammlung[1].Marke = 'VW'; autoSammlung[1].Modell = 'Golf'; autoSammlung[2].Marke = 'Audi'; autoSammlung[2].Modell = 'TT'; end; |
Re: Object ersetzen aber trotzdem behalten
Durch Ersetzten in der Liste bleibt das Objekt bestehen, man kann aber nur darauf zugreifen, wenn man eine Referenz darauf irgendwie speichert
|
Re: Object ersetzen aber trotzdem behalten
Hallo mkinzler!
Diese Aussage von dir stimmt nur, wenn die TObjectList Instanz mit false im Constructor angelegt wurde oder OwnsObjects auf false gesetzt wurde. In allen anderen Fällen würde die an der Position vorhandene Instanz freigegeben werden. Dabei ist es unerheblich ob nil oder eine Instanz zugewiesen wird. Gruss Yellow |
Re: Object ersetzen aber trotzdem behalten
Durch Ersetzen würden sie auch dann nicht zerstört
|
Re: Object ersetzen aber trotzdem behalten
Ein Beispiel daür wäre (wenn ich das richtig verstehe) folgendes.
Delphi-Quellcode:
Dann hast du deine Referenz in aAuto, ob der Cast notwendig, kann ich so grad nicht sagen, weil ich nicht weiß was deine Liste genau ist.
var aAuto: TAuto
aAuto:= TAuto(autoSammlung[1]); Im Übrigen musst du ein Objekt ehe du alle Referenzen darauf verlierst erst freigeben, ansonsten führt dich zu Memory-Leaks.
Delphi-Quellcode:
[Edit]Falls die Liste ihre Kombonenten nicht besitzt und automatisch freigibt, aber dann kannst du entweder eine Kopie der Instanz anlegen, oder dies in der Regel irgendwo deaktivieren.
aAuto.Free
|
Re: Object ersetzen aber trotzdem behalten
Hallo mkinzler!
Zitat:
Das alte Objekt wird in jedem Falle zerstört - wenn OwnsObjects auf true steht. Gruss Yellow |
Re: Object ersetzen aber trotzdem behalten
Zitat:
MKinzler hat recht! |
Re: Object ersetzen aber trotzdem behalten
Mhmm naja...verstehe ich noch nicht ganz:
Wie mache ich das denn bei folgender Unit (habe mal schnell eine vergleichbare zusammengeschrieben):
Delphi-Quellcode:
oldCar wird überschrieben, obwohl ich autoSammlung[1] eigentlich vorher newCar zugewiesen habe...hoffe jetzt könnte ihr mich eher nachvollziehen.
unit Unit1;
interface uses Contnrs, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TAuto = class(TObject) Marke, Modell : String; end; type TAutoSammlung = class (TObjectList) end; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private autosammlung : TAutoSammlung; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var newcar, oldcar : TAuto; begin oldCar := TAuto(autosammlung[1]); newCar := TAuto.Create; newCar.Marke := 'Porsche'; newCar.Modell := 'Boxter'; autoSammlung[1] := newCar; ShowMessage(oldCar.Marke + #13 + oldCar.Modell); end; procedure TForm1.FormCreate(Sender: TObject); var auto1 : Tauto; begin autoSammlung := TAutoSammlung.Create; auto1 := TAuto.Create; auto1.Marke := 'Opel'; auto1.Modell := 'Astra'; autoSammlung.Add(auto1); auto1 := TAuto.Create; auto1.Marke := 'VW'; auto1.Modell := 'Golf'; autoSammlung.Add(auto1); auto1 := TAuto.Create; auto1.Marke := 'Audi'; auto1.Modell := 'TT'; autoSammlung.Add(auto1); end; end. |
Re: Object ersetzen aber trotzdem behalten
@Yellow579: hast recht :oops:
|
Re: Object ersetzen aber trotzdem behalten
Hallo Yheeky,
mit der Methode ![]() ![]() Noch ein Vorschlag: spendiere deiner Klasse TAuto einen eigenen Konstruktor, damit vereinfachst du das Erstellen neuer Instanzen:
Delphi-Quellcode:
Gruß Hawkeye
var
Auto : TAuto; begin Auto := TAuto.Create('Opel', 'Astra'); [..] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:59 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