读书人

list index out of bounds解决方案

发布时间: 2012-04-15 18:39:21 作者: rapoo

list index out of bounds
unit Unit6;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, DB, ADODB, Grids, DBGrids, ToolWin,hotelmodual,
Menus;

type
TForm6 = class(TForm)
ToolBar1: TToolBar;
ToolButton1: TToolButton;
ToolButton2: TToolButton;
ToolButton3: TToolButton;
ToolButton4: TToolButton;
ToolButton5: TToolButton;
ToolButton6: TToolButton;
ADOQuery1: TADOQuery;
ADOTable1: TADOTable;
DBGrid1: TDBGrid;
DataSource1: TDataSource;
PageControl1: TPageControl;
GroupBox1: TGroupBox;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Edit6: TEdit;
PopupMenu1: TPopupMenu;
procedure FormShow(Sender: TObject);
procedure ToolButton1Click(Sender: TObject);
procedure ToolButton2Click(Sender: TObject);
procedure Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure ToolButton3Click(Sender: TObject);
procedure ToolBar1Click(Sender: TObject);
procedure ADOTable1AfterScroll(DataSet: TDataSet);
procedure ToolButton5Click(Sender: TObject);
procedure ToolButton6Click(Sender: TObject);
private
{ Private declarations }
pmark:integer;
function ptest():string;

public
{ Public declarations }
end;

var
Form6: TForm6;

implementation

uses Unit3;

{$R *.dfm}

procedure TForm6.ADOTable1AfterScroll(DataSet: TDataSet);
begin
edit1.Text:=adotable1.FieldByName('roomid').AsString;
edit2.Text:=adotable1.FieldByName('roomtype').AsString;
edit3.Text:=adotable1.FieldByName('tvor').AsString;
edit4.Text:=adotable1.FieldByName('airconditionaryor').AsString;
edit5.Text:=adotable1.FieldByName('netor').AsString;
edit6.Text:=adotable1.FieldByName('price').AsString;

edit1.ReadOnly:=true;
edit2.ReadOnly:=true;
edit3.ReadOnly:=true;
edit4.ReadOnly:=true;
edit5.ReadOnly:=true;
edit6.ReadOnly:=true;
pmark:=2;
end;

procedure TForm6.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
x,x1:integer;
tc:tcomponent;
begin
if not (ActiveControl is TDBGrid) then
begin
if (key=13)or(key=vk_down) then
begin
perform (WM_NEXTDLGCTL,0,0);
end;
if key=VK_UP then perform(WM_NEXTDLGCTL,1,0);
end;
end;

procedure TForm6.FormShow(Sender: TObject);
var
i:integer;
begin
adoquery1.Connection:=datamodule3.ADOConnection1;
adotable1.connection:=datamodule3.ADOConnection1;

adotable1.Close;
adotable1.TableName:='room';
adotable1.Open;

with dbgrid1 do
begin
columns.clear;

for i := 0 to 5 do columns.Add;
columns[0].Title.caption:='房间号';
columns[1].Title.caption:='房间类型';
columns[2].Title.caption:='是否有电视';
columns[3].Title.caption:='是否有空调';
columns[4].Title.caption:='是否有宽带';
columns[5].Title.caption:='价格';

columns[0].fieldname:='roomid';
columns[1].fieldname:='roomtype';


columns[2].fieldname:='tvor';
columns[3].fieldname:='airconditionaryor';
columns[4].fieldname:='netor';
columns[5].fieldname:='price';

columns[0].Width:=40;
columns[1].Width:=100;
columns[2].Width:=80;
columns[3].Width:=100;
columns[4].Width:=60;
columns[5].Width:=60;

for I := 0 to 5 do
begin
Columns[i].Title.Alignment:=tacenter;
end;
//options:=options-[dgediting];
end;
pagecontrol1.Pages[0].Caption:='房间信息';
pagecontrol1.activepageindex:=0;
dbgrid1.popupmenu:=popupmenu1;
pmark:=0;

end;

