|
济宁鲁抗医药集团 许振华 ----笔者在编写一个解除共享软件使用时间限制的小软件时,采用的原理是首先保存现在的 时间,然后将系统时间设定为共享软件可运行的时间,再启动共享软件,最后在共享软件 退出时再将系统时间恢复为原来保存的时间。但在调试程序的过程中发现了这样一个问题, 由于在共享软件运行其间,时间已流逝,所以恢复原来保存的时间后就会导致系统时间滞 后,滞后的时间为共享软件的运行时间。 ----如何来解决这个问题呢?笔者经过摸索,采用在共享软件启动的同时启动一个定时器, 用一个变量保存流逝的时间,在共享软件结束时定时器停止工作,然后将流逝的时间加到 原来保存的时间上作为系统时间恢复,这样就彻底解决了软件运行导致系统时钟变慢的问 题。为了能在方便其他程序使用,编写了一个用于处理事件的类,在此介绍如下,以便于 大家在编写与时间有关的程序时参考,从中可了解如何保存现在时间、设定新时间、记录 流逝时间、恢复系统时间的方法。 ----代码如下: 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. |