Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi ComboBox : String aus Items.Object auslesen (https://www.delphipraxis.net/61159-combobox-string-aus-items-object-auslesen.html)

teekay 17. Jan 2006 17:26


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:
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;
Die Daten der Textdatei sehen folgendermaßen aus:
Zitat:

Name1;11001#
Name2;11002#
Name3;11003#
...
TObject als String aus dem gewählten Eintrag auslesen und weiterverarbeiten
Delphi-Quellcode:
procedure TMain_frm.Button1Click(Sender: TObject);
begin
  if Combo_Port.ItemIndex > -1 then
    Showmessage(String(Combo_Port.Items.Objects[Combo_Port.ItemIndex]));
end;
So, und genau hier ist mein Problem :

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 :
http://www.delphipraxis.net/internal...=181907#181907

aufgefallen ist mir das beim Ändern der LPersonalnummer in :
Delphi-Quellcode:
LPersonalnummer := '11003' + IntToStr(5);
die Daten genauso sinnfrei ausgegeben werden wie bei mir...
wenn ihr eine Idee habt würde mich das sehr freuen

mfG TeeKay

marabu 17. Jan 2006 18:07

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:
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;
Grüße vom marabu

teekay 17. Jan 2006 18:38

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