关于数据指针的有关问题

关于数据指针的问题
本帖最后由 csshow 于 2013-11-05 17:34:04 编辑

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把当前记录移到了下一条记录,觉着这样不大合适,不知道你为什么这么用