delphi中 while not Eof do的作用是干嘛的?

smiledesky1 2016-11-08 05:02:39
procedure THHLR.showPP();
var
i: integer;
query: TQuery;
ZSBID, ZBASEID: Integer;
ZNAME: string;
begin
if DataMain.selectpp(FHH, ZSBID, ZBASEID, ZNAME) >= 1 then
begin
try
edHH.Visible := False;
ListBox.Visible := not edHH.Visible;
listBox.Clear;
I := 0;
while not Eof do ///////////////////////到这里,就直接跳出这个函数了,不在运行下面的步骤。连选择品牌什么的都没有走。。。
begin
SendToExeLog('H11');
listBox.Items.Add(IntToStr(ZSBID) + ' ' + ZNAME);
setlength(myPP, i + 1);
myPP[I].myInx := (ZBASEID);
inc(I);
end;
RgBox.Caption := '请选择品牌';
ListBox.SetFocus();
except
on E: Exception do
begin
DataMain.sLastError := e.Message;
SendToExeLog(e.Message);
end;
end;
end;

下面是selectpp函数:
function TDataMainCustom.selectpp(FHH: string; var SBID, BASEId: Integer; var HHNAME: string): Integer;
begin
try
with FQuery do
begin
Close;
SQL.Clear;
SQL.Text := 'select DISTINCT B.SBID,B.NAME,S.SP_ID from BASESP S,SPSB B';
SQL.Add(' WHERE S.HH = ''' + FHH + '''');
SQL.Add(' AND S.SB=B.SBID');
Open;
Result := FQuery.RecordCount; ///////////////以上运行了
if Result <= 0 then //////////////这里没有运行
begin
Close;
SQL.Clear;
SQL.Text := 'select DISTINCT B.SBID,B.NAME,S.BASEID from SPXX S,SPSB B';
SQL.Add(' WHERE S.HH = ''' + FHH + '''');
SQL.Add(' AND S.SB=B.SBID');
Open;
Result := FQuery.RecordCount;
end;
if not Eof then //////////////以下 运行了
begin
SBID := Fields[0].AsInteger;
HHNAME := Fields[1].AsString;
BASEId := Fields[2].AsInteger;
end;
Close;
end;
except
end;
end;

以上涉及到的两条sql语句都可以在数据库中查到涉及到的数据。但是运行后,会提示I/O error 6 错误,查出在showpp函数中的while not Eof do 语句,有异常,这之后就不在走下面的步骤了,但没有查出是什么原因?能告知下吗?

还有while not Eof do这条语句有什么作用,可以去掉吗?去掉之后有影响吗?

...全文
2479 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
想到才能做到 2016-11-10
  • 打赏
  • 举报
回复
循环不为空的行,
jjpweb 2016-11-09
  • 打赏
  • 举报
回复
当不到数据集的最后一行时一直循环执行beginend之间的内容
smiledesky1 2016-11-09
  • 打赏
  • 举报
回复
if DataMain.selectpp(FHH, ZSBID, ZBASEID, ZNAME) >= 1 then begin edHH.Visible := False; ListBox.Visible := not edHH.Visible; while not Eof do ///////////////////////到这里, begin listBox.Items.Add(IntToStr(ZSBID) + ' ' + ZNAME); setlength(myPP, i + 1); myPP[I].myInx := (ZBASEID); inc(I); end; 这样算指定数据集吗 ?在selectpp函数里面有访问SQL语句 但是这个函数在其他的单元文件里,这里只是调用了selectpp函数 那这样算指定了数据集吗?
lyhoo163 2016-11-09
  • 打赏
  • 举报
回复
1、while 条件 do ...; 是循环语句,当条件为真时继续循环,否停止循环。 2、Eof 是判断DataSet数据集的位置,是否位于结束。当DataSet位于最后一行时,再Next,就Eof:=True ; 3、while Not Eof do begin 其它语句 Next; // 进入下一行 end; 当数据集未到结束时,一直循环执行“其它语句”。 注意:完整的句子,应指定数据集。FQuery
 with FQuery do
  begin
    while Not Eof  do
    begin
      其它语句
      Next;       //  进入下一行
    end; 
  end;
看那山瞧那水 2016-11-09
  • 打赏
  • 举报
回复
这样的调用默认System.Eof(判断一个文件的结尾),EOF没有带文件参数,是默认为标准输入设备 原型是: function Eof([var F: File]): Boolean; overload;
lyhoo163 2016-11-09
  • 打赏
  • 举报
回复
调用前的代码贴出来。
lyhoo163 2016-11-09
  • 打赏
  • 举报
回复
引用 2 楼 smiledesky1 的回复:
if DataMain.selectpp(FHH, ZSBID, ZBASEID, ZNAME) >= 1 then begin edHH.Visible := False; ListBox.Visible := not edHH.Visible; while not Eof do ///////////////////////到这里, begin listBox.Items.Add(IntToStr(ZSBID) + ' ' + ZNAME); setlength(myPP, i + 1); myPP[I].myInx := (ZBASEID); inc(I); end; 这样算指定数据集吗 ?在selectpp函数里面有访问SQL语句 但是这个函数在其他的单元文件里,这里只是调用了selectpp函数 那这样算指定了数据集吗?
看上去,未能指定特定的数据集。
lizjf 2016-11-09
  • 打赏
  • 举报
回复
循环直到最后一行,如果不进入循环就是没有满足条件数据

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