var i:integer;
begin
for i:= alllistbox.Items.Count-1 downto 0 do //倒过来循环
begin
if alllistbox.Selected[i] then
begin
alllistbox.Items.Delete(i);
allzdbm.Delete(i); //所有的字段
allglbzd.Delete(i); //所有的管理表字段
dbnameglb.Delete(i); //所有的管理表名
end;
end;end;
begin
for i:= alllistbox.Items.Count-1 downto 0 do //倒过来循环
begin
if alllistbox.Selected[i] then
begin
alllistbox.Items.Delete(i);
allzdbm.Delete(i); //所有的字段
allglbzd.Delete(i); //所有的管理表字段
dbnameglb.Delete(i); //所有的管理表名
end;
end;end;
解决方案 »
- 请问哪个Edit控件有横线分割?
- 如何用一个循环语句把这些代码简化
- 我用ServerSocket的阻塞模式为每个请求的客户端建立thread。我还有一个线程是操作数据库的(继承TThread)....请各位指点,在线等。
- 怎样响应DBGRID中进出CELL的焦点
- 大家好,我是新来的,请各位高手帮个忙!我想做个象VB的飞溅屏那样的欢迎窗体(启动画面)应该怎么做?本问题明天8点以前有效!
- function GetWhere(Field, Condition, Param: string): string//请教这个函数?
- 有没人知道一个问题,帮忙帮忙
- J++Builder的序列号
- 非常简单的数据库问题!(高分相送)
- 请问数学不好对编程影响大吗?
- 关于NMUDP里触发OnDataRecive事件的问题。
- 有关DBnavigator的操作!
for i:= alllistbox.Items.Count-1 downto 0 do //反过来循环看看
//.........
for i:= listbox1.Items.Count-1 downto 0 do
出错原因:
比如说你的listbox有2项,index分别是0,1
所以循环是
for i:=0 to 1 do
当循环到第二次时,要删除的自然是 items[1],但是此时第一条记录已经被山除了,所以此时listbox只有一条记录,即items[i]的最大下标是0,下标是1的记录已经变成了0,而在循环中我们做的操作还是Items.Delete(1);所以结果一定是listi index out of bound !
假设Listbox1有5条!for i:=0 to ListBox1.Items.Count-1 do
begin
///Delete
end;
开始
i:=0,Count-1 =4,后来删除了一个,这样,实际上Items只有4个了!但是for循环是编译的时候就固定了次数的,因此到最后还会访问Items.string[4],而Items.Strings[4]已经不存在了,变成了Items.Strings[3],当然Out Bounds了!
而for i:=ListBox1.Items.COunt-1 downto 0 do
就不一样了,开始
i:=4,删除一个,这个时后,i也减少了,因此i永远会<=ListBox1.Items.COunt,这样当然不会出现错误了。