procedure TForm6.ToolBar1Click(Sender: TObject);
var
s,s1,s2:string;
n:integer;
begin
s:=ptest();
if(s='')then
begin
adotable1.AfterScroll:=nil;
n:=0;
if(pmark=1) then adotable1.Append;

adotable1.Edit;
adotable1.FieldByName('roomid').AsString:=trim(edit1.text);
adotable1.fieldbyname('roomtype').AsString:=trim(edit2.text);
adotable1.fieldbyname('tvor').AsString:=trim(edit3.Text);
adotable1.fieldbyname('airconditionaryor').AsString:=trim(edit4.text);
adotable1.fieldbyname('netor').AsString:=trim(edit5.text);
adotable1.fieldbyname('price').AsString:=trim(edit6.text);
adotable1.Post;
pmark:=2;
adotable1.AfterScroll:=adotable1.afterscroll;
end
else
begin
s:='数据验证发现以下错误:'+char(13)+s+char(13)+char(13)+'数据保存失败!';
application.MessageBox(pchar(s),'系统提示',0+16);
end;
end;

procedure TForm6.ToolButton1Click(Sender: TObject);
var
i:integer;
begin
for i := 1 to 6 do
begin
tedit(findcomponent('edit'+inttostr(i))).Text:='';
tedit(findcomponent('edit'+inttostr(i))).readonly:=false;;
end;
edit1.SetFocus;
pmark:=1;
pagecontrol1.ActivePageIndex:=0;
end;

procedure TForm6.ToolButton2Click(Sender: TObject);
var
i:integer;
s:string;
begin
for i:= 1 to 6 do
begin
s:='edit'+inttostr(i);
tedit(findcomponent(s)).ReadOnly:=false;
end;
edit1.readonly:=true;
pmark:=2;
end;

procedure TForm6.ToolButton3Click(Sender: TObject);
var
x:integer;
begin
if(adotable1.RecordCount>0) then
begin
x:=application.MessageBox(pchar('删除记录:'+trim(edit1.text)+char(13)+char(13)+'是否确定?'),'系统提示',4+32);
if(x=6)then adotable1.Delete;
end;
end;



procedure TForm6.ToolButton5Click(Sender: TObject);
begin
adotable1.Close;
adotable1.open;
end;

procedure TForm6.ToolButton6Click(Sender: TObject);
begin
form6.Close;
form3.show;
end;

function TForm6.ptest():string;
var
s1,s2,s3,s4,s5,s6,xerr:string;
x:double;
x1,x2:integer;
begin
//数据验证,错误信息存放在xerr中
xerr:='';
//判断数值型数据是否正确
x:=0;
s1:=trim(edit1.text);
s2:=trim(edit2.text);
s3:=trim(edit3.text);
s4:=trim(edit4.text);
s5:=trim(edit5.Text);
s6:=trim(edit6.Text);
begin
//验证产品编码是否唯一
adoquery1.close;
adoquery1.sql.text:='select 1 from room where roomid=p1';
adoquery1.Parameters.ParamByName('p1').Value:=s1;
adoquery1.Open;
if adoquery1.RecordCount>0 then xerr:=xerr+char(13)+'房间号码重复!';
end;


if (s1='') then xerr:=xerr+char(13)+'房间号码不能为空!';
if (s2='') then xerr:=xerr+char(13)+'房间类型不能为空!';
if (s6='') then xerr:=xerr+char(13)+'房间价格不能为空!';
result:=xerr;
end;


[解决办法]
数组越界 下断点 一行一行地调试
[解决办法]
在代码里循环的部分仔细查找吧
[解决办法]
数组下标越界,这么多代码,实在看不动,我自己的看着恶心呢。
[解决办法]
LZ自己都不跟踪代码么?f8一下,看看异常哪里抛出的,检查下数组不就得了
[解决办法]
你这个程序不是很长,可以自己下中断查询,首先:查询是否数组下标越界.其次:查询数据库中的数据是否有问题。
[解决办法]

