Pobranie wartości wybranego elementu z TComboBox

0

Do TComboBox zostały dodane elementy z tekstem i wartością:

category_name_combobox.Items.AddObject(category_name, TObject(id));

Jak wyciągnąć wartość wybranego elementu z TComboBox ?

3

Items to TStrings, ma toto właściwość Objects[].
Indeks wybranego elementu ComboBoxa ustawiasz/odczytujesz przez ItemIndex (TComboBox.ItemIndex); uwaga - może zwrócić "-1" jeśli żadna pozycja nie jest wybrana.

0

Jak chce odczytać wartość z tego wyrażenia:

category_name_combobox.Items.Objects[category_name_combobox.ItemIndex].ToString

otrzymuje błąd access violation. Jak poprawnie odczytać wartość ?

0

Jako obiekt dodajesz TObject(id). Co to jest "id"? Czy to jest obiekt posiadający metodę "ToString" czy zwyczajnie rzutujesz jakiegoś Integera? Jeśli to drugie - to rzutuj go w drugą stronę przy odczycie obiektu i będziesz miał swoja liczbę.

0

Te "id" to wartość string. Zrzutowałem obiekt do wartości typu string i jest już dobrze.

1

Nie trzymaj obiektów w komponencie, a w osobnej liście generycznej.

datalux napisał(a):

Jak chce odczytać wartość z tego wyrażenia:

category_name_combobox.Items.Objects[category_name_combobox.ItemIndex].ToString

otrzymuje błąd access violation. Jak poprawnie odczytać wartość ?

ItemIndex może posiadać wartość -1, kiedy żaden item nie jest zaznaczony i wtedy wykraczasz poza zakres. Dlatego zawsze przed użyciem wartości tej właściwości jako indeksu, najpierw należy sprawdzić, czy jest różna od -1.

1

dodając obiekt musisz też podać wartość tekstową pozycji, więc:

if category_name_combobox.ItemIndex >= 0 then
  category_name_combobox.Items.Strings[category_name_combobox.ItemIndex];
0
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
if ComboBox1.ItemIndex < 0 then Showmessage('Nie wybrano żadnego elementu z listy !!! Wybierz go teraz !!!');
if ComboBox1.ItemIndex < 0 then Exit;
end;
2

@Mariusz Bruniewski:

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
if ComboBox1.ItemIndex < 0 then Showmessage('Nie wybrano żadnego elementu z listy !!! Wybierz go teraz !!!');
if ComboBox1.ItemIndex < 0 then Exit;
end;

jeśli już to tak bym to napisał:

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  if ComboBox1.ItemIndex < 0 then 
      Showmessage('Nie wybrano żadnego elementu z listy !!! Wybierz go teraz !!!');
end;

bezsensownie dwa razy sprawdzasz ten sam warunek, a przez to prosty kod staje się mniej logiczny i czytelny. Do tego zupełnie bezsensowny exit, który po drugim if niejawnie wykona się zawsze, niezależnie od warunku w if.
W sumie to bardzo dobry przykład jak nie należy pisać kodu

0

@grzegorz_so bo to Exit miało powstrzymać dalsze wykonanie procedury np. Kiedy wpiszesz to co jest poza tym co znajduje się w liście komponentu ComboBox1. Otrzymasz komunikat o niepoprawnym wyborze z listy.

procedure TForm1.ComboBox1Change(Sender: TObject);
var
i : integer;
begin
  if ComboBox1.ItemIndex < 0 then Showmessage('Nie wybrano poprawnie wskazanego elementu z listy !!! Wybierz go teraz !!!');
  if ComboBox1.ItemIndex < 0 then Exit;

  // To się nie utworzy to co poniżej
  i := ComboBox1.ItemIndex;
  Showmessage(ComboBox1.items[i]);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ComboBox1.Items.Add('1');
  ComboBox1.Items.Add('2');
  ComboBox1.Items.Add('3');
  ComboBox1.Items.Add('4');
  ComboBox1.Items.Add('5');
end;

1

@Mariusz Bruniewski:

bo to Exit miało powstrzymać dalsze wykonanie procedury

Po pierwsze w Twoim kodzie nic nie było po exit, tym samym exit był niepotrzebny. Komentuję to co napisałeś.
Po drugie wciąż masz bezsensowny dwukrotny if .
Nie uważasz że poniższy zapis wygląda lepiej ?

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  if ComboBox1.ItemIndex < 0 then 
        Showmessage('Nie wybrano poprawnie wskazanego elementu z listy !!! Wybierz go teraz !!!')
  else
        Showmessage(ComboBox1.items[ ComboBox1.ItemIndex])
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1