DELPHI中处理时间

----笔者在编写一个解除共享软件使用时间限制的小软件时,采用的原理是首先保存现在的
时间,然后将系统时间设定为共享软件可运行的时间,再启动共享软件,最后在共享软件
退出时再将系统时间恢复为原来保存的时间。但在调试程序的过程中发现了这样一个问题,
由于在共享软件运行其间,时间已流逝,所以恢复原来保存的时间后就会导致系统时间滞
后,滞后的时间为共享软件的运行时间。

----如何来解决这个问题呢?笔者经过摸索,采用在共享软件启动的同时启动一个定时器,
用一个变量保存流逝的时间,在共享软件结束时定时器停止工作,然后将流逝的时间加到
原来保存的时间上作为系统时间恢复,这样就彻底解决了软件运行导致系统时钟变慢的问
题。为了能在方便其他程序使用,编写了一个用于处理事件的类,在此介绍如下,以便于
大家在编写与时间有关的程序时参考,从中可了解如何保存现在时间、设定新时间、记录
流逝时间、恢复系统时间的方法。

----代码如下:

unitSystemTime;

interface

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

type
TSysTime=class(TObject)
private
//系统日期、时间
FStartDateTime:TDateTime;
//定时器
FTimer:TTimer;
//流逝时间变量
FElapsedTime:Integer;

procedureTimer(Sender:TObject);

protected

public
constructorCreate;virtual;
destructorDestroy;override;
procedureSetNewTime(NewTime:TSystemTime);
procedureResetTime;
end;

implementation

//构造器
constructorTSysTime.Create;

begin
//保存当前日期、时间
FStartDateTime:=Now;
//生成定时器对象
FTimer:=TTimer.Create(nil);
//设定时钟间隔为一秒
FTimer.Interval:=1000;
//时钟事件
FTimer.OnTimer:=Timer;
//开始记时
FTimer.Enabled:=True;
end;

//设定系统新时间
procedureTSysTime.SetNewTime(NewTime:
TSystemTime);
begin
SetLocalTime(NewTime);
end;

//流逝时间
procedureTSysTime.Timer(Sender:TObject);
begin
//保存流逝的时间(以秒为单位),每秒加1
Inc(FElapsedTime);
end;

//恢复系统时钟
procedureTSysTime.ResetTime;

var
NewTime:TSystemTime;
tmTemp:Double;
dtTemp:TDateTime;

begin
//将流逝的时间转换为天数
tmTemp:=FElapsedTime86400;
//将流逝的时间加到原来的时间上
dtTemp:=FStartDateTime+tmTemp;
//转换为Windows32位时间格式
DateTimeToSystemTime(dtTemp,NewTime);
//设定时间
SetLocalTime(NewTime);
end;

//释放
destructorTSysTime.Destroy;
begin
//恢复系统时钟
ResetTime;
//记时器停止
FTimer.Enabled:=False;
//释放时钟对象
FTimer.Free;
end;

end.


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值