如何制作没有窗口但是有计时器功能的程序?(50分)

  • 主题发起人 主题发起人 ZhangFei
  • 开始时间 开始时间
Z

ZhangFei

Unregistered / Unconfirmed
GUEST, unregistred user!
要求实现计时器功能但不要有窗口。
 
把DPR文件的所有的FORM都删掉.
创建个TIMER,不就行了.
例子等一下贴给你.
 
我要出去了,先告诉你如何写.
有关写没有窗体的讨论本论坛
好象讨论过了.你先方个TIMER到窗体
上去,按住CTRL,鼠标点击TTimer你就
什么都名白了,有问题EMAIL给我.
不过要快,我要回家了.
 
实现方法有很多种,下面是一个每秒钟鸣叫一次的例子,可以编译执行

//project1.dpr
program Project1;

uses
Messages,Windows,Extctrls,Classes;

type
TMyTimer=class(TTimer)
procedure MsgBeep(Sender:TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

{$R *.RES}
procedure TMyTimer.MsgBeep(Sender:TObject);
begin
MessageBeep(MB_OK);
end;

var
Timer1:TMyTimer;
AMessage:TMsg;
begin
Timer1:=TMyTimer.Create(nil);
Timer1.Interval:=1000;
Timer1.OnTimer:=Timer1.MsgBeep;

while GetMessage(AMessage, 0, 0, 0) do
begin
TranslateMessage(AMessage);
DispatchMessage(AMessage);
end;
end.
 
手动创建TTIMER实例,然后手动FREE掉
 
Var
time1: Ttimer;
begin
timer1 := ttimer.create
...
timer1.free;
end;
的简单是把TTIMER放在FORM上,然后HIDE FORM
 
没有窗体的App(Console App)很容易做: 新建一个App, 把Form都删除, 关键是如
何控制程序的结束.

另外, TTimer是定时器, 不是计时器. 计时要通过GetTickCount函数来实现(或者是
取得系统时间):
设一个longint型的全局变量, 记录启动时的ClickCount, 在消息循环中调用
GetClickCount减去启动ClickCount除以1000既是秒数.

将duhe的代码修改后, 让程序运行10秒后退出:

var
Timer1:TMyTimer;
AMessage:TMsg;
BaseCount: LongInt;
begin
BaseCount:=GetTickCount;
Timer1:=TMyTimer.Create(nil);
Timer1.Interval:=1000;
Timer1.OnTimer:=Timer1.MsgBeep;

while GetMessage(AMessage, 0, 0, 0) do
begin
TranslateMessage(AMessage);
DispatchMessage(AMessage);
if (GetTickCount-BaseCount)>10000 then
break;
end;
end.
 
收到WM_Close消息后退出
while GetMessage(AMessage, 0, 0, 0) do
begin
if AMessage.Message=WM_Close then Exit;
TranslateMessage(AMessage);
DispatchMessage(AMessage);
end;
 
接受答案了.
 
后退
顶部