说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

DELPHI中处理时间

HTML文档下载 WORD文档下载 PDF文档下载
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:=FElapsedTime/86400;

//将流逝的时间加到原来的时间上

dtTemp:=FStartDateTime+tmTemp;

//转换为Windows32位时间格式

DateTimeToSystemTime(dtTemp

NewTime);

//设定时间

SetLocalTime(NewTime);

end;

//释放

destructorTSysTime.Destroy;

begin

//恢复系统时钟

ResetTime;

//记时器停止

FTimer.Enabled:=False;

//释放时钟对象

FTimer.Free;

end;

end.

备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