在访问数据库时加了个timer,很简单的代码就是找不出错误在哪里,请高手指点指点!感激!!!

sdzbbz 2006-08-03 07:54:37
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秒再从第一条开始呢?这么短的代码,我改了一下午就是没找到原因,大家帮帮我啊,急死我了~~~
...全文
183 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdzbbz 2006-08-04
  • 打赏
  • 举报
回复
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秒,仔细分析代码,也确实就是这个意思,可是为什么运行结果不是呢?究竟哪里出了毛病呀????大家都来帮我分析分析,好吗?我都弄了两天了,急死了~~~
sdzbbz 2006-08-03
  • 打赏
  • 举报
回复
谢谢妖魔鬼怪给出的AutoShow!虽然看不太懂,仍然感谢!
还有后来你又给出的 //我大意了,呵呵 这段代码,我试过了,每次访问完4以后间隔2秒开始访问1,间隔5秒再访问2,间隔1秒再访问3,依次推下去,这个5秒好像放错了地方,唉!咋这么难改呢,难道是我今晚头脑太混乱了,都把代码弄乱了?唉!明天再继续改吧,头都大了!
QQgenie 2006-08-03
  • 打赏
  • 举报
回复
//我大意了,呵呵
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;
QQgenie 2006-08-03
  • 打赏
  • 举报
回复
//程序中延时
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占用也小,文件也小些.
sdzbbz 2006-08-03
  • 打赏
  • 举报
回复
妖魔鬼怪大哥,根据你的提示,我又改了一遍,还是每次都是2秒,访问完了4 再访问1也是2秒,怪了!不过仍然很感谢上面几位大哥,继续努力中!!!
sdzbbz 2006-08-03
  • 打赏
  • 举报
回复
刚才说的baronyang大哥,呵呵
sdzbbz 2006-08-03
  • 打赏
  • 举报
回复
楼上的大哥,还是不行啊,访问第一遍之后居然不再访问第二遍了,改了n边了,我都改乱了,急的直冒汗~~
QQgenie 2006-08-03
  • 打赏
  • 举报
回复
//我理解错了,呵呵
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;
人鱼传说 2006-08-03
  • 打赏
  • 举报
回复
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;
sdzbbz 2006-08-03
  • 打赏
  • 举报
回复
多谢楼上的,我试了一下,行了,能从第一条访问了,可是第二次访问的时候每一条记录之间的时间不再是2秒了,成了5秒了,本来打算5秒作为每一边的时间间隔的,2秒才是每一条的时间间隔,还有啊,我写的那个代码是不是因为timer里套timer所以导致的不能从第一条访问呀?不然的话为何我的代码就不行呢?
QQgenie 2006-08-03
  • 打赏
  • 举报
回复
为什么要用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;
sdzbbz 2006-08-03
  • 打赏
  • 举报
回复
这么简单的问题难道都没有人来帮忙吗?
sdzbbz 2006-08-03
  • 打赏
  • 举报
回复
刚才说错了,还是不行,第二遍不能从第一条开始访问,还是访问完了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呢?
sdzbbz 2006-08-03
  • 打赏
  • 举报
回复
试了,虽然访问4以后,接着从1开始继续访问了,可是从4到1的时间间隔是2秒,不是5秒,是timer1的时间,不是timer2的时间,这怎么回事呢?
gbys 2006-08-03
  • 打赏
  • 举报
回复
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,497

社区成员

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

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