Dodawanie wartości z listbox jako item.caption listview w pętli for

0

Witam,
mój problem wygląda następująco: mam na formie komponent listbox1 do którego wcześniej dodałem kilka wierszy (nazwy plików). Chciałbym dodać te wartości jako nazwy itemów do listview (każda kolejna wartość do nowego itema). Napisałem taki kod:

 
procedure TForm1.Button4Click(Sender: TObject);
var
  Item: TListItem;
   i :integer;
begin
   for i:=0 to listbox1.Count-1 do
  Item := ListView1.Items.Add;
  Item.Caption := listbox1.items.strings[listbox1.itemindex];
 //próbowałem zamiast "listbox1.itemindex" dawać "i" ale nic to nie daje

  Item.SubItems.Add(combobox1.items[combobox1.itemindex]);
  Item.SubItems.Add(combobox2.items[combobox2.itemindex]);
  Item.SubItems.Add(combobox3.items[combobox3.itemindex]);
  Item.SubItems.Add(combobox4.items[combobox4.itemindex]);
  Item.SubItems.Add(edit1.Text);
  
end;

Dodam że ta sama procedura bez pętli i z wartością

 Item.Caption:= listbox1.items.strings[0];

działa poprawnie-dodaje jedną wartość do listview. Natomiast gdy próbuję zrobić dodawanie w pętli zwraca błąd: index of out bounds(2)
Nie wiem w którym miejscu robię błąd, proszę pomóżcie

1

Po 1: Poczytaj o pętlach i bloku begin ... end, to zrozumiesz jaki błąd zrobiłeś. Po 2: przy Items nie potrzeba strings, bo to jest tak zwane "default property". Po 3: jeżeli nie zmieniasz ItemIndex to może on wynosić -1, więc chyba lepiej posługiwać się zmienną iteratora pętli.

0

Dzięki chłopie! Tak długo już patrzyłem w ten kod, że przestałem go widzieć. Wystarczyły trzy zdania trafnej porady.
Poprawiony i działający kod (nie to żebym zaśmiecał forum, ale takim laikom jak ja może troszkę rozjaśnić umysł):

procedure TForm1.Button4Click(Sender: TObject);
var
  Item: TListItem;
   i :integer;
begin
   for i:=0 to listbox1.Count-1 do
      begin
      Item := ListView1.Items.Add;
      Item.Caption := listbox1.items[i];
      Item.SubItems.Add(combobox1.items[combobox1.itemindex]);
      Item.SubItems.Add(combobox2.items[combobox2.itemindex]);
      Item.SubItems.Add(combobox3.items[combobox3.itemindex]);
      Item.SubItems.Add(combobox4.items[combobox4.itemindex]);
      Item.SubItems.Add(edit1.Text);
 end;
end; 
0

Tak długo już patrzyłem w ten kod, że przestałem go widzieć.

A mnie się wydaję, że chyba teorii Ci brak bo ktoś, kto zna podstawy nie ma mowy, żeby zapomniał begin .. end wiedząc, że w pętli będzie wykonywanych kilka instrukcji :]


Dodam jeszcze, że możesz wykorzystać funkcję FindComponent w przypadkach, gdy potrzebujesz w pętli odwoływać się do kontrolek o takiej samej nazwie, ale innym numerze, np. Label1, Label2, Label3 itd.;

W Twoim kodzie także można go zastosować, choćby tak:

procedure TForm1.Button4Click(Sender: TObject);
var
  Combo: TComboBox;
  Item: TListItem;
  I, J: Integer;
begin
  for I := 0 to Listbox1.Count - 1 do
    begin
      Item := ListView1.Items.Add();
      Item.Caption := listbox1.items[I];

      for J := 1 to 4 do
        begin
          Combo := FindComponent('ComboBox' + IntToStr(J));
          Item.SubItems.Add(Combo.Items[Combo.ItemIndex]);
        end;

      Item.SubItems.Add(Edit1.Text);
    end;
end;

Można także wykluczyć zmienną Combo przez dwukrotne rzutowanie;

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