No    CardNo
1   13131368791
2   13131368792
3   13131368793
4   13131368794
上面是要访问的数据库,用Access做的,现在要写一个小程序,要求是,每隔2秒钟访问一条记录,当访问到最后一条记录时隔5秒钟继续从第一条记录开始访问,我设的timer1为2秒,timer2为5秒,代码如下:
procedure TForm1.Button1Click(Sender: TObject);
var
  i:integer;
begin
  for i:=1 to ADOTable1.RecordCount do
  begin
    edit1.Text:=ADOTable1.FieldByName('CardNo').AsString;
    timer1.Enabled:=true;
  end;
end;procedure TForm1.Timer1Timer(Sender: TObject);
var
  i:integer;
begin
  ADOTable1.Next;
  form1.edit1.Text:=form1.ADOTable1.FieldByName('CardNo').AsString;
  timer2.Enabled:=true;
end;procedure TForm1.Timer2Timer(Sender: TObject);
begin
  if ADOTable1.Eof=true then
    ADOTable1.first;
    form1.edit1.Text:=form1.ADOTable1.FieldByName('CardNo').AsString;
    timer1.Enabled:=true;
end;
运行程序后结果是确实从第一条开始访问,当访问到最后一条,隔了5秒钟从第二条开始访问,居然把第一条给跳过去了,以后的循环都一样,都是从第二条开始访问的,找了好长时间毛病也没找出来,大家帮忙看看啊!怎样改才能不条过第一条,让它每次访问到最后一条记录隔5秒再从第一条开始呢?这么短的代码,我改了一下午就是没找到原因,大家帮帮我啊,急死我了~~~

