加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 在删除项目时列出索引超出范围

发布时间:2020-12-15 09:07:55 所属栏目:大数据 来源:网络整理
导读:我解决了我的问题,但我需要知道为什么会出现这个问题? 我写了一个项目,将文件加载到listBox然后逐个删除字符串, 但当我删除listBox字符串时,这个异常引发了我的兴趣! 列表索引超出范围(5)! 我输入这个for循环读取列表框并删除字符串: for i := 0 to List
我解决了我的问题,但我需要知道为什么会出现这个问题?

我写了一个项目,将文件加载到listBox然后逐个删除字符串,

但当我删除listBox字符串时,这个异常引发了我的兴趣!

列表索引超出范围(5)!

我输入这个for循环读取列表框并删除字符串:

for i := 0 to ListBox3.Count -1  do
  begin
      ShowMessage(ListBox3.Items[i]);
       ListBox3.items.Delete(i);
  end;

并且通过在for循环语句中做一点改变来解决我的问题

for i := ListBox3.Items.Count - 1 downto 0 do
  begin
      ShowMessage(ListBox3.Items[i]);
       ListBox3.items.Delete(i);
  end;

为什么第一个语句引发异常,第二个语句工作正常?

解决方法

通过删除向前移动的项目,您正在切断您站立的分支. :-)循环的上限仅在循环开始之前计算一次,如果删除项目,则列表中的项目现在比计算边界时更少.

>评估循环限制(例如,List.Count – 1 = 5).有效索引是[0..4]
>循环开始,您检索List [0]并删除它.清单计数= 4,
界限仍然是5
>索引递增,您检索并删除List [1].列表计数= 3,界限仍为5
>索引递增,您检索并删除List [2].列表计数= 2,边界仍为5.
>索引递增,您检索List [3] – 糟糕!列表中只有2个项目,现在位于索引[0..1] – 列表索引超出范围(3).

通过向后迭代,即使边界仍然只在开始时计算,您将从末尾删除项目并同时减少计数.

> Bounds为5,您检索List [4]并删除它.伯爵现在是4,界限仍然是5>索引递减,您检索List [3]并将其删除.伯爵现在3,您检索列表[2]并删除它.伯爵现在是2,界限仍然是5.>索引递减,您检索并删除List [1].伯爵现在是1,您检索并删除List [0]. List现在为空,但是我们已经达到循环的终止条件(downto 0)并且循环安全退出.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读