Problem w petli for.. do

0

Mam procedurke, która ma czyścić ekran ze wszystkich komponentów danego typu.

for i:=1 to main.componentcount do
begin
if main.components[i-1] is tziemia then main.components[i-1].free;
end;

proste jak drut, więc dlaczego nie działa? Wyrzuca mi błąd index out of bounds (x) (w nawiasie są różne liczby)...

Pomocy...

0

Zalozmy, ze masz 2 komponenty o indexach 0 i 1. ComponentCount wynosi 2. Usuniesz komponent o indexie 0 i zostaje ci 1 komponent. Bedzie on mial index 0 (nie ma juz pierwszego komponentu), a petla bedzie chciala usunac kolejny komponent o indexie 1, ktorego nie ma (jest ale pod indexem 0). Z tad ten blad.
Petla musi odliczac w dol:

for i := main.componentcount -1 downto 0 do
if main.components[i] is tziemia then main.components[i].free;

[dopisane]
Thx pq juz poprawilem [wstyd]

0

for i:=Pred(Main.ComponentCount) downto 0 do
if Main.Components[i] is TZiemia then Main.Components[i].Free;

Komentarz: zwróć uwagę, że jeśli masz 10 komponentów i np. zwolnisz komponent 3, to liczba komponentów zmniejsza się do 9. A pętla będzie chodziła do 10 bo granice pętli są ustalane przed jej rozpoczęciem i więcej nie kontrolowane. Daltego taka pętla musi iść w dół.

//pozdrowka matrox, zapominales o downto :)

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