解决方案 »

  1.   

    procedure TForm1.Timer2Timer(Sender: TObject);
    begin
      if ADOTable1.Eof=true then
       begin//
        ADOTable1.first;
        form1.edit1.Text:=form1.ADOTable1.FieldByName('CardNo').AsString;
        timer1.Enabled:=true;
       end;//
    end;
    试试
      

  2.   

    试了,虽然访问4以后,接着从1开始继续访问了,可是从4到1的时间间隔是2秒,不是5秒,是timer1的时间,不是timer2的时间,这怎么回事呢?
      

  3.   

    刚才说错了,还是不行,第二遍不能从第一条开始访问,还是访问完了4,隔5秒后直接访问2了,刚才试程序时,忘了把下午改动的去掉了,所以弄错了,下午的时候是这样的: 
    procedure TForm1.Timer1Timer(Sender: TObject);
    var
      i:integer;
    begin
      ADOTable1.Next;
      form1.edit1.Text:=form1.ADOTable1.FieldByName('CardNo').AsString;
      timer2.Enabled:=true;
      if ADOTable1.Eof=true then
        ADOTable1.first;
        form1.edit1.Text:=form1.ADOTable1.FieldByName('CardNo').AsString;
    end;
    其余的与我第一边发的一样,结果是timer2的时间不起作用,每次访问完了4,隔2秒直接又访问1 了,请大家帮我想想办法,怎样才能访问完了4,隔5秒后直接访问1呢?
      

  4.   

    为什么要用2个timer呢?procedure TForm1.Timer1Timer(Sender: TObject);
    var
      i:integer;
    begin
      if ADOTable1.Eof=true then
        begin
         if Timer1.Interval = 2000 then
             Timer1.Interval := 5000
            else
             Timer1.Interval := 2000;      timer1.Enabled:=false;
          timer1.Enabled:=true;      ADOTable1.first;
        end
        else 
          ADOTable1.Next;    form1.edit1.Text:=form1.ADOTable1.FieldByName('CardNo').AsString;
    end;
      

  5.   

    多谢楼上的,我试了一下,行了,能从第一条访问了,可是第二次访问的时候每一条记录之间的时间不再是2秒了,成了5秒了,本来打算5秒作为每一边的时间间隔的,2秒才是每一条的时间间隔,还有啊,我写的那个代码是不是因为timer里套timer所以导致的不能从第一条访问呀?不然的话为何我的代码就不行呢?
      

  6.   

    procedure TForm1.Button1Click(Sender: TObject);
    begin
        form1.edit1.Text:=form1.ADOTable1.FieldByName('CardNo').AsString;
        ADOTable1.Next;  
        timer1.Enabled:=true;
    end;procedure TForm1.Timer1Timer(Sender: TObject);
    begin
    i:=i+1;//请将i定义到form1的var下
    if i=2 then
      begin
        form1.edit1.Text:=form1.ADOTable1.FieldByName('CardNo').AsString;
        ADOTable1.Next;
        if adotable1.eof then 
         begin
           timer2.Enabled:=true;
           timer1.Enabled:=false;
         end;
        i:=0;
       end;
    end;procedure TForm1.Timer2Timer(Sender: TObject);
    begin
    js:=js+1;//请将js定义到form1的var下
    if js=5 then
      begin
        timer1.Enabled:=True;
        timer2.Enabled:=false;
        ADOTable1.first;
        js:=0;
      end;
    end;
      

  7.   

    //我理解错了,呵呵
    procedure TForm1.Timer1Timer(Sender: TObject);
    var
      i:integer;
    begin
      if ADOTable1.Eof=true then
        begin
          Timer1.Interval := 5000;      timer1.Enabled:=false;
          timer1.Enabled:=true;      ADOTable1.first;
        end
        else 
          ADOTable1.Next;    form1.edit1.Text:=form1.ADOTable1.FieldByName('CardNo').AsString;
        Timer1.Interval := 2000;
    end;
      

  8.   

    //程序中延时
    procedure TForm1.Delay(msecs:integer);
    var
    FirstTickCount:longint;
    begin
    FirstTickCount:=GetTickCount;
    repeat
    Application.ProcessMessages;
    until ((GetTickCount-FirstTickCount) >= Longint(msecs));
    end;procedure TForm1.AutoShow; //自定义一个过程
    begin
      if ADOTable1.Eof=true then
        begin
          Delay(5000);//延时5"      ADOTable1.first;
        end
        else  begin
          Delay(2000);//延时2"
          
          ADOTable1.Next;
        end;    form1.edit1.Text:=form1.ADOTable1.FieldByName('CardNo').AsString;end;只要执行AutoShow应该就可以了,感觉这种效果比较好,CPU占用也小,文件也小些.
      

  9.   

    //我大意了,呵呵
    procedure TForm1.Timer1Timer(Sender: TObject);
    var
      i:integer;
    begin
      if ADOTable1.Eof=true then
        begin
          Timer1.Interval := 5000;      timer1.Enabled:=false;
          timer1.Enabled:=true;      ADOTable1.first;
        end
        else begin
          ADOTable1.Next;
          Timer1.Interval := 2000;  //要放在这里
        end;    form1.edit1.Text:=form1.ADOTable1.FieldByName('CardNo').AsString;
        
    end;
      

  10.   

    谢谢妖魔鬼怪给出的AutoShow!虽然看不太懂,仍然感谢!
    还有后来你又给出的 //我大意了,呵呵 这段代码,我试过了,每次访问完4以后间隔2秒开始访问1,间隔5秒再访问2,间隔1秒再访问3,依次推下去,这个5秒好像放错了地方,唉!咋这么难改呢,难道是我今晚头脑太混乱了,都把代码弄乱了?唉!明天再继续改吧,头都大了!
      

  11.   

    to QQgenie(妖魔鬼怪)://我大意了,呵呵
    procedure TForm1.Timer1Timer(Sender: TObject);
    var
      i:integer;
    begin
      if ADOTable1.Eof=true then
        begin
          Timer1.Interval := 5000;      timer1.Enabled:=false;
          timer1.Enabled:=true;      ADOTable1.first;
        end
        else begin
          ADOTable1.Next;
          Timer1.Interval := 2000;  //要放在这里
        end;    form1.edit1.Text:=form1.ADOTable1.FieldByName('CardNo').AsString;
    end;
    -------------------------------------------------------------------------------------
    根据你上面的代码,运行结果是:每次访问完4以后间隔2秒开始访问1,间隔5秒再访问2,间隔2秒再访问3,依次推下去,这个5秒好像放错了地方,原本打算是访问1到4时间隔为2秒,从4再到1间隔长一些为5秒,仔细分析代码,也确实就是这个意思,可是为什么运行结果不是呢?究竟哪里出了毛病呀????大家都来帮我分析分析,好吗?我都弄了两天了,急死了~~~