![]() |
ComboBox : String aus Items.Object auslesen
Hallo!
ich brauch mal wieder einen Denkanstoss! Folgendes Problemchen : Ich möchte Daten in eine ComboBox laden. Zu jedem Item soll es einen weiteren "Subitem" geben der nicht angezeigt wird. So weit so gut. (ComboBox Style : csDropDown) Items adden :
Delphi-Quellcode:
Die Daten der Textdatei sehen folgendermaßen aus:
procedure fill_combo;
var F : TextFile; Zeile : String; str_Name, str_Port : String; Pos_delimiter : Integer; begin AssignFile(F, ChangeFileExt(Application.ExeName, '.dat')); Reset(F); while not eof(F) do begin Readln(F,Zeile); Pos_delimiter := Pos(';', Zeile); if Pos_delimiter <> 0 then begin str_Name := AnsiLeftStr(Zeile, Pos_delimiter - 1); Delete(Zeile,1, Pos_Delimiter); Pos_delimiter := Pos('#', Zeile); if Pos_delimiter <> 0 then begin str_Port := AnsiLeftStr(Zeile, Pos_delimiter - 1); with Main_frm.Combo_Port do begin Items.AddObject(str_Name, TObject(str_Port)); end; end; end; end; CloseFile(F); end; Zitat:
Delphi-Quellcode:
So, und genau hier ist mein Problem :
procedure TMain_frm.Button1Click(Sender: TObject);
begin if Combo_Port.ItemIndex > -1 then Showmessage(String(Combo_Port.Items.Objects[Combo_Port.ItemIndex])); end; Als Ergebnis erhalte ich entweder keine oder nur kryptische werte oder auch mal eine Zugriffsverletzung - ich kann den Fehler einfach nicht nachvollziehen Interssanterweise funktioniert das Beispiel bei mir einwandfrei : ![]() aufgefallen ist mir das beim Ändern der LPersonalnummer in :
Delphi-Quellcode:
die Daten genauso sinnfrei ausgegeben werden wie bei mir...
LPersonalnummer := '11003' + IntToStr(5);
wenn ihr eine Idee habt würde mich das sehr freuen mfG TeeKay |
Re: ComboBox : String aus Items.Object auslesen
Hallo TK,
wenn du in einer Schleife die lokale Variable str_Port befüllst, wird sich deren Adresse auf dem Heap nicht ändern - also wirst du immer die selbe Adresse als Object in deine ComboBox-Strings laden. Und da durch den typecast später keiner außer dir weiß, dass der Zeiger einen string repräsentieren soll, wird der reference count der string variable ordnungsgemäß dekrementiert und der Speicher beim Verlassen deiner procedure freigegeben. Später dann greifst du ins Nirvana und dann knallt es manchmal. Häng deine Port Adressen lieber so rein:
Delphi-Quellcode:
Grüße vom marabu
procedure fill_combo;
//... Items.AddObject(str_Name, TObject(StrToInt(str_Port))); //... procedure TMain_Frm.Button1Click(Sender: TObject); begin with Combo_Port do if ItemIndex > -1 then Showmessage(IntToStr(Integer(Items.Objects[ItemIndex]))); end; |
Re: ComboBox : String aus Items.Object auslesen
Hallo Marabu!
ich danke dir für deine schnelle Hilfe. Es hat wunderbar funktioniert. ich denke mal ich muss mich mit dieser Materie noch intensiver beschäftigen... thx TeeKay |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:07 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