从今天起,开始研究学习一下Delphi源码,以更深刻的了解这门语言,再也不仅仅作一个代码搬运工,誓作一名高级代码搬运工!!!html
准备先从DateUtils提及,有时间就更新一下,由于是新手,因此若是有说的不对或不许确的地方还望各位大牛给予指点,谢谢!!!api
(由于我我的用过D6,D7,2006,XE8,最经常使用的为D7,如今最新版Delphi 为XE8,因此之后全部相关的文章都是以XE8的源码来研究,特殊说明除外)函数
System.DateUtils这个单元里面包含系统预约义的一些经常使用的日期\时间相关函数,源文件在D:\ProgramFiles\Embarcadero\Studio\16.0\source\rtl\common\System.DateUtils.pas(安装路径确定要换成大家本身的)性能
先看看DateOf与TimeOf的声明与实现学习
//声明部分,在System.DateUtils的第69行 { Simple trimming functions } function DateOf(const AValue: TDateTime): TDateTime; inline; function TimeOf(const AValue: TDateTime): TDateTime; inline;
//实现部分,在System.DateUtils的第577行 function DateOf(const AValue: TDateTime): TDateTime; begin Result := Trunc(AValue); end; function TimeOf(const AValue: TDateTime): TDateTime; begin Result := Frac(AValue); end;
下面是我测试的代码测试
unit UMain; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, system.DateUtils; type TFMain = class(TForm) btnDateOf: TButton; MMOResult: TMemo; btnTimeOf: TButton; procedure FormCreate(Sender: TObject); procedure btnDateOfClick(Sender: TObject); procedure btnTimeOfClick(Sender: TObject); private FDateFormatSetting: TFormatSettings; { Private declarations } public { Public declarations } end; var FMain: TFMain; sDate: string = '2015-08-10 14:28:28'; implementation {$R *.dfm} procedure TFMain.btnDateOfClick(Sender: TObject); var dBefore, dAfter: TDateTime; begin //DateOf:获取参数的日期部分,时间部分用00:00:00填充(此处不考虑毫秒) dBefore := StrToDateTime(sDate, FDateFormatSetting); //由于咱们知道TDateTime类型其实是一个从1899年12月30日开始从0算起的浮点数 //而DateOf里面直接使用Trunc对传入的日期作了整数截断操做 //因此获得的值就是一个从1899年12月30日开始+返回的整数天的一个新的日期 //不包含时分秒(由于TDateTime整数部分表明日期,小数部分表明时间) dAfter := DateOf(dBefore); //(DateOf)beforeDate:2015-08-10 14:28:28 MMOResult.Lines.Add('(DateOf)beforeDate:' + FormatDateTime('yyyy-MM-dd HH:nn:ss', dBefore)); //(DateOf)afterDate:2015-08-10 00:00:00 MMOResult.Lines.Add('(DateOf)afterDate:' + FormatDateTime('yyyy-MM-dd HH:nn:ss', dAfter)); end; procedure TFMain.btnTimeOfClick(Sender: TObject); var dBefore, dAfter: TDateTime; begin //TimeOf:获取参数的时间部分,日期部分用1899-12-30填充 dBefore := StrToDateTime(sDate, FDateFormatSetting); //一样的道理,TimeOf里面使用Frac函数直接取参数的小数部分 //这时候获得的浮点数实际上是一天的百分比 //直接用24*60*TimeOf返回值,获得的就是从0点0分0秒0毫秒到这个时间的分钟数 dAfter := TimeOf(dBefore); //而Delphi的日期是从1899-12-30开始的 //因此计算出来的结果为 //(TimeOf)beforeDate:2015-08-10 14:28:28 MMOResult.Lines.Add('(TimeOf)beforeDate:' + FormatDateTime('yyyy-MM-dd HH:nn:ss', dBefore)); //(TimeOf)afterDate:1899-12-30 14:28:28 MMOResult.Lines.Add('(TimeOf)afterDate:' + FormatDateTime('yyyy-MM-dd HH:nn:ss', dAfter)); end; procedure TFMain.FormCreate(Sender: TObject); begin //初始化公用的日期格式化参数 此处是为了兼容不一样电脑的日期格式 FDateFormatSetting.ShortDateFormat := 'yyyy-MM-dd'; FDateFormatSetting.DateSeparator := '-'; FDateFormatSetting.TimeSeparator := ':'; //FDateFormatSetting.LongTimeFormat:='hh:mm:ss.zzz'; FDateFormatSetting.LongTimeFormat := 'hh:mm:ss'; end; end.
接下来对以上代码用到的关键字及其余函数做一个简单介绍:spa
inline:(1)用于描述某个函数时-为了提升应用程序的性能,能够用inline声明一个函数过过程,对于声明为inline的过程,编译器在编译时,会取代正常的过程调用方式,取而代之是 直接把这个函数的编译代码拿过来生成到调用该过程的地方,有多处调用一个函数,都直接在调用处插入函数的编译代码,这样的弊端,会生成较大的EXE文件。.net
摘自:Delphi XE4 inline的用法code
(2)InLine关键字用于Asm或assembler结构中,
用于指出该汇编语句是向下兼容的.它对于程序的编译没有任何影响.
orm
关于Delphi 的Inline关键字的说明文章相对较少,暂时只找到了以上两条重要的贴在这里,之后有时间了能够详细了解一下,或者有人知道更详细的资料能够直接回复本帖,也能够私信我.
Trunc():返回参数的整数部分,如Trunc(-123.55)=-123.
Frac():返回参数的小数部分,如Frac(-123.55)=-0.55.