Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi TComboBox.AddObject - Adressverletzung (https://www.delphipraxis.net/175188-tcombobox-addobject-adressverletzung.html)

Mazen 5. Jun 2013 08:51

TComboBox.AddObject - Adressverletzung
 
Hallo Leute,
ich hab ein Problem mit diesem Code:

Delphi-Quellcode:
for i:=0 to 9 do
begin
  preisliste := TPreisliste.Create();
  preisliste.Preisgruppe := dm.smtPreislisten.FieldByName('NR').AsString;
  preisliste.Jahr := dm.smtPreislisten.FieldByName('JAHR').AsString;
  preisliste.Periode := dm.smtPreislisten.FieldByName('PERIODE').AsString;

  combobox.Items.Add(dm.smtPreislisten.FieldByName('DATUM_VON').AsString);
  combobox.Items.AddObject('Preisliste'+IntToStr(i),preisliste);
  dm.smtPreislisten.Next;
end;
combobox.ItemIndex := 0;
ShowMessage(TPreisliste(combobox.Items.Objects[combobox.ItemIndex]).Preisgruppe); <--
An der makierten Stelle bekomme ich eine Adressverletzung. Ich habe schon eine Idee wodran es liegt. Und zwar habe ich mal probiert den ItemIndex in der vorletzten Zeile auf das letzte Item zu legen (ItemIndex := Items.Count-1). Und siehe da, beim letzten angehängten Objekt funktioniert es. Die davor scheinen nicht mehr zu exisitieren.

Überschreibe ich also bei jedem Schleifenbeginn das letzte Objekt? Wird nicht nur eine "Kopie" des Objekts in der Combobox hinterlegt?

Gruß,
Matthias

baumina 5. Jun 2013 09:04

AW: TComboBox.AddObject - Adressverletzung
 
Delphi-Quellcode:
combobox.Items.Add(dm.smtPreislisten.FieldByName('DATUM_VON').AsString);
erzeugt einen Eintrag bei Items ohne angehängtes Objekt.
Delphi-Quellcode:
combobox.Items.AddObject('Preisliste'+IntToStr(i),preisliste);
erzeugt einen Eintrag bei Items mit angehängtem Objekt.

Das heißt, dass jeder 2. Itemeintrag ein Objekt besitzt (1,3,5,...). Der Item mit dem Index 0 hat kein angehängtes Objekt, deswegen Fehler.

Mazen 5. Jun 2013 09:07

AW: TComboBox.AddObject - Adressverletzung
 
Achso, dann hab ich das Prinzip schon falsch verstanden.

Ich dachte combobox.Items.Add fügt mir den "sichtbaren" Eintrag in die Combobox und Items.AddObject lediglich das Objekt mit einer ebenfalls unsichtbaren Bezeichnung.

Also ist AddObject so zu verstehen das der erste Parameter der Listeneintrag ist, und der zweite das hinterlegte Objekt?

baumina 5. Jun 2013 09:09

AW: TComboBox.AddObject - Adressverletzung
 
Zitat:

Zitat von Mazen (Beitrag 1217497)
Also ist AddObject so zu verstehen das der erste Parameter der Listeneintrag ist, und der zweite das hinterlegte Objekt?

Ja, genau so ist es.

DeddyH 5. Jun 2013 09:09

AW: TComboBox.AddObject - Adressverletzung
 
TStrings.AddObject
Zitat:

Fügt der Liste einen String hinzu und ordnet dem String ein Objekt zu.

Mit AddObject fügen Sie der Liste einen String hinzu und ordnen dem String ein Objekt zu. AddObject gibt den Index des neuen String und des neuen Objekts zurück.

Mazen 5. Jun 2013 09:10

AW: TComboBox.AddObject - Adressverletzung
 
Super, danke für die flotte Hilfe :)

haentschman 5. Jun 2013 10:46

AW: TComboBox.AddObject - Adressverletzung
 
Moin... 8-)

und wo werden deine erzeugten TPreisliste wieder freigegeben ?

sx2008 5. Jun 2013 11:27

AW: TComboBox.AddObject - Adressverletzung
 
Zitat:

Zitat von haentschman (Beitrag 1217522)
und wo werden deine erzeugten TPreisliste wieder freigegeben ?

Das sollte man nicht vergessen.
Hier eine nützliche Prozedur dazu

Delphi-Quellcode:
{**************************************************************************
 * NAME:   FreeTStringsObjects
 * DESC:   free all objects attached to a TStrings-Object
 *************************************************************************}
procedure FreeTStringsObjects(sl: TStrings);
var
   i: Integer;
   o: TObject;
begin
   Assert(Assigned(sl));
   for i := sl.Count-1 downto 0 do
   begin
      o := sl.Objects[i];
      if Assigned(o) then
      begin
         o.Destroy;  // spart Zeit gegenüber .Free
         sl.Objects[i] := nil;
      end;
   end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:47 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