2011-07-25 18 views
5

Mam pole listy lub widok listy z elementami. I mam listę ciągów z tymi samymi elementami (łańcuchami) co pole Lista/Widok listy. Chcę usunąć wszystkie zaznaczone elementy w polu listy/widoku listy z listy ciągów.Usuń ciągi znaków z TStringList

Jak to zrobić?

for i:=0 to ListBox.Count-1 do 
    if ListBox.Selected[i] then 
    StringList1.Delete(i); // I cannot know exactly an index, other strings move up 

Odpowiedz

19
for i := ListBox.Count - 1 downto 0 do 
    if ListBox.Selected[i] then 
    StringList1.Delete(i); 
+0

+1 dla 'Count - 1' :) –

15

Sztuką jest uruchomienie pętli w odwrotnej kolejności:

for i := ListBox.Count-1 downto 0 do 
    if ListBox.Selected[i] then 
    StringList1.Delete(i); 

ten sposób akt usuwania elementu zmienia tylko indeksy pierwiastków później w liście, a ci, elementy zostały już przetworzone.

+5

Powolny dzisiaj? –

+0

kto jest pierwszy? :) – maxfax

+0

@maxfax Jakie to ma znaczenie, kto jest pierwszy? –

4

Co powiesz na to, że robisz to w drugą stronę (dodawanie zamiast usuwania)?

StringList1.Clear; 
for i:=0 to ListBox.Count-1 do 
    if not ListBox.Selected[i] then StringList1.Add(ListBox.Items(i)); 
+0

Cóż, to ma dla mnie dużo więcej sensu, ale wtedy samo pytanie wydaje się zasadniczo niezrozumiałe. –

+0

@warren jak zwykle przegląda się listę i usuwa niektóre, ale nie wszystkie elementy? –

9

Rozwiązanie dostarczone przez Andreasa i Davida zakłada, że ​​ciągi są dokładnie w tej samej kolejności zarówno w ListBox, jak iw StringList. Jest to dobre założenie, ponieważ nie wskazuje się inaczej, ale w przypadku, gdy nie jest prawdą, można użyć metody StringList do znalezienia indeksu ciągu znaków (jeśli lista łańcuchów jest posortowana, należy zamiast tego użyć Find). Coś takiego jak

+0

Myślę, że możesz być całkiem pewien, że maxfax utrzymuje dwie listy w synchronizacji, więc nie musi zakładać niczego –

Powiązane problemy