Delphi(Pascal) code
unit Unit6;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls, ComCtrls, DB, ADODB, Grids, DBGrids, ToolWin,hotelmodual,  Menus;type  TForm6 = class(TForm)  ToolBar1: TToolBar;  ToolButton1: TToolButton;  ToolButton2: TToolButton;  ToolButton3: TToolButton;  ToolButton4: TToolButton;  ToolButton5: TToolButton;  ToolButton6: TToolButton;  ADOQuery1: TADOQuery;  ADOTable1: TADOTable;  DBGrid1: TDBGrid;  DataSource1: TDataSource;  PageControl1: TPageControl;  GroupBox1: TGroupBox;  Label1: TLabel;  Label2: TLabel;  Label3: TLabel;  Label4: TLabel;  Label5: TLabel;  Label6: TLabel;  Edit1: TEdit;  Edit2: TEdit;  Edit3: TEdit;  Edit4: TEdit;  Edit5: TEdit;  Edit6: TEdit;  PopupMenu1: TPopupMenu;  procedure FormShow(Sender: TObject);  procedure ToolButton1Click(Sender: TObject);  procedure ToolButton2Click(Sender: TObject);  procedure Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);  procedure ToolButton3Click(Sender: TObject);  procedure ToolBar1Click(Sender: TObject);  procedure ADOTable1AfterScroll(DataSet: TDataSet);  procedure ToolButton5Click(Sender: TObject);  procedure ToolButton6Click(Sender: TObject);  private  { Private declarations }  pmark:integer;  function ptest():string;  public  { Public declarations }  end;var  Form6: TForm6;implementationuses Unit3;{$R *.dfm}procedure TForm6.ADOTable1AfterScroll(DataSet: TDataSet);beginedit1.Text:=adotable1.FieldByName('roomid').AsString;edit2.Text:=adotable1.FieldByName('roomtype').AsString;edit3.Text:=adotable1.FieldByName('tvor').AsString;edit4.Text:=adotable1.FieldByName('airconditionaryor').AsString;edit5.Text:=adotable1.FieldByName('netor').AsString;edit6.Text:=adotable1.FieldByName('price').AsString;edit1.ReadOnly:=true;edit2.ReadOnly:=true;edit3.ReadOnly:=true;edit4.ReadOnly:=true;edit5.ReadOnly:=true;edit6.ReadOnly:=true; pmark:=2;end;procedure TForm6.Edit1KeyDown(Sender: TObject; var Key: Word;  Shift: TShiftState);  var  x,x1:integer;  tc:tcomponent;  begin  if not (ActiveControl is TDBGrid) then  begin  if (key=13)or(key=vk_down) then  begin  perform (WM_NEXTDLGCTL,0,0);  end;  if key=VK_UP then perform(WM_NEXTDLGCTL,1,0);  end;end;procedure TForm6.FormShow(Sender: TObject);var  i:integer;begin adoquery1.Connection:=datamodule3.ADOConnection1; adotable1.connection:=datamodule3.ADOConnection1; adotable1.Close; adotable1.TableName:='room'; adotable1.Open; with dbgrid1 do begin  columns.clear;for i := 0 to 5 do columns.Add;  columns[0].Title.caption:='房间号';  columns[1].Title.caption:='房间类型';  columns[2].Title.caption:='是否有电视';  columns[3].Title.caption:='是否有空调';  columns[4].Title.caption:='是否有宽带';  columns[5].Title.caption:='价格';  columns[0].fieldname:='roomid';  columns[1].fieldname:='roomtype';  columns[2].fieldname:='tvor';  columns[3].fieldname:='airconditionaryor';  columns[4].fieldname:='netor';  columns[5].fieldname:='price';  columns[0].Width:=40;  columns[1].Width:=100;  columns[2].Width:=80;  columns[3].Width:=100;  columns[4].Width:=60;  columns[5].Width:=60;  for I := 0 to 5 do  begin  Columns[i].Title.Alignment:=tacenter;  end;//options:=options-[dgediting]; end; pagecontrol1.Pages[0].Caption:='房间信息'; pagecontrol1.activepageindex:=0; dbgrid1.popupmenu:=popupmenu1; pmark:=0;end;procedure TForm6.ToolBar1Click(Sender: TObject);vars,s1,s2:string;n:integer;begin s:=ptest(); if(s='')then begin  adotable1.AfterScroll:=nil;  n:=0;  if(pmark=1) then adotable1.Append;  adotable1.Edit;  adotable1.FieldByName('roomid').AsString:=trim(edit1.text);  adotable1.fieldbyname('roomtype').AsString:=trim(edit2.text);  adotable1.fieldbyname('tvor').AsString:=trim(edit3.Text);  adotable1.fieldbyname('airconditionaryor').AsString:=trim(edit4.text);  adotable1.fieldbyname('netor').AsString:=trim(edit5.text);  adotable1.fieldbyname('price').AsString:=trim(edit6.text);  adotable1.Post;  pmark:=2;  adotable1.AfterScroll:=adotable1.afterscroll; end else begin  s:='数据验证发现以下错误:'+char(13)+s+char(13)+char(13)+'数据保存失败!';  application.MessageBox(pchar(s),'系统提示',0+16); end;end;procedure TForm6.ToolButton1Click(Sender: TObject);vari:integer;begin for i := 1 to 6 do  begin  tedit(findcomponent('edit'+inttostr(i))).Text:='';  tedit(findcomponent('edit'+inttostr(i))).readonly:=false;;  end;  edit1.SetFocus;  pmark:=1;  pagecontrol1.ActivePageIndex:=0;end;procedure TForm6.ToolButton2Click(Sender: TObject);vari:integer;s:string;begin  for i:= 1 to 6 do  begin  s:='edit'+inttostr(i);  tedit(findcomponent(s)).ReadOnly:=false;  end;  edit1.readonly:=true;  pmark:=2;end;procedure TForm6.ToolButton3Click(Sender: TObject);varx:integer;begin  if(adotable1.RecordCount>0) then  begin  x:=application.MessageBox(pchar('删除记录:'+trim(edit1.text)+char(13)+char(13)+'是否确定?'),'系统提示',4+32);  if(x=6)then adotable1.Delete;  end;end;procedure TForm6.ToolButton5Click(Sender: TObject);beginadotable1.Close;adotable1.open;end;procedure TForm6.ToolButton6Click(Sender: TObject);beginform6.Close;form3.show;end;function TForm6.ptest():string;vars1,s2,s3,s4,s5,s6,xerr:string;x:double;x1,x2:integer;begin  //数据验证,错误信息存放在xerr中  xerr:='';  //判断数值型数据是否正确  x:=0;  s1:=trim(edit1.text);  s2:=trim(edit2.text);  s3:=trim(edit3.text);  s4:=trim(edit4.text);  s5:=trim(edit5.Text);  s6:=trim(edit6.Text);  begin  //验证产品编码是否唯一  adoquery1.close;  adoquery1.sql.text:='select 1 from room where roomid=p1';  adoquery1.Parameters.ParamByName('p1').Value:=s1;  adoquery1.Open;  if adoquery1.RecordCount>0 then xerr:=xerr+char(13)+'房间号码重复!';  end;  if (s1='') then xerr:=xerr+char(13)+'房间号码不能为空!';  if (s2='') then xerr:=xerr+char(13)+'房间类型不能为空!';  if (s6='') then xerr:=xerr+char(13)+'房间价格不能为空!';  result:=xerr;end; 


[解决办法]
这么多代码,真费劲,这句错了

for i := 0 to 5 do columns.Add;-->>for i := 0 to 6 do columns.Add;
columns[0].Title.caption:='房间号';
columns[1].Title.caption:='房间类型';
columns[2].Title.caption:='是否有电视';
columns[3].Title.caption:='是否有空调';
columns[4].Title.caption:='是否有宽带';
columns[5].Title.caption:='价格';

[解决办法]
还有类似 for I := 0 to 5 do的地方看着改吧

[解决办法]
不对,刚才搞错了,错误不是这里,LZ还是自己跟踪下吧
[解决办法]
妹的,csdn又抽风了,为了不误人子弟还得换个帐号,抱歉高材没仔细看搞错了,错误不在那里,Lz还是自己跟踪下吧
[解决办法]
反正就是越界,断点很好查的.慢慢查

读书人网 >.NET

热点推荐