List index out of bounds (1)是什么错误

summerdashu 2008-04-17 03:14:05
前几天想做一个智能查询的东西,就是在编辑框里输入内容,马上模糊检索数据库中的相关记录,并在下面提示出来,我的思路是用一个edit和一个listbox来实现,edit设置onchange事件,即时的由edit.text的内容搜索数据库,然后将结果赋给listbox的items,并设置listbox可见,listbox的click事件则将选择的内容赋到edit中。编译没有问题,但是在实际运行时,当我在listbox中选择一项时,就弹出List index out of bounds的错误,请问这是什么原因啊,是不是需要设置什么属性?SOS!
...全文
6690 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
dl110 2008-04-17
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 summerdashu 的回复:]
...

中国人的友好不是说着玩的,而是可以实实在在感受到的!那些对我们有敌意的人和国家,就像是在一个心地善良的姑娘面前展示着自己无尽的丑陋。我们依旧善良,我们依旧渴望和平,依旧希望每一个生灵都在这个世上享受尊重和友善!
然而,善良不等于无能,源自善良的是什么呢,是我们与生俱来的尊严,是我们明于心示于行的勇敢,是我们足以摧毁世界的力量!
中国人曾经辉煌过,中国人还将创造更加璀璨夺目的荣耀!我们爱我们的国,我们爱我们每一个国人,支持中国,支持北京——forever![/Quote]

说得好!
summerdashu 2008-04-17
  • 打赏
  • 举报
回复
太感谢了,烈焰大哥的光辉照亮了我继续编程的大道!(*^__^*) 嘻嘻……
真不知如果没有CSDN的大侠们,我怎样才能在四月底给导师一个交代啊,每天都碰到问题,每天都是大侠们解救的,谢谢!


中国人的友好不是说着玩的,而是可以实实在在感受到的!那些对我们有敌意的人和国家,就像是在一个心地善良的姑娘面前展示着自己无尽的丑陋。我们依旧善良,我们依旧渴望和平,依旧希望每一个生灵都在这个世上享受尊重和友善!
然而,善良不等于无能,源自善良的是什么呢,是我们与生俱来的尊严,是我们明于心示于行的勇敢,是我们足以摧毁世界的力量!
中国人曾经辉煌过,中国人还将创造更加璀璨夺目的荣耀!我们爱我们的国,我们爱我们每一个国人,支持中国,支持北京——forever!
blazingfire 2008-04-17
  • 打赏
  • 举报
回复
bsSkinListBox1ListBoxClick的循环满足bsSkinListBox1.Selected[i]应该加上Break
blazingfire 2008-04-17
  • 打赏
  • 举报
回复
//正确的解释是这样

procedure TForm6.bsSkinListBox1ListBoxClick(Sender: TObject);//listbox的click事件
var
i:integer;
begin
for i:=bsSkinListBox1.Items.Count-1 downto 0 do
begin
if bsSkinListBox1.Selected[i] then
begin
//下面一句触发了plantChange(Sender: TObject); edit的change事件 !!!
plant.Text:= bsSkinListBox1.Items.Strings[i];
bsSkinListBox1.Items.Delete(i);
end;
end;
check:=true;
bsSkinListBox1.Visible:=false;
end;

改成这样:
procedure TForm6.bsSkinListBox1ListBoxClick(Sender: TObject); //listbox的click事件
var
i: integer;
SaveEvent: TNotifyEvent;
begin
for i := bsSkinListBox1.Items.Count - 1 downto 0 do
begin
if bsSkinListBox1.Selected[i] then
begin
SaveEvent := plant.OnChange; //记录下来Plant控件已有的OnChange事件
plant.onChange := nil; //清除Plant控件已有的OnChange事件
plant.Text := bsSkinListBox1.Items.Strings[i];
plant.OnChange := SaveEvent; //再复位Plant控件的OnChange事件
bsSkinListBox1.Items.Delete(i);
end;
end;
check := true;
bsSkinListBox1.Visible := false;
end;
//呵呵,可以给分了
summerdashu 2008-04-17
  • 打赏
  • 举报
