Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Lazarus -StringList

Zdar.
Mam text soubor, který načtu do StringListu.
Potřebují ho projit po řadcich a odstranít všechny řadky, ktere obsahují určite slovo. Třeba ahoj.

Toto funguje


for i  := 0 to TS.Count-1 do
  begin
    s:= TS.Strings[i];
    IF pos('ahoj',s) <> 0 then  showmessage('je to tam');                             
  end;                               

Toto už ne.


for i  := 0 to TS.Count-1 do
  begin
    s:= TS.Strings[i];
    IF pos('Připojeno',s) <> 0 then TS.Delete(i);                                
  end;              

Vyhodi to chybu List index (268) out of bounds.
Asi tušim čim to je, pokažde, když smažu řadek, tak se sniži TS.Count

Jak na to?
Děkují.

Řešení:

Áno, zmazaním riadku sa Ti zakaždým mení index...
Prechádzaj od konca na začiatok, nie od začiatku po koniec ako to robíš Ty...

for i := TS.Count - 1 downto 0 do
begin
...
Předmět Autor Datum
Áno, zmazaním riadku sa Ti zakaždým mení index... Prechádzaj od konca na začiatok, nie od začiatku p…
pme 12.12.2023 22:11
pme
Dik, ja chtěl na to jít takto, ale někde mam kopanec a nefunguje to. :.( i1 := 0; i:=TS.Count-1; w…
BigSandy 13.12.2023 08:46
BigSandy
To bude tím, že ten while by prošel jenom v případě, že by na začátku byl v listu přesně jeden prvek…
Wikan 13.12.2023 08:52
Wikan
A přes repeat?
BigSandy 13.12.2023 08:54
BigSandy
Problém není v tom, že tam máš while. Ale jeho podmínce.
Wikan 13.12.2023 08:59
Wikan
Na začatku je i1 := 0; TS.Count-1 je třeba 300 while (i1=i) do přikaz while se bude provadět tak dlo…
BigSandy 13.12.2023 10:10
BigSandy
Bude se provádět tak dlouho, dokud se ty hodnoty budou rovnat. A jak vidíš, tak už na začátku se ner…
Wikan 13.12.2023 10:16
Wikan
Ne. Přelož si While jako "pokud" a budeš mít jasno: "Pokud (i1=i), vykonej příkazy"
Zdenál 13.12.2023 10:24
Zdenál
To myslím není přesné. Správně by mělo být "dokud". V tom je rozdíl. Pokud by bylo synonymum pro př…
host 13.12.2023 10:32
host
Dik, funguje. PS: už to mam pořadně prochlastane a nefunguje to jak ma :-D
BigSandy 13.12.2023 11:37
BigSandy
Do cyklu přidejte podmínku if i>= TS.count then break; tím vyskočíte z cyklu pokud se dostanete m…
ml1 13.12.2023 13:11
ml1
Tak když ti indi určují co dostaneš ... :-)
gilhad 13.12.2023 15:35
gilhad
Myšlenka kontroly jestli nejsem mimo (též by šla dělat konstrukcí try....except) je sice dobrá, ale…
Rce 13.12.2023 21:59
Rce
Musíš si uvědomit, že když vymažeš položku ze StringListu, změní jednak StringList.Count a též hodno…
Rce 13.12.2023 21:56
Rce
Nepochopim, jak nekdo misto 2 radkoveho reseni - cyklus od konce dokaze travit cas vymyslenim strank…
Jan Fiala 14.12.2023 05:43
Jan Fiala
Když to potřebují i třidit a vypisovat do vice memo, tak nic jineho nezbyva.
BigSandy 15.12.2023 07:41
BigSandy
Nerozumim. Ty to soucasne mazes, tridis a posilas nekam? Pak to nemusis mazat. Staci, kdyz to cele p… poslední
Jan Fiala 15.12.2023 13:42
Jan Fiala

Do cyklu přidejte podmínku

if i>= TS.count then break;

tím vyskočíte z cyklu pokud se dostanete mimo seznam nebo cokoliv číslovaného (řešil jsem to třeba pro stringgrid nebo listbox).

Mnohokrát jsem to takto vyřešil.

Je to takové nesystémové řešení. Lepší by bylo použít cyklus while a testovat v každém cyklu, jestli nejsme už mimo


ind := 0;
while ind<TS.count do begin
   ....
   inc(ind);
end;

ale na tuhle chybu většinou nemyslím a přijdu na ni až dodatečně a to se mi nechce přepisovat.

Mimochodem poslední roky nerad používám i a j jako iterační proměnné, v lazarusu je to jedno, ale v Matlabu jsou i a j komplexní jednotka a pak je docela zajímavé, když ji mám takto překrytou, hledat, proř nějaký výpočet v komplexních číslech nefunguje. A ještě zajímavější je to naopak, pokud se pokusím indexovat nějaké pole komplexní jednotkou (chyba index must be real positive number mě ale dost rychle přivede na stopu) prostě ze zvyku napíšu pole(i) i když ta proměnná se jmenuje třeba ind jako index.

Musíš si uvědomit, že když vymažeš položku ze StringListu, změní jednak StringList.Count a též hodnoty všech indexů, co následují po vymazané položce. Tudíž procházet od konce je jediné možné řešení, páč tě pak už nezajímá změněný počet položek ani indexy co se mění za zmizelým prvkem.

Nerozumim. Ty to soucasne mazes, tridis a posilas nekam?
Pak to nemusis mazat. Staci, kdyz to cele projdes a posles ven jen to protridene.
A na druhou stranu je uplne jedno, jestli to projdes for cyklem nebo nejakym tebou rizenym while cyklem. I v tom gpr cyklu to muzes filtrovat a posilat do kolika memo chces.

Zpět do poradny Odpovědět na původní otázku Nahoru