從今天起,開始研究學習一下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.