AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi TComboBox.AddObject - Adressverletzung
Thema durchsuchen
Ansicht
Themen-Optionen

TComboBox.AddObject - Adressverletzung

Ein Thema von Mazen · begonnen am 5. Jun 2013 · letzter Beitrag vom 5. Jun 2013
Antwort Antwort
Mazen

Registriert seit: 6. Okt 2011
66 Beiträge
 
Delphi 7 Professional
 
#1

TComboBox.AddObject - Adressverletzung

  Alt 5. Jun 2013, 09:51
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
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: TComboBox.AddObject - Adressverletzung

  Alt 5. Jun 2013, 10:04
combobox.Items.Add(dm.smtPreislisten.FieldByName('DATUM_VON').AsString); erzeugt einen Eintrag bei Items ohne angehängtes Objekt.
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.
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
Mazen

Registriert seit: 6. Okt 2011
66 Beiträge
 
Delphi 7 Professional
 
#3

AW: TComboBox.AddObject - Adressverletzung

  Alt 5. Jun 2013, 10:07
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?
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: TComboBox.AddObject - Adressverletzung

  Alt 5. Jun 2013, 10:09
Also ist AddObject so zu verstehen das der erste Parameter der Listeneintrag ist, und der zweite das hinterlegte Objekt?
Ja, genau so ist es.
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#5

AW: TComboBox.AddObject - Adressverletzung

  Alt 5. Jun 2013, 10:09
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Mazen

Registriert seit: 6. Okt 2011
66 Beiträge
 
Delphi 7 Professional
 
#6

AW: TComboBox.AddObject - Adressverletzung

  Alt 5. Jun 2013, 10:10
Super, danke für die flotte Hilfe
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#7

AW: TComboBox.AddObject - Adressverletzung

  Alt 5. Jun 2013, 11:46
Moin...

und wo werden deine erzeugten TPreisliste wieder freigegeben ?
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#8

AW: TComboBox.AddObject - Adressverletzung

  Alt 5. Jun 2013, 12:27
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;
fork me on Github
  Mit Zitat antworten Zitat
Antwort Antwort


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 21:17 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