+ -
当前位置:首页 → 问答吧 → list index out of bounds

list index out of bounds

时间:2011-11-07

来源:互联网

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;

作者: cllmxy   发布时间: 2011-11-07

看这个提示应该是数组越界了.!

作者: LoveMit   发布时间: 2011-11-07

数组越界 下断点 一行一行地调试

作者: ADSLAN   发布时间: 2011-11-07

在代码里循环的部分仔细查找吧

作者: hongss   发布时间: 2011-11-08

数组下标越界,这么多代码,实在看不动,我自己的看着恶心呢。

作者: foxyy8888   发布时间: 2011-11-08

LZ自己都不跟踪代码么?f8一下,看看异常哪里抛出的,检查下数组不就得了

作者: funxu   发布时间: 2011-11-08

你这个程序不是很长,可以自己下中断查询,首先:查询是否数组下标越界.其次:查询数据库中的数据是否有问题。

作者: w001001001001   发布时间: 2011-11-08

Delphi(Pascal) code
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;

作者: warrially   发布时间: 2011-11-08

这么多代码,真费劲,这句错了

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:='价格';

作者: funxu   发布时间: 2011-11-08

还有类似 for I := 0 to 5 do的地方看着改吧

作者: funxu   发布时间: 2011-11-08

妹的,csdn又抽风了,为了不误人子弟还得换个帐号,抱歉高材没仔细看搞错了,错误不在那里,Lz还是自己跟踪下吧

作者: funxu1   发布时间: 2011-11-08