Réponse acceptée !
parcourt la listbox à l'envers car quand on supprime un élément de la liste avec Delete, tous les éléments "descendent" d'un rang remonte d'un rang ...
si je supprime index 10, alors index 11, 12... remonte de 1 donc deviennent 10 et 11
la premiere solution de JulioDelphi est la bonne methode, ont pourrait y ajouter pour plus de performance :
ListBox1.Items.BeginUpdate;
try for I := ListBox1.Count-1 downto 0 do
if ListBox1.Items[I] = EmptyStr then
ListBox1.Items.Deletes(I);
finally
ListBox1.Items.EndUpdate;
end;cela empeche les appels inutiles a la methode OnChange de TListBox, pendant le traitement, les gains sont assé important et peuvent aller de plusieurs secondes a quelques minutes.