delphi中时间控制

摘要:
蒂默的想法有问题。请参考以下想法:创建表单时,记录GetTickCount值,然后捕获鼠标和键盘消息。如果有鼠标和键盘消息发送到表单,请再次记录GetTickCount值。如果没有,则计算当前GetTickCount值减去原始值是否大于指定时间,如果大于指定时间则关闭。

用TTimer的思路有点问题。
请参考以下思路:
  窗体建立时,记录GetTickCount值(关于GetTickCount,请Google),然后,捕捉鼠标键盘消息,如有发送到本窗体的鼠标键盘消息,则重

新记录GetTickCount值,如无,则计算当前GetTickCount值减去原值是否大于规定时间,如大于则Close。

例子如下:

//思路是这样的,但我的代码并不一定全面。

窗体类的
  private部分,放一个全局变量:
    FX : Cardinal;

在窗体上放一个ApplicationEvents控件,在其OnMessage中写代码:

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  if (GetTickCount - FX) > 1000 * 60 * 2 then Self.Close;//如超时2分钟则关本窗体
  if (Msg.message = WM_MouseMove)//如果鼠标在窗体范围内移动
  or (Msg.message = WM_KeyDown)  //或者键盘按下
  then FX := GetTickCount;       //则重新计时
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FX := GetTickCount;
end;
////////////////////////////////////


请看一下我的实现:(虽然还是用了TTimer,但需注意,在我的代码里,TTimer不是主角)

以下是全部代码:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, AppEvnts, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    ApplicationEvents1: TApplicationEvents;
    Label1: TLabel;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure ApplicationEvents1Message(var Msg: tagMSG;
      var Handled: Boolean);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
    FX : Cardinal;/////////////////////////<-----------------------
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Self.Caption := '本窗体如果客户区无鼠标键盘操作则10秒后关闭';//包括鼠标在客户区移动
  Button1.Caption := '鼠标测试';
  Edit1.Text := '按键输入';
  FX := GetTickCount;  ////赋初值
  Timer1.Interval := 1;
end;

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  if (GetTickCount - FX) > 1000 * 10 then Self.Close;//如超时10秒则关本窗体
  if ((Msg.message >= WM_MouseFirst) and (Msg.message <= WM_MouseLast))//如果有鼠标消息
  or ((Msg.message >= WM_KeyFirst) and (Msg.message <= WM_KeyLast))//或者有键盘消息
  then FX := GetTickCount;                                     //则重新计时
end;

procedure TForm1.Timer1Timer(Sender: TObject);//显示倒计时
begin
  Label1.Caption := InttoStr(10 - (GetTickCount-FX) div 1000);
end;

end.

免责声明:文章转载自《delphi中时间控制》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇打开 EXCEL时出现RUN-TIME ERROR“91”,怎么解决?PHP集成微信支付(APP支付)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

python网络编程 day35 网络编程——进程池,线程池、协程、回调函数、gevent模块、asyncio模块

一、内容回顾 面试题: 请聊聊进程队列的特点和实现原理 进程之间可以互相通信 IPC 数据安全 先进先出 实现原理 管道+锁 管道是基于文件级别的socket+pickle实现的 你了解生产者消费者模型吗? 了解 为什么了解? 工作经历: 采集图片,爬取音乐,主要是爬取大量数据,想提高爬虫效率,有用过一个生产者消费者模型,这个模型...

C# WinForm获得主窗体——如何判断哪个是主窗体

一. 关于定义 主窗体的定义一般有两种。第一种就是一般上,普遍意义认为是程序中第一个被创建出来的窗体,但是由于一些程序在显示主窗体之前会有一个登录或者引导窗体,在使用完了之后直接隐藏而不是关闭。这个时候,主窗体并不会是第一个窗体。所以,第二种说法就是说,包含了软件整体功能的展示性界面所在的窗体,我们称之为主窗体。 而在本文中,所有叙述中所指的主窗体都是指的...

Delphi Delay 延时计数的功能。 下面的方法都是思路,但是没有用在项目上

procedure Tfrm_InstrumentControl.aa;varCurLength: Word;vTimeLength: Word;beginScreen.Cursor := crHourGlass;tryvTimeLength := StrToIntDef(num_GrossAnalyzeTime.Text, 0) * 60;CurLeng...

ShellExecute详细用法(可以单独打开一个文件)

ShellExecute的功能是运行一个外部程序,或者打开一个已注册的文件、打开一个目录、打印文件等等功能,它可以打开电脑内的任何文件,也可以打开URL。函数的原型: 1 HINSTANCE ShellExecute( 2 HWND hwnd, 3 LPCTSTR lpOperation, 4 LPCTSTR lpFile, 5 LPCTSTR l...

DBGridEh选择时高亮度显示问题 Delphi

这是我自画dbgrideh的函数,其中有些地方是根据我的实际需要设的,你可以改改看procedureTfrmCopyBook_MeterCopy.SetGridColor(varAdoTable:TDataSet;varDbGrid1:TDBGrideh;constRect:TRect;DataCol:Integer;Column:TColumneh;S...

网络IPC:套接字

摘要: UNIX系统进程间通信机制(IPC),例如管道,FIFO,消息队列,信号量和共享存储,可以允许一台计算机上的进程通信。 而套接字网络进程通信接口,不仅实现了一台计算机的通信,还能够进行网络进程间通信。 一、四层协议栈 数据链路层 网卡接口的网络驱动程序,处理数据在物理媒介上的传输;不同的物理网络具有不同的电气特性,网络驱动程序隐藏实现细节,为上层协...