2011-07-25 22 views
5

Tengo un cuadro de lista o una vista de lista con elementos. Y tengo una lista de cadenas con los mismos elementos (cadenas) que el cuadro de lista/vista de lista. Quiero eliminar todos los elementos seleccionados en el cuadro de lista/vista de lista de la lista de cadenas.Eliminar cadenas de TStringList

¿Cómo hacer?

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 

Respuesta

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

+1 para 'Count - 1' :) –

15

El truco consiste en ejecutar el bucle en el orden inverso:

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

De esta manera, el acto de la eliminación de un elemento sólo cambia los índices de los elementos más tarde en la lista, y aquellos los elementos ya han sido procesados

+5

¿Está lento hoy? –

+0

¿quién es el primero? :) – maxfax

+0

@maxfax ¿Qué importa quién es el primero? –

4

¿Qué le parece hacerlo al revés (agregar en lugar de eliminar)?

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

Bueno, esto tiene mucho más sentido para mí, pero luego, la pregunta en sí parece fundamentalmente confusa. –

+0

@warren ¿Cómo se itera normalmente sobre una lista y se borran algunos, pero no todos? –

9

La solución provista por Andreas y David asume que las cadenas están exactamente en el mismo orden tanto en ListBox como en StringList. Esta es una buena suposición ya que no indica lo contrario, pero en caso de que no sea cierto, puede usar el método StringList IndexOf para encontrar el índice de la cadena (si StringList está ordenada, use Find). Algo así como

var x, Idx: Integer; 
for x := ListBox.Count - 1 downto 0 do begin 
    if ListBox.Selected[x] then begin 
     idx := StringList.IndexOf(ListBox.Items[x]); 
     if(idx <> -1)then StringList.Delete(idx); 
    end; 
end; 
+0

Creo que puede estar bastante seguro de que maxfax mantiene las dos listas sincronizadas y por lo tanto no necesita asumir nada –

Cuestiones relacionadas