Ĺadny brzuch
Witajcie, w swoim programi mam komponent TCheckListBox, do którego wczytuję bardzo dużo (nawet dziesiątki tysięcy) pozycji. Problem polega na tym, że po zakończeniu tej operacji pojawia się komunikat "List index out of bounds (liczba elementow)".
Jest jakiś sposób aby ów irytujący komunikat nie pojawiał się ?
A może pokażesz ten fragment kodu?
Witajcie, w swoim programi mam komponent TCheckListBox, do którego wczytuję bardzo dużo (nawet dziesiątki tysięcy) pozycji. Problem polega na tym, że po zakończeniu tej operacji pojawia się komunikat "List index out of bounds (liczba elementow)".
Jest jakiś sposób aby ów irytujący komunikat nie pojawiał się ?
Wyczytuj z kilku procedur
Jest jeden niezawodny. Umieścić cały kod w bloku try //(tu twój kod) except on E:Exception begin //musi być pusto, bo ma nic nie robić end;
Jest jeden niezawodny. Umieścić cały kod w bloku try //(tu twój kod) except on E:Exception begin //musi być pusto, bo ma nic nie robić end;
To wywoła wyjątek bez komentarza. Nie jest to żadne rozwiązanie. Tego typu komunikaty wychodzą przy zbyt dużych procedurach. Rozwiązanie polega na rozbicie kodu na kilka procedur - od i cały problem.
Tak, ale łatwiej jest zrobić tak jak mówiłem - nie każdy ma ochotę na rozbijanie całego kodu na kilka procedur, a w niektórych wypadkach wręcz się nie da.
No spróbuj rozbić taki kod na kilka procedur:
procedure Button1.Click(Sender:TObject); var i:Int64; begin i:=0; for i:=0 to 999999999 do begin CheckList1.Items.Add(IntToStr(i)); end; end;
No i (Eu)geniuszu co zrobisz, żeby tego komunikatu nie pokazywało, ale wyświetlało wszystkie 999999999 elementów po kolei? Nic, tylko try...except. Zresztą w tej procedurze raczej żaden poważny błąd nie występuje, więc to można zaakceptować.
Tak, ale łatwiej jest zrobić tak jak mówiłem - nie każdy ma ochotę na rozbijanie całego kodu na kilka procedur, a w niektórych wypadkach wręcz się nie da.
No spróbuj rozbić taki kod na kilka procedur:
procedure Button1.Click(Sender:TObject); var i:Int64; begin i:=0; for i:=0 to 999999999 do begin CheckList1.Items.Add(IntToStr(i)); end; end;
No i (Eu)geniuszu co zrobisz, żeby tego komunikatu nie pokazywało, ale wyświetlało wszystkie 999999999 elementów po kolei? Nic, tylko try...except. Zresztą w tej procedurze raczej żaden poważny błąd nie występuje, więc to można zaakceptować.
Jesteś obezwładniający jak to się nie da? A co stoi na przeszkodzie aby wywołać w każdej procedurze pętle for z innym zakresem? Ale nie w tym rzec. Tu chodzi o to, że procura jest za duża. Twój podany program jest zbyt duży aby jakkolwiek to zrobić (procek i pamięć nie wydolą)
Użytkownik statjacek edytował ten post 10 październik 2008, 10:38
Hm z ciekawości uprościłem procedurę wczytywania i ten sam błąd mi się pojawia, w pliku z którego wczytuję znajduje się jedynie kilka linii:
procedure TForm1.Button1Click(Sender: TObject); var text, temp : string; I : integer; begin if OpenDialog.Execute then begin lista.Items.LoadFromFile(OpenDialog.FileName); for I := 0 to (Lista.Items.Count -1) do begin (*) text := Lista.items[I]; if text[1] = '#' then lista.Items.Delete(i); end; end; end;
kompilator zaznacza na czerwono linijkę w której jest (*)
// @down: Kozack, racja, tylko pogorszyłem sprawę, starałem się pomóc, ale nie zawsze wychodzi. :) Do kasacji.
Użytkownik Petermechanic edytował ten post 12 październik 2008, 19:45
hmm ale czy przypadkiem typ String nie jest tj tablicą do której wczytujemy inne stringi ?
czy w tym przypadki mam rozumiec ze jest to tablica stringow ?
hmm ale czy przypadkiem typ String nie jest tj tablicą do której wczytujemy inne stringi ?
czy w tym przypadki mam rozumiec ze jest to tablica stringow ?
tak
tak
NIE. Zmienna przybiera różne wartości. Błąd leży w text[I] := Lista.items.strings[I];
Zmienna nie może mieć takiej nazwy. Zmień nazwę zmiennej.
Petermechanik: if text[1] = '#' then lista.Items.Delete(i);
Co ma to do rzeczy? Gdyby nie nazwa zmiennej ib by sprawdzał pierwszy znak w zmiennej text. Ale to jest nieprawidłowa nazwa zmiennej.
Użytkownik statjacek edytował ten post 12 październik 2008, 16:31
Rave: cudowna metoda "usuwania" błędów poprzez ukrywanie komunikatów błędu. Pięknie. A co zrobić, żeby komunikatu nie pokazywało? Usunąć przyczynę.
TomkoV: na samym początku napisałem, żebyś podał kod. Nie podałeś, więc nikt nie wie o co chodzi, ale wszyscy starają się na siłę rozwiązać Twój problem. Kompilator zaznacza linię, w której próbujesz odwołać się do elementu listy. Błąd sugeruje, że indeks przekazywany do operatora [] jest nieprawidłowy (out of bounds), czyli mniejszy niż 0 albo większy lub równy maksymalnej ilości elementów. Rozwiązanie:
Since Delete changes the ordinal position of the remaining items in the list, when deleting items from the list using the for loop you need to start iterating from the end of he list.
http://delphi.about....tbox_delete.htm
Petermechanic: nie udzielaj odpowiedzi, jeżeli nie rozumiesz do końca pewnych rzeczy, bo tylko wprowadzasz niepotrzebne zamieszanie. Po pierwsze, "TListBox.Items[0] == TListBox.Items.Strings[0]". Po drugie, "text : String" oraz "text[I] := Lista.items.strings[I]". Skoro "text" to tablica znaków (String), a "Lista.Items" to tablica stringów (TStrings), to jakim sposobem chcesz przypisać stringa do znaku? Po trzecie, pomijając poprzednie błędy, najpierw przypisujesz do i-tego elementu tablicy wartości (text[I]), a potem sprawdzasz ciągle pierwszy element (text[1]).
Użytkownik Kozack edytował ten post 12 październik 2008, 18:05
http://delphi.about....tbox_delete.htm
I to wlasnie pomoglo, po prostu musialem rozpocząć pętlę od końca listy. W ogóle dziwne wydało mi się że zmienna text musi mieć [i]
( text[i] := Lista.items.Strings[i]; ) bo nigdy wcześniej tak nie robiłem (zawsze było to text := Lista.items[i] i działało) . Zresztą, owy sposób zapisu był niepoprawny z tego co krzyczał komunikator (CodeRAD 2007) Fakt faktem dzięki za pomoc chłopaki !
Użytkownik TomkoV edytował ten post 12 październik 2008, 18:46
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Jest jakiś sposób aby ów irytujący komunikat nie pojawiał się ?
A może pokażesz ten fragment kodu?
Witajcie, w swoim programi mam komponent TCheckListBox, do którego wczytuję bardzo dużo (nawet dziesiątki tysięcy) pozycji. Problem polega na tym, że po zakończeniu tej operacji pojawia się komunikat "List index out of bounds (liczba elementow)".
Jest jakiś sposób aby ów irytujący komunikat nie pojawiał się ?
Wyczytuj z kilku procedur
Jest jeden niezawodny. Umieścić cały kod w bloku try //(tu twój kod) except on E:Exception begin //musi być pusto, bo ma nic nie robić end;
Jest jeden niezawodny. Umieścić cały kod w bloku try //(tu twój kod) except on E:Exception begin //musi być pusto, bo ma nic nie robić end;
To wywoła wyjątek bez komentarza. Nie jest to żadne rozwiązanie. Tego typu komunikaty wychodzą przy zbyt dużych procedurach. Rozwiązanie polega na rozbicie kodu na kilka procedur - od i cały problem.
Tak, ale łatwiej jest zrobić tak jak mówiłem - nie każdy ma ochotę na rozbijanie całego kodu na kilka procedur, a w niektórych wypadkach wręcz się nie da.
No spróbuj rozbić taki kod na kilka procedur:
procedure Button1.Click(Sender:TObject); var i:Int64; begin i:=0; for i:=0 to 999999999 do begin CheckList1.Items.Add(IntToStr(i)); end; end;
No i (Eu)geniuszu co zrobisz, żeby tego komunikatu nie pokazywało, ale wyświetlało wszystkie 999999999 elementów po kolei? Nic, tylko try...except. Zresztą w tej procedurze raczej żaden poważny błąd nie występuje, więc to można zaakceptować.
Tak, ale łatwiej jest zrobić tak jak mówiłem - nie każdy ma ochotę na rozbijanie całego kodu na kilka procedur, a w niektórych wypadkach wręcz się nie da.
No spróbuj rozbić taki kod na kilka procedur:
procedure Button1.Click(Sender:TObject); var i:Int64; begin i:=0; for i:=0 to 999999999 do begin CheckList1.Items.Add(IntToStr(i)); end; end;
No i (Eu)geniuszu co zrobisz, żeby tego komunikatu nie pokazywało, ale wyświetlało wszystkie 999999999 elementów po kolei? Nic, tylko try...except. Zresztą w tej procedurze raczej żaden poważny błąd nie występuje, więc to można zaakceptować.
Jesteś obezwładniający jak to się nie da? A co stoi na przeszkodzie aby wywołać w każdej procedurze pętle for z innym zakresem? Ale nie w tym rzec. Tu chodzi o to, że procura jest za duża. Twój podany program jest zbyt duży aby jakkolwiek to zrobić (procek i pamięć nie wydolą)
Użytkownik statjacek edytował ten post 10 październik 2008, 10:38
Hm z ciekawości uprościłem procedurę wczytywania i ten sam błąd mi się pojawia, w pliku z którego wczytuję znajduje się jedynie kilka linii:
procedure TForm1.Button1Click(Sender: TObject); var text, temp : string; I : integer; begin if OpenDialog.Execute then begin lista.Items.LoadFromFile(OpenDialog.FileName); for I := 0 to (Lista.Items.Count -1) do begin (*) text := Lista.items[I]; if text[1] = '#' then lista.Items.Delete(i); end; end; end;
kompilator zaznacza na czerwono linijkę w której jest (*)
// @down: Kozack, racja, tylko pogorszyłem sprawę, starałem się pomóc, ale nie zawsze wychodzi. :) Do kasacji.
Użytkownik Petermechanic edytował ten post 12 październik 2008, 19:45
hmm ale czy przypadkiem typ String nie jest tj tablicą do której wczytujemy inne stringi ?
czy w tym przypadki mam rozumiec ze jest to tablica stringow ?
hmm ale czy przypadkiem typ String nie jest tj tablicą do której wczytujemy inne stringi ?
czy w tym przypadki mam rozumiec ze jest to tablica stringow ?
tak
tak
NIE. Zmienna przybiera różne wartości. Błąd leży w text[I] := Lista.items.strings[I];
Zmienna nie może mieć takiej nazwy. Zmień nazwę zmiennej.
Petermechanik: if text[1] = '#' then lista.Items.Delete(i);
Co ma to do rzeczy? Gdyby nie nazwa zmiennej ib by sprawdzał pierwszy znak w zmiennej text. Ale to jest nieprawidłowa nazwa zmiennej.
Użytkownik statjacek edytował ten post 12 październik 2008, 16:31
Rave: cudowna metoda "usuwania" błędów poprzez ukrywanie komunikatów błędu. Pięknie. A co zrobić, żeby komunikatu nie pokazywało? Usunąć przyczynę.
TomkoV: na samym początku napisałem, żebyś podał kod. Nie podałeś, więc nikt nie wie o co chodzi, ale wszyscy starają się na siłę rozwiązać Twój problem. Kompilator zaznacza linię, w której próbujesz odwołać się do elementu listy. Błąd sugeruje, że indeks przekazywany do operatora [] jest nieprawidłowy (out of bounds), czyli mniejszy niż 0 albo większy lub równy maksymalnej ilości elementów. Rozwiązanie:
Since Delete changes the ordinal position of the remaining items in the list, when deleting items from the list using the for loop you need to start iterating from the end of he list.
http://delphi.about....tbox_delete.htm
Petermechanic: nie udzielaj odpowiedzi, jeżeli nie rozumiesz do końca pewnych rzeczy, bo tylko wprowadzasz niepotrzebne zamieszanie. Po pierwsze, "TListBox.Items[0] == TListBox.Items.Strings[0]". Po drugie, "text : String" oraz "text[I] := Lista.items.strings[I]". Skoro "text" to tablica znaków (String), a "Lista.Items" to tablica stringów (TStrings), to jakim sposobem chcesz przypisać stringa do znaku? Po trzecie, pomijając poprzednie błędy, najpierw przypisujesz do i-tego elementu tablicy wartości (text[I]), a potem sprawdzasz ciągle pierwszy element (text[1]).
Użytkownik Kozack edytował ten post 12 październik 2008, 18:05
http://delphi.about....tbox_delete.htm
I to wlasnie pomoglo, po prostu musialem rozpocząć pętlę od końca listy. W ogóle dziwne wydało mi się że zmienna text musi mieć [i]
( text[i] := Lista.items.Strings[i]; ) bo nigdy wcześniej tak nie robiłem (zawsze było to text := Lista.items[i] i działało) . Zresztą, owy sposób zapisu był niepoprawny z tego co krzyczał komunikator (CodeRAD 2007) Fakt faktem dzięki za pomoc chłopaki !
Użytkownik TomkoV edytował ten post 12 październik 2008, 18:46