7
votes

Supprimer des cordes de Tstringlist

J'ai une liste de liste ou une vue de liste avec des éléments. Et j'ai une liste de chaînes avec les mêmes éléments (chaînes) que la vue de liste / liste de liste. Je souhaite supprimer tous les éléments sélectionnés dans la liste de liste / liste de la liste dans la liste des chaînes.

Comment faire? P>

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


0 commentaires

4 Réponses :


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

0 commentaires

18
votes

L'astuce consiste à exécuter la boucle dans l'ordre inverse: xxx

de cette façon, l'acte de supprimer un élément ne modifie que les indices des éléments plus tard dans la liste et ces éléments ont déjà été traité.


4 commentaires

@maxfax Qu'est-ce qui compte qui est d'abord?


@maxfax andreas a répondu à quelques secondes plus tôt. Survolez la souris sur le texte qui dit XX Minies il y a pour voir l'horodatage. D'autre part, j'ai expliqué pourquoi cela fonctionne en premier !! ;-)


@maxfax: Cependant, ma réponse est bien meilleure car j'avais l'excellent goût d'entourer l'opérateur de soustraction binaire avec des espaces! (Je rigole!)


@Andreas en fait, je dirais que vous avez eu le bon goût d'utiliser compteur-1 plutôt que préy (compte) !!



5
votes

Que diriez-vous de le faire dans l'autre sens (ajoutant au lieu de supprimer)? XXX


2 commentaires

Eh bien, cela rend beaucoup plus de sens pour moi, mais alors, la question elle-même semble fondamentalement confuse.


@Warren Comment vous êtes-vous normalement itérale sur une liste et supprimez-vous des objets mais pas tous?



10
votes

La solution fournie par Andreas et David suppose que les chaînes sont exactement dans les mêmes ordres dans la liste de liste et de la Liste. C'est une bonne hypothèse que vous n'indiquez pas autrement, mais dans le cas où il n'est pas vrai, vous pouvez utiliser la méthode index de StressList pour rechercher l'index de la chaîne (si la limite de filtre est triée, utilisez Trouver à la place). Quelque chose comme xxx


1 commentaires

Je pense que vous pouvez être sûr que MAXFAX maintient les deux listes de synchronisation et ne doit donc rien assumer