for i := cbldeb.Items.Count - 1 downto 0 do
  ....

解决方案 »

  1.   

    参见: 
       http://www.csdn.net/expert/topic/146/146920.shtm
      

  2.   

    我这里不是把控件给释放掉,count不会少啊! 改成 downto,最后一个item 就出错了!  比如item里有4项,出错提示是:list index out of bond(3)
    那位大虾能否指出更深层的原因?
      

  3.   

    sorry,刚才没看清楚,是那句Selected[i]:=false的问题
    象下面这样的代码是选哪个就哪个报错
    procedure TForm1.Button1Click(Sender: TObject);
    var i:integer;
    begin
    for i:= ListBox1.Items.Count-1  downto 0 do
    if ListBox1.Selected[i] then ListBox1.Selected[i]:=false;
    end;
    而如果将这句ListBox1.Selected[i]:=false;改为
    ListBox1.Items.Delete(i)后是正常的
    //下面是从VCL中COPY的delete方法源码
    procedure TCustomListBox.DeleteString( Index: Integer );
    begin
      SendMessage(Handle, LB_DELETESTRING, Index, 0);
    end;
    //下面是设置Selected propty的部分
    procedure TCustomListBox.SetSelected(Index: Integer; Value: Boolean);
    begin
      if SendMessage(Handle, LB_SETSEL, Longint(Value), Index) = LB_ERR then
        raise EListError.CreateResFmt(@SListIndexError, [Index]);
    end;
    //会不会是下这句SendMessage(Handle, LB_SETSEL, Longint(Value), Index)有问题?
    如果在Button1Click中不去设置Selected属性而直接想向ListBox发消息,不论Index是
    i,i+1,还是i-1都会导致LB_ERR,难道是DELPHI的问题?(我是很相信DELPHI的)
    希望大家能进一步深入讨论! 
      

  4.   

    var
      i: Integer;
    begin
      TListBox(cbldeb).MultiSelect := True;
      for i := 0 to cbldeb.Items.Count-1 do
        cbldeb.Selected[i] := False;
    end;
      

  5.   

      可能是这个原因,CheckListBox.Selected[index] 属性是指明该项是否被选中
    不可以自己赋值的,所以出现上述情况。
       问题已解决了,多谢各位关注!
      

  6.   


    和MultiSelect是否为True 有关。
    MultiSelect 为False 时,Selected 值不可知。
      

  7.   

    ItemIndex是指那个有虚框所在的Item,赫赫.我没有看你的程序,但是我知道这种错误,绝对是你的程序的问题.:)
      

  8.   

    vcl也有问题,简单的说,tchecklistbox继承至Tcustomlistbox,它有multiselect属性,但申明为protect,无法引用,但它的下级tlistbox则可以引用,而其它下级如该控件则不能引用,这是极其错误的
      

  9.   

    显然是极地深寒同志的意见。
    没事不要轻易怀疑delphi,多找找自己的程序的问题吧。
      

  10.   

    显示的错误是下标越界
    cbldeb.Selected的下标是从0开始的吗??
    也许你应该改成:
    if cbldeb.Items.Count-1 >1 then
      for i := 1 to cbldeb.Items.Count-1 do 
        cbldeb.Selected[i] := false
    else
      cbldeb.Selected[1] := false;