AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Object ersetzen aber trotzdem behalten

Ein Thema von Yheeky · begonnen am 27. Jun 2008 · letzter Beitrag vom 28. Jun 2008
Antwort Antwort
Seite 1 von 2  1 2      
Yheeky

Registriert seit: 7. Jun 2002
1.339 Beiträge
 
#1

Object ersetzen aber trotzdem behalten

  Alt 27. Jun 2008, 18:37
Hi,

ich hab mal wieder ne Frage bezüglich TObject und TObjectList
Angenommen ich habe folgende TObjectList:
Delphi-Quellcode:
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;
Ich möchte nun Item[1] durch einen neuen Eintrag ersetzen, ihn aber dennoch als Objekt behalten. Wie kann ich das anstellen?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Object ersetzen aber trotzdem behalten

  Alt 27. Jun 2008, 18:40
Durch Ersetzten in der Liste bleibt das Objekt bestehen, man kann aber nur darauf zugreifen, wenn man eine Referenz darauf irgendwie speichert
Markus Kinzler
  Mit Zitat antworten Zitat
Yellow579
(Gast)

n/a Beiträge
 
#3

Re: Object ersetzen aber trotzdem behalten

  Alt 27. Jun 2008, 18:42
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Object ersetzen aber trotzdem behalten

  Alt 27. Jun 2008, 18:45
Durch Ersetzen würden sie auch dann nicht zerstört
Markus Kinzler
  Mit Zitat antworten Zitat
Cyf

Registriert seit: 30. Mai 2008
407 Beiträge
 
Lazarus
 
#5

Re: Object ersetzen aber trotzdem behalten

  Alt 27. Jun 2008, 18:45
Ein Beispiel daür wäre (wenn ich das richtig verstehe) folgendes.

Delphi-Quellcode:
var aAuto: TAuto

aAuto:= TAuto(autoSammlung[1]);
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.

Im Übrigen musst du ein Objekt ehe du alle Referenzen darauf verlierst erst freigeben, ansonsten führt dich zu Memory-Leaks.

aAuto.Free [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.
  Mit Zitat antworten Zitat
Yellow579
(Gast)

n/a Beiträge
 
#6

Re: Object ersetzen aber trotzdem behalten

  Alt 27. Jun 2008, 18:49
Hallo mkinzler!

Zitat von mkinzler:
Durch Ersetzen würden sie auch dann nicht zerstört
Doch. Die TObjectList führt in der SetItems Methode entsprechend ein Notify Aufruf mit lnDeleted aus und das führt zur Freigabe des alten Elementes an der Position, so lange das vorherige Item nicht nil war.

Das alte Objekt wird in jedem Falle zerstört - wenn OwnsObjects auf true steht.

Gruss
Yellow
  Mit Zitat antworten Zitat
Benutzerbild von Missionar
Missionar

Registriert seit: 20. Apr 2008
26 Beiträge
 
#7

Re: Object ersetzen aber trotzdem behalten

  Alt 27. Jun 2008, 18:54
Zitat von Yellow579:
Hallo mkinzler!

Zitat von mkinzler:
Durch Ersetzen würden sie auch dann nicht zerstört
Doch. Die TObjectList führt in der SetItems Methode entsprechend ein Notify Aufruf mit lnDeleted aus und das führt zur Freigabe des alten Elementes an der Position, so lange das vorherige Item nicht nil war.

Das alte Objekt wird in jedem Falle zerstört - wenn OwnsObjects auf true steht.

Gruss
Yellow
Quatsch RTFM

MKinzler hat recht!
  Mit Zitat antworten Zitat
Yheeky

Registriert seit: 7. Jun 2002
1.339 Beiträge
 
#8

Re: Object ersetzen aber trotzdem behalten

  Alt 27. Jun 2008, 19:29
Mhmm naja...verstehe ich noch nicht ganz:
Wie mache ich das denn bei folgender Unit (habe mal schnell eine vergleichbare zusammengeschrieben):

Delphi-Quellcode:
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.
oldCar wird überschrieben, obwohl ich autoSammlung[1] eigentlich vorher newCar zugewiesen habe...hoffe jetzt könnte ihr mich eher nachvollziehen.
  Mit Zitat antworten Zitat
Benutzerbild von Missionar
Missionar

Registriert seit: 20. Apr 2008
26 Beiträge
 
#9

Re: Object ersetzen aber trotzdem behalten

  Alt 27. Jun 2008, 20:13
@Yellow579: hast recht
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#10

Re: Object ersetzen aber trotzdem behalten

  Alt 27. Jun 2008, 20:43
Hallo Yheeky,

mit der Methode Delphi-Referenz durchsuchenTObjectList.Extract kannst du ein Element aus einer Objektliste entfernen ohne es freizugeben. Alle folgenden Listenelemente rücken automatisch auf und schließen somit die entstehende Lücke. Ein neues Element lässt sich natürlich jederzeit mit Hilfe der Methode Delphi-Referenz durchsuchenTObjectList.Insert an einer beliebigen Position der Liste einfügen. Bei der Verwendung von Extract musst du beachten, dass du auch die Verantwortung für die Freigabe des entfernten Elements übernimmst.

Noch ein Vorschlag: spendiere deiner Klasse TAuto einen eigenen Konstruktor, damit vereinfachst du das Erstellen neuer Instanzen:

Delphi-Quellcode:
var
  Auto : TAuto;
begin
  Auto := TAuto.Create('Opel', 'Astra');
  [..]
Gruß Hawkeye
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:38 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