Cuando se eliminan los items items de una lista, se hace desde atras para adelante (primero se borra el ultimo, luego se borra el anteultimo, y asi)
Imaginate que borras el primero (indice 0). Ahora la lista tiene que mover los elementos para que el que tenia indice 1, ahora tenga indice 0. Es por eso que tu bucle for no elimina todos los elementos
Te dejo este código de prueba para que experimentes:
Código Delphi
[-]
procedure TForm1.btnLimpiarBienClick(Sender: TObject);
var
I: Integer;
begin
for I := ListBox1.Items.Count - 1 downto 0 do
ListBox1.Items.Delete(I);
end;
procedure TForm1.btnLimpiarMalClick(Sender: TObject);
var
I: Integer;
begin
for I := 0 to ListBox1.Items.Count - 1 do
ListBox1.Items.Delete(I);
end;
procedure TForm1.btnCopiarSeleccionadosClick(Sender: TObject);
var
I: Integer;
begin
Memo1.ClearContent;
for I := 0 to ListBox1.Items.Count - 1 do
begin
if ListBox1.ListItems[i].IsSelected then
Memo1.Lines.Add(ListBox1.Items[i]);
end;
end;
procedure TForm1.btnCrearItemsClick(Sender: TObject);
begin
CreateItems;
end;
procedure TForm1.CreateItems;
begin
ListBox1.Items.Add('uno');
ListBox1.Items.Add('Otro');
ListBox1.Items.Add('y otro');
ListBox1.ItemIndex := -1;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ListBox1.MultiSelectStyle := TMultiSelectStyle.Default;
CreateItems;
end;
Aun asi, me sigue pareciendo mejor que se use el metodo Clear del ListBox que usando el bucle for