回复
奇怪,我之前是点击listbox的第一项时出现上面这个错误(循环没有用downto而是用的to),现在我修改为downto,结果是点击最后一项时出现这个错误!
我还是把部分代码贴出来吧,各位大侠帮忙看一下啊,小弟学delphi才一个月,不是不愿思考,确实是搞不定啊!
procedure TForm6.plantChange(Sender: TObject);//edit的change事件
var
s_sql:string;
begin
if check=true then
exit;
if plant.Text<>'' then
begin
bsSkinListBox1.Clear;
s_sql:='select plant from quality where plant like'+''''+plant.Text+'%''';
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add(s_sql);
Query1.Open;
while not Query1.Eof DO
begin
bsSkinListBox1.Items.Add(Query1.FieldValues['plant']);
Query1.Next;
end;
bsSkinListBox1.Visible:=true;
end;
end;

procedure TForm6.bsSkinListBox1ListBoxClick(Sender: TObject);//listbox的click事件
var
i:integer;
begin
for i:=bsSkinListBox1.Items.Count-1 downto 0 do
begin
if bsSkinListBox1.Selected[i] then
begin
plant.Text:= bsSkinListBox1.Items.Strings[i];
bsSkinListBox1.Items.Delete(i);
end;
end;
check:=true;
bsSkinListBox1.Visible:=false;
end;

就是这样了,主要的代码。比如查询到“月球”、“月亮”、“月食”这三个记录,当点击前两个时没问题,点击“月食”就有上面的错误了!
summerdashu 2008-04-17
  • 打赏
  • 举报
回复
谢谢各位大侠的回答,我试试看,如果可以就结贴罗!
pongjun64 2008-04-17
  • 打赏
  • 举报
回复
越界
喝口水 2008-04-17
  • 打赏
  • 举报
回复
越界
阿三 2008-04-17
  • 打赏
  • 举报
回复
越界了
willflyz 2008-04-17
  • 打赏
  • 举报
回复
我有遇到过这个问题,可能是系统的问题,或者中了病毒,后来我重装系统就好了.
mantti 2008-04-17
  • 打赏
  • 举报
回复
删除ListBox中的Item必须要用DownTo作循环
如果用to,
Exp:
for i := 0 to ListBox.Items.Count - 1 do
//在上面这一句中,在循环开始时,i的最大值就已经设定好了,但是当程序删除掉一个Item后,ListBox的count值就少了一个,这时i的最大值就变了,当然运行下去会出错。
如果用DownTo
Exp:
for i := ListBox.Items.Count-1 Downto 0 do
//在上一句中,虽然i的最大值也给定了,但是它是向下循环的,所以不存在越界的问题
lobtao 2008-04-17
  • 打赏
  • 举报
回复

for i:=listbox1.Items.Count-1 downto 0 do
Begin
if listbox1.Selected[i] then
Begin
edit1.text:=listbox1.Items.Strings[i];
listbox1.Items.Delete(i);
End;
End;



wangxuelid 2008-04-17
  • 打赏
  • 举报
回复
上面错误!!!!!!!!

for i:=listbox1.Items.Count-1 downto 0 do
Begin
if listbox1.Selected[i] then
Begin
edit1.text:=listbox1.Items.Strings[i];
listbox1.Items.Delete(i);
End;
End
wangxuelid 2008-04-17
  • 打赏
  • 举报
回复

for i:=listbox1.Items.Count-1 to 0 do
Begin
if listbox1.Selected[i] then
Begin
edit1.text:=listbox1.Items.Strings[i];
listbox1.Items.Delete(i);
End;
End;s


6楼说没有错,,
kaikai_kk 2008-04-17
  • 打赏
  • 举报
回复
楼上各位都说了

把代码贴出来吧,让他们帮你分析分析
lihuasoft 2008-04-17
  • 打赏
  • 举报
回复
for i:=listbox1.Items.Count-1 downto 0 do
begin
//...
Delete等操作最好用downto循环
//...
end;
wangxuelid 2008-04-17
  • 打赏
  • 举报
回复

for i:=0 to listbox1.Items.Count-1 do
Begin
if listbox1.Selected[i] then
Begin
edit1.text:=listbox1.Items.Strings[i];
listbox1.Items.Delete(i);
End;
End;s

wangxuelid 2008-04-17
  • 打赏
  • 举报
回复

edit1.text:=listbox1.Items.Strings[0];
米的向日葵 2008-04-17
  • 打赏
  • 举报
回复
看ListBox的调用,估计Index 超出ListBox.Items.Count了
lihuasoft 2008-04-17
  • 打赏
  • 举报
回复
下标越界了吧
加载更多回复(1)

2,498

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