W ComboBox mamy id i nazwę elementu - jak odczytać tylko id?

0

Cześć i przy okazji udanego weekendu.
Mam pytanie Dodaje do ComboBoxa z moich danych dwie rzeczy(obie są ze sobą ściśle powiązane) jedna jest tupu integer (liczba porządkowa) oraz string "name"(bardziej informacyjna mnie, użytkownika aplikacji) coś takiego:

ComboBox1.Items.Add(IntToStr(lCategories[i].categoryId) + ': ' +  lCategories[i].name)

wygląda to tak np.:

1: kategoria1

problem polega na tym że dalej potrzebuję użyć tylko id czyli (Category.Id)

np. dla ułatwienia użyje Labela

Label. Caption := ComboBox1.Text // jak wyświetlić tylko id   

Ale czy jest sposób na to by jak dodałam do tego string(w celach informacyjnych gdyż id raczej nic nie mówi) w Labelu wyświetlić tylko Id
Tak mogłabym się odnieść po prostu do numeru indeksa ComboBoxa i w większości przypadków było by po sprawie, ale może się zdarzyć że będzie tak
0: kategoria0
1: kategoria1
2: kategoria2
10: kategoria10

więc 10 nie będzie równać się 3 a potrzebuję wyświetlić w Labelu to 10

Jak to zrobić ?

1
label.caption := leftstr(ComboBox1.Text, pos(':', ComboBox1.Text) - 1);
5

Nie ma co się bawić w przechowywanie ID kategorii jako jawny tekst w ComboBox po to aby a później w wyciąganie tego ID. Po mojemu lepiej dodać tak:

ComboBox1.Items.AddObject(lCategories[i].name, TObject(lCategories[i].categoryId));

A pobrać można w ten sposób:

Label.Caption:= IntToStr(Integer(ComboBox1.Items.Objects[ComboBox1.ItemIndex]));
0

Tak jak to pokazał @kAzek to najlepsze rozwiązanie. Trzeba się tylko zabezpieczyć przed odczytem, czy aby na pewno zostało coś wybrane z tego ComboBoxa, ponieważ jeśli nic nie będzie wybrane, to ItemIndex będzie równe -1 i wywali nam błąd Index Out Of Range.

0

Więc tak jak @kAzek pokazał dodałam do ComboBoxa to było wystarczające na jedną z dwóch potrzeb. Teraz mam tą drugą trudniejszą. Teraz wybieramy z ComboBox jedną z kategorii którą dodałam sposobem kAzka i i pasujące do tejże kategorii elementy mające to samo CategoryId ("description" jako tekst jawny a Id nie widoczny) chce dodać do Listboxa

Sytuacja jest identyczna, problem jak z ComboBox + wybór z listy(która przefiltruję i doda odpowiednie dane do Listboxa) z tym że teraz w Listboxie tekstem jawnym jako element (widoczny) to byłby ""lExpr.descriptioni", a dalej z Listboxa potrzebuję użyć tylko "lExpr.id które jest powiązane z "lExpr.descriptioni" i razem mają jakieś CategoryId po którym właśnie chce przefiltrować dane.

Czyli mniej więcej tak to wygląda to po kodzie tak tylko w moim nic się nie dzieje ale nie ma też błędów. Więc coś ominęłam, nie wiem co. Wybaczcie to jest skomplikowane nawet tłumacząc.

 I ,j : Integer;
  lExpressions: TExpressionsArray;
  lExpr: TExpression;
  categoryOk : Boolean;
