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 ?
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 ?
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.
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ść ?
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ę.
Te "id" to wartość string. Zrzutowałem obiekt do wartości typu string i jest już dobrze.
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
.
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];
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;
@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
@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;
@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;