请问以下两段语句哪种语句更好?
Var
  i:integer;
begin
  AdoQuery1.First;
  for i:=0 to AdoQuery1.RecordCount-1 do
  begin
    Combobox1.Items.Add(AdoQuery1.FieldByName('EmpID').AsString);
    AdoQuery1.Next;
  end;
  AdoQuery1.First;
  While Not AdoQuery1.Eof Do
  begin
    Combobox2.Items.Add(AdoQuery1.FieldByName('EmpID').AsString);
    AdoQuery1.Next;
  end;
end;

解决方案 »

  1.   

    这个好,不容易出错。
    AdoQuery1.First;
      While Not AdoQuery1.Eof Do
      begin
        Combobox2.Items.Add(AdoQuery1.FieldByName('EmpID').AsString);
        AdoQuery1.Next;
      end;
      

  2.   

    While Not AdoQuery1.Eof每次都进行了判断,记录多了就不爽了,一般来说用前一种是不会出现越界的
      

  3.   

    应该说第一中循环有固定的次数,相对来说速度会快一点,在foxpro中这样执行的效率肯定要高,delphi相信也会是这样吧。
      

  4.   

    我个人赞成第二种方案。
    (1)当记录很多时,RecordCount属性的返回值不一定准确。
    (2)第一种方法还要定义一个临时变量,多不便哪!!
      

  5.   

    用第二种方法:
     1、当ADOQuery1中有BLOB字段时,读出来的recordcount为-1,怎么循环?
     2、当记录数很大时,RecordCount的速度很慢,特别是有Blob字段时更慢
     
     3、Eof只是一个指针判断问题,速度不会有影响
     4、很直观
      

  6.   

    我也用过个,安全不出错!  AdoQuery1.First;
      While Not AdoQuery1.Eof Do
      begin
        Combobox2.Items.Add(AdoQuery1.FieldByName('EmpID').AsString);
        AdoQuery1.Next;
      end;
      

  7.   

    这个贴子置顶有点搞笑吧,呵呵
    楼上哪位叫杰克逊的老兄太小看delphi了吧,for,while在delphi编译后是没有区别的,borland是做编译器出身的,有很强大的编译器优化功能,而且在优化之后都是在往while转化,c语言优化编译后循环转换为for格式,但是到了汇编就只有一种循环了。
    楼上说eof每次判断的朋友,好像每次TDataSet在做了next之后都会对eof进行校验,不管你乐意不乐意,prior都会对bof进行校验,所以不会影响效率。
    还有recordcount的数据准确性值得怀疑,当数据库是paradox,dbase,access时数据确实没有问题,但是碰到oracle,sql server,sybase等大型数据库的时候肯定是不够准确的。
    另外有一个建议,while not adoquery1.eof do在编程里面是不建议这么写的。根据软件工程的规定,在源代码中应尽量避免使用非运算就是not运算。一来影响代码的可读性,而来需要多一次判断。
    如果写成while adoquery1.eof=false do,这样就比上面的写法少了一次非运算了。