procedure TForm1.SpeedButton1Click(Sender: TObject);
var
i:integer;
begin
for i := listbox1.Items.Count-1 downto 0 do
    if listbox1.Selected[i] then
    begin
      listbox2.Items.Add(listbox1.items[i]);
      listbox1.Items.delete(i);
    end;
end;

解决方案 »

  1.   

    同意taxi(游少爷)。当listbox的一项被删除后,后面项的INDEX值也发生改变,并且count值也减少,所以必须从后往前删除,也就是用downto
      

  2.   

    taxi(游少爷) 说的没错! Downto 
    for i := listbox1.Items.Count-1 downto 0 do
        if listbox1.Selected[i] then
        begin
          listbox2.Items.Add(listbox1.items[i]);
          listbox1.Items.delete(i);
        end;
      

  3.   

    ListBox1.Items.Clear;
    这样最简单。
    也可以:procedure TForm1.SpeedButton1Click(Sender: TObject);
    var
    i:integer;
    begin
    for i:=0 to listbox1.Items.Count-1 do
        if listbox1.Selected[i] then
        begin
          listbox2.Items.Add(listbox1.items[0]);
          listbox1.Items.delete(0);
        end;
    end;
      

  4.   

    其实每次只移动一行,为什么不这样写呢:
    procedure TForm1.SpeedButton1Click(Sender: TObject);
    var i:integer;
    begin
        i:=ListBox1.ItemIndex;
        if (i<0)or(i>ListBox1.Items.Count-1) then exit;
        listbox2.Items.Add(i);
        listbox1.Items.delete(i);
    end;  
      

  5.   

    sorry!!!
    上面一篇中listbox2.Items.Add(i);应该改为listbox2.Items.Add(listbox1.items[i]);
    really sorry!