begin
  lExpressions := idictionary.expressionsArray;
  ListBox1.Items.BeginUpdate;
  try
    ListBox1.Items.Clear;

    for I := 0 to high(lExpressions) do
    begin
      categoryOk := false;
      lExpr := lExpressions[I];


        for J := 0 to ComboBox2.Items.Count - 1 do
        begin
        if TCategory(ComboBox2.Items.Objects[J]).CategoryId = lExpr.CategoryId then
          begin
            categoryOk := true;
            Break;
          end;
        end;


      if categoryOk  then
      self.ListBox1.Items.Addobject(lExpr.description, lExpr);
    end;

    if self.ListBox1.Items.Count > 0 then
    begin
      self.ListBox1.ItemIndex := 0;
    end;
  finally
    ListBox1.Items.EndUpdate;
  end;
end;

1

Nie wiem może jestem trochę zaspany i czegoś nie zrozumiałem ale zgodnie z tym co piszesz to w ComboBox już jest wybrana jakaś pozycja i jej kategoria to po co pętla po ComboBox?
Masz "przelecieć" tylko po TExpressionsArray i dodać do ListBox tylko pozycje z odpowiednią kategorią coś w stylu:

  I: Integer;
  lExpressions: TExpressionsArray;
  lExpr: TExpression;
begin
  if ComboBox2.ItemIndex =-1 then exit; //nie wybrano pozycji z ComboBox
  lExpressions := idictionary.expressionsArray;
  ListBox1.Items.BeginUpdate;
  try
    ListBox1.Items.Clear;

    for I := 0 to high(lExpressions) do
    begin
      lExpr := lExpressions[I];
      if TCategory(ComboBox2.Items.Objects[ComboBox2.ItemIndex]).CategoryId = lExpr.CategoryId then
        self.ListBox1.Items.Addobject(lExpr.description, lExpr);
    end;

    if self.ListBox1.Items.Count > 0 then
    begin
      self.ListBox1.ItemIndex := 0;
    end;
  finally
    ListBox1.Items.EndUpdate;
  end;
end;

Jakoś tak, mogą być drobne błędy. Kod pisany bez kompilatora zresztą i tak by mi się nie skompilował bo nie wiem co to TExpression i TExpressionArray (domyślam się, że to jakiś obiekt i tablica obiektów) . Poza tym tak naprawdę chyba nie potrzebujesz pomocniczych zmiennych lExpressions i lExpr (zwłaszcza tej pierwszej) ale niech już będą...

0

Działa Dziękuję po małej przeróbce. Mam tylko jeszcze mały problemik, chodzi o sposób dodania do combboxa

jeśli mam moim sposobem:

ComboBox2.Items.AddObject( lCategories[I].name,  lCategories[I]);

to teraz wszystko działa ale w zależności od sposoby wyboru działania(w aplikacji) potrzebuję użyć tego Twojego sposobu

ComboBox2.Items.AddObject(lCategories[i].name, TObject(lCategories[i].categoryId));

Lecz teraz wybierając pozycje z ComboBoxa nie potrafię nic dodać do Listboxa więc dodałam całe lCategories jako Tobject:(nie wie czy dobrze) poniżej:

ComboBox2.Items.AddObject( lCategories[I].name,  TObject(lCategories[I])); 

nie wiem teraz tylko jak pobrać bo muszę podać dokładnie lCategories.categoryId, gdyż dodałam wszystko co kryje się pod lCategories jako TObject.
Więc by pobrać zrobiłam tak:

Label9.Caption:= IntToStr(Integer(ComboBox2.Items.Objects[lCategories[ComboBox2.ItemIndex].categoryId]));

Lecz wywala mi błąd AV który będzie w którejś z tych dwóch linii wyżej ale nie wiem jak to poprawnie powinno wyglądać

1

Powinno tak zadziałać:

Label9.Caption:= IntToStr(TCategory(ComboBox2.Items.Objects[ComboBox2.ItemIndex]).categoryId);

Oczywiście zgaduję, że dodany obiekt (pozycja z listy czy tam tablicy lCategories) jest typu TCategory. W każdym razie musisz rzutować na właściwy typ dla całego dodanego obiektu (czyli pojedynczej pozycji z lCategories).

0

Dziękuje Bardzo działa :)

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