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

2012-10-02 22:25

Rejestracja: 8 lat temu

Ostatnio: 9 godzin temu

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


quidquid Latine dictum sit, altum videtur

Pozostało 580 znaków

2012-10-02 22:32
Moderator

Rejestracja: 11 lat temu

Ostatnio: 4 godziny temu

Lokalizacja: Szczecin

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.


edytowany 1x, ostatnio: olesio, 2012-10-02 22:33

Pozostało 580 znaków

2012-10-02 22:44
Moderator Delphi/Pascal

Rejestracja: 8 lat temu

Ostatnio: 9 godzin temu

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; 

quidquid Latine dictum sit, altum videtur

Pozostało 580 znaków

2012-10-03 02:16
Moderator Delphi/Pascal

Rejestracja: 8 lat temu

Ostatnio: 3 minuty temu

Lokalizacja: Tuchów

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;


Pozostało 580 znaków

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