您的位置:首页 > 其它

关于List index out of bounds(0)的问题

2008-10-20 10:29 176 查看
关于List index out of bounds(0)的问题 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061223203333140.html

运行输入数据按确定按钮后,弹出对话框说List index out of bounds(0),为什么会有这样的错误呢。代码如下:
unit Borrow;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, DBTables, Mask, DBCtrls, StdCtrls;

type
TBorrowForm = class(TForm)
GroupBox1: TGroupBox;
GroupBox2: TGroupBox;
GroupBox3: TGroupBox;
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
Edit2: TEdit;
Button1: TButton;
DBEdit1: TDBEdit;
Query1: TQuery;
Query2: TQuery;
Query3: TQuery;
Query4: TQuery;
DataSource1: TDataSource;
DataSource2: TDataSource;
DataSource3: TDataSource;
Label3: TLabel;
Label4: TLabel;
DBEdit2: TDBEdit;
Label5: TLabel;
DBEdit3: TDBEdit;
Label6: TLabel;
DBEdit4: TDBEdit;
DBEdit5: TDBEdit;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
DBEdit6: TDBEdit;
DBEdit7: TDBEdit;
DBEdit8: TDBEdit;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
BorrowForm: TBorrowForm;

implementation

uses Query, Return;

{$R *.dfm}

procedure TBorrowForm.Button1Click(Sender: TObject);
begin
if Edit1.Text=''then
ShowMessage('请输入书号和读者编号!')
else
if Edit2.Text='' then
else
begin
Query1.Params[0].AsString:=Edit1.Text;
Query1.ExecSQL;
Query1.Active:=true;
Query2.Params[0].AsString:=Edit2.Text;
Query2.ExecSQL;
Query2.Active:=true;
Query3.Params[0].AsString:=Edit2.Text;
Query3.ExecSQL;
Query3.Active:=true;
end;
end;

procedure TBorrowForm.Button2Click(Sender: TObject);
begin
if DBEdit4.Text='' then
showmessage('该书已借出,请选择其他!')
else
begin
Query4.SQL.Clear;
Query4.SQL.Add('INSERT INTO 借阅 VALUES(Edit1.Text,Edit2.Text,SYSDATE)');
Query4.ExecSQL;
Query4.SQL.Clear;
Query4.SQL.Add('UPDATE 图书 SET 借出否:=True WHERE 书号=Edit1.Text');
Query4.ExecSQL;
Query4.Close;
end;
end;

procedure TBorrowForm.Button3Click(Sender: TObject);
begin
QueryForm.show;
end;

procedure TBorrowForm.Button4Click(Sender: TObject);
begin
ReturnForm.show;
end;

procedure TBorrowForm.Button5Click(Sender: TObject);
begin
BorrowForm.Close;
end;

end.

天,你的命名太那个了吧...
不知道哪个是你的确定按钮
这个错误是列表越界的通用提示,引用了一个空列表的值
再仔细找找原因

本人是菜鸟,请问"列表越界“是怎么回事啊?

大侠门,帮我解决一下问题吧,感激不尽啊。

F8断点调试吧

Query1.Params[0].AsString:=Edit1.Text;
Query2.Params[0].AsString:=Edit2.Text;
Query3.Params[0].AsString:=Edit2.Text;
---------------------------------------

问题出在你的Query1~Query3的参数中。 你确定每个QUERY的SQL中都带有参数吗?可以肯定的是至少有一个没有带参数。请检查。把参数加上后一切就会大大的OK的。

还是老冯厉害,和我所见略同,呵呵。

老冯说得对! 先检查一下SQL中是否有参数,
另外你的代码有错误:
Query4.SQL.Add('INSERT INTO 借阅 VALUES(Edit1.Text,Edit2.Text,SYSDATE)');
Query4.ExecSQL;
Query4.SQL.Clear;
Query4.SQL.Add('UPDATE 图书 SET 借出否:=True WHERE 书号=Edit1.Text');
Query4.ExecSQL;
Query4.Close;
Edit的值不能这样引用到query4中,例如:Query4.SQL.Add('INSERT INTO 借阅 VALUES('''+Edit1.Text+''','+'''+Edit2.Text+''',SYSDATE)');

代码中错误太多,像楼上各位说的。
还有ExecSql和Active := True不要乱用,也不要混用。

我在Query1~Query3都有参数了,分别是:
query1:
select * from 图书 where 书号='+''''+Edit1.Text+'''
Query2:
select * from 读者 where 编号='+''''+Edit1.Text+'''
Query3:
select str(count(*))+'本' from 借阅 where 读者编号='+''''+Edit1.Text+'''
请问老冯,我的这些参数对吗?
我的上面给的程序是实现图书馆管理系统中的借书功能。

错了Query1~Query3的参数应该是:
query1:
select * from 图书 where 书号='+''''+Edit1.Text+'''
Query2:
select * from 读者 where 编号='+''''+Edit2.Text+'''
Query3:
select str(count(*))+'本' from 借阅 where 读者编号='+''''+Edit2.Text+'''
请问,我的这些参数对吗?

呵呵,你这样是没有参数啊。

难怪越界呢。一个参数也没有。
还有SQL语句里是没有:=的。
Query4.SQL.Add('UPDATE 图书 SET 借出否:=True WHERE 书号=Edit1.Text');

那请问怎么设置参数呢?各位高手。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: