Problem z ListBoxem - Index Out of Bounds

0

Mam taki kodzik:

procedure Tdodaj_pytanie.addBTNClick(Sender: TObject);
var
  i:integer;
begin
     acceptBTN.enabled := true;
     for  i:=0 to   listbox1.count -1 do
          if listbox1.Selected[i] then
             begin
                  listbox2.Items.Add(listbox1.Items.Strings[i]);
                  listbox1.Items.Delete(i);
                  INC(licznik);
             end;
end;

Zainstalowałem nowego Lazarusa - 1.0, stary(0.9.4) się popsuł :) I teraz, gdy chcę przerzucić coś z jednego listboxa do drugiego, to za każdym razem dostaję index out of bounds(z wyjątkiem ostatniego elementu). Widzi ktoś błąd w tym kodzie?

btw Do ListBox1 wczytywane jest 15 stringów(0..14)

1
b1tzz napisał(a):

Widzi ktoś błąd w tym kodzie?

Błedu w kodzie jako takiego nie ma, ale błedem jest zastosowanie pętli rosnącej przy jednoczesnym usuwaniu aktualnego elementu. Własność Count odczytywana jest raz na początku pętli, bo tak działa pętla for...to w Pascalu / Delphi. Teraz chyba wszystko jasne skąd bierze się ten bład? Rozwiązaniem jest przede wszystkim czytanie kompendium zanim się o cokolwiek zapyta i pytanie o podstawy w dziale Newbie. A rozwiązaniem w kodzie jest skorzystanie albo z pętli malejącej albo z repeat ... until.

0

Oczywiście że widzi ponieważ usuwasz pozycję z listy podczas wykonywania pętli.
Co można zrobić:
a) odwrócić pętlę tak aby wykonywała się od listbox1.count do 0
b) nie bawić się w pętle tylko użyt gotowego rozwiązania (o ile takie coś ma Lazarus):

ListBox1.MoveSelection(ListBox2);

lub

ListBox1.CopySelection(ListBox2);
ListBox1.DeleteSelected;

EDIT//
@olesio już mnie uprzedził
EDIT2//Sprawdziłem nie ma :(

0

EDIT2//Sprawdziłem nie ma

To zarequestuj feature, możesz dodać że w Delphi jest i wtedy to będzie rozwiązywane jako zgodnościowy ficzur. Albo... Dodaj samemu? Trudna sprawa to to nie jest. Potem możesz na mantis wrzucić patch, pewnie przyjmą...

0

Dziwne jest to, że dopiero w 1.0 zaczęło mi wywalać błąd. Wcześniej nie było problemu. Dzięki Panowie :)

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