关于数据指针的有关问题
关于数据指针的问题
这个按钮事件是需要多次点击的.
现有两种情况
情况一
第一次执行到ShowMessage(IntToStr(FrmLogin.OraQuery1.RecordCount));,显示6,是正确的.但接下来执行到cxTextEdit1.Text:=FrmLogin.OraQuery1.Fields[5].DisplayText;
提示list index out of bounds (5),然后第二次点击的时候.ShowMessage(IntToStr(FrmLogin.OraQuery1.RecordCount));直接显示1
情况二.去掉ShowMessage(IntToStr(FrmLogin.OraQuery1.RecordCount));,则第一次点击按钮不报错.但在第二次点击时.出现list index out of bounds (5),代码指定在cxTextEdit1.Text:=FrmLogin.OraQuery1.Fields[5].DisplayText;
这是为什么...
------解决方案--------------------
ShowMessage(IntToStr(FrmLogin.OraQuery1.RecordCount));
try
FrmLogin.OraQuery1.Next;
cxTextEdit1.Text:=FrmLogin.OraQuery1.Fields[5].DisplayText; //显示序号
FrmLogin.OraQuery1.Fields.Count;字段数
RecordCount记录数,而不是字段数
------解决方案--------------------
直接看代码看不出来,那就猜猜看吧:
代码里,你用 if isChenked来判断是否用目前的sql来open;
但取值时却在if之外。
这样子很危险,
就是你取值时,query的SQL是不是你贴的那个SQL?不一定!
既然不一定,那是不是Fields.Count=6?也不一定。
简单的说,这段代码写得不好,不容易控制。
错误会发生在意想之外。
这是我猜的。
你估且参考看看。
------解决方案--------------------
在末尾加个OraQuery1.close;试试;
每次open后回定位在第一条记录的位置,你又调用了一次next把当前记录移到了下一条记录,觉着这样不大合适,不知道你为什么这么用
procedure TFrmMain.cxButton7Click(Sender: TObject);
begin
if IsChenked=False then
begin
with FrmLogin.OraQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('select SCSJKS,SCSJTZ,SJHJ,SCQK,FL,XH from ZMTSJB ' +
'where bc=:bc and mth=:mth and yf=:yf and day=:day order by xh');
Params.ParamByName('mth').Value:=botStr;
Params.ParamByName('bc').Value:=cxComboBox1.Text;
Params.ParamByName('yf').Value:=cxlbmonth.Caption;
Params.ParamByName('day').Value:=cxlbday.Caption;
Open;
end;
IsChenked:=True;
end;
{显示下一条数据}
ShowMessage(IntToStr(FrmLogin.OraQuery1.RecordCount));
try
FrmLogin.OraQuery1.Next;
cxTextEdit1.Text:=FrmLogin.OraQuery1.Fields[5].DisplayText; //显示序号
cxMaskEdit1.Text:=FrmLogin.OraQuery1.Fields[0].DisplayText; //开始时间
cxMaskEdit2.Text:=FrmLogin.OraQuery1.Fields[1].DisplayText; //停止时间
cxTextEdit4.Text:=FrmLogin.OraQuery1.Fields[2].DisplayText; //时间合计
cxTextEdit5.Text:=FrmLogin.OraQuery1.Fields[3].DisplayText; //生产情况
cxComboBox2.Text:=FrmLogin.OraQuery1.Fields[4].DisplayText; //情况分类
except
on E: Exception do
begin
ShowMessage(E.Message);
Exit;
end;
end;
end;
这个按钮事件是需要多次点击的.
现有两种情况
情况一
第一次执行到ShowMessage(IntToStr(FrmLogin.OraQuery1.RecordCount));,显示6,是正确的.但接下来执行到cxTextEdit1.Text:=FrmLogin.OraQuery1.Fields[5].DisplayText;
提示list index out of bounds (5),然后第二次点击的时候.ShowMessage(IntToStr(FrmLogin.OraQuery1.RecordCount));直接显示1
情况二.去掉ShowMessage(IntToStr(FrmLogin.OraQuery1.RecordCount));,则第一次点击按钮不报错.但在第二次点击时.出现list index out of bounds (5),代码指定在cxTextEdit1.Text:=FrmLogin.OraQuery1.Fields[5].DisplayText;
这是为什么...
------解决方案--------------------
ShowMessage(IntToStr(FrmLogin.OraQuery1.RecordCount));
try
FrmLogin.OraQuery1.Next;
cxTextEdit1.Text:=FrmLogin.OraQuery1.Fields[5].DisplayText; //显示序号
FrmLogin.OraQuery1.Fields.Count;字段数
RecordCount记录数,而不是字段数
------解决方案--------------------
直接看代码看不出来,那就猜猜看吧:
代码里,你用 if isChenked来判断是否用目前的sql来open;
但取值时却在if之外。
这样子很危险,
就是你取值时,query的SQL是不是你贴的那个SQL?不一定!
既然不一定,那是不是Fields.Count=6?也不一定。
简单的说,这段代码写得不好,不容易控制。
错误会发生在意想之外。
这是我猜的。
你估且参考看看。
------解决方案--------------------
在末尾加个OraQuery1.close;试试;
每次open后回定位在第一条记录的位置,你又调用了一次next把当前记录移到了下一条记录,觉着这样不大合适,不知道你为什么这么用