大哥哥最近要寫到讓使用者挑選日期與日期判斷的搜尋程式,發現這篇文章大概就可以得知日期基本處理的技巧,趕快紀錄下來,畢竟大家現在都沒在學delphi....^^"
http://www.twbbs.net.tw/1305277.html
也 談Delphi 中 的 日 期 輸 入
---- 日 期 輸 入 雖 然 是 小 事, 但 卻 幾 乎 每 一 個 程 序 裏 都 會 碰
到, 處 理 不 好 也 會 惹 出 許 多 麻 煩(2000 年 問 題 即 是 日 期 引 起
的 世 界 性 麻 煩)。 現 談 一 談 筆 者 在Delphi 編 程 中 對 日 期 處 理
的 一 些 經 驗 和 感 受, 請 大 家 指 正。
---- 在 程 序 中 使 用 現 成 的 控 件 是 現 在 編 程 的 一 種 趨 勢, 其
實,DateTimePicker 就 是 一 個 很 好 的 控 件, 關 鍵 是 如 何 靈 活 變 通
地 運 用。DateTimePicker 是Microsoft 向Windows95 通 用 控 件 庫 新 添 的
控 件, 是 輸 入 日 期 和 時 間 的 簡 單 工 具, 具 有 良 好 的 圖 形 界
面。 該 控 件 在Delphi 名 為Win32 的 控 件 面 板 中, 對 其kind 屬 性 的
選 擇 可 以 確 定 是 輸 入 時 間 還 是 日 期, 在 日 期 輸 入 中 又 有
一 些 屬 性 可 供 不 同 的 選 擇, 其 中Datamode 有dmUpDown 和dmComboBox
兩 個 選 項, 選 擇 前 者, 就 可 以 在 輸 入 日 期 時, 用 鼠 標 點 激
向 上 或 向 下 按 鈕, 從 而 可 以 非 常 方 便 地 對 年、 月、 日 進 行
遞 增 或 遞 減; 選 擇 後 者, 在 運 行 時 用 鼠 標 點 激, 就 會 彈 出
一 個 界 面 友 好 的 對 話 框, 從 而 可 以 從 中 選 取 日 期, 這 時 日
是 從 相 應 的 月 曆 表 中 選 取, 年 和 月 則 仍 是 通 過 按 箭 頭 按
鈕 遞 增 或 遞 減。 但 不 管 是dmUpDown 還 是dmComboBox, 都 可 以 在 其
上 直 接 輸 入 年 月 日 的 值, 並 且 自 動 地 保 證 日 期 的 有 效 性(
如 閏 年 問 題 等), 因 此 完 全 涵 蓋 了《Delphi 中 日 期 輸 入 法 二 則》
一 文 中 自 己 定 制 的 日 期 輸 入 窗 口 的 功 能 和 速 度。Dateformat 屬
性 有dfLong 和dfShort 兩 種 選 擇, 前 者 為 長 日 期 型( 如1999 年2 月16
日, 如 果 得 到 的 不 是 理 想 的 形 式, 可 調 整Windows 控 制 面 板 上
區 域 設 置 中 的 日 期 格 式 以 及DateTimePicker 的Font 屬 性 的Charset
值, 一 般 情 況 取DEFAULT_CHARSET 或GB2312_CHARSET 即 可), 後 者 為
短 日 期 型( 如99-2-16), 考 慮 到 跨 世 紀 問 題, 短 日 期 要 慎 用。
但 長 日 期 型 的 值 不 可 直 接 作 為 日 期 值 賦 給 日 期 型 的 變 量,
要 做 一 點 轉 換 工 作, 舉 例 如 下:
procedure Tform1.DateTimePicker1CloseUp
(Sender: TObject);
var
Year, Month, Day: Word;
Datetime:TDatetime;
begin
DecodeDate(DateTimePicker1.datetime,
Year, Month, Day);
//將DateTimePicker1的年月日的值分別賦給
Year, Month, Day
EditDATE.Text:=inttostr(year)+'-'
+inttostr(Month)+'-'+inttostr(Day);
// EditDATE為TDBEdit型的編輯框,
對應一個日期型的資料表字段
//若將其變為短日期型的,
可以發現Delphi把短日期即00--99年都解釋
//為1900--1999年,
而不受Windows控制面板中區域設置中格式的控制
Datetime:=EncodeDate(Year,Month,Day);
//把年月日合成為日期值
end;
---- 上 面 這 個 小 程 序 中,form1 的DateTimePicker1 的Dateformat 屬 性
為dfLong,Datamode 的 屬 性 為dmComboBox。 DateTimePicker1CloseUp 為 日 期
輸 入 對 話 框 縮 起 時 發 生 的 事 件, 也 可 以 用OnChang 事 件, 即
DateTimePicker 發 生 變 化 時 觸 發, 則Datamode 屬 性 無 論 取 何 值 都
可 使 用。
---- 可 見 對DateTimePicker 控 件 只 要 稍 加 處 理 即 可 美 觀 快 捷 地
解 決 日 期 輸 入 問 題。, 默 許 狀 態 下 日 期 只 能 在1752 年9 月14 日
至2999 年12 月31 日 之 間, 但 可 以 通 過 對 其mindate 和maxdate 賦 值 擴
大 選 擇 範 圍。
---- 但 是 該 控 件 也 有 一 點 缺 憾, 對1899 年12 月30 日 以 前 的 數 值
錄 入 須 小 心, 容 易 出 錯。 這 倒 引 入 了 另 一 個 話 題, 即Delphi 中
的 日 期 型( 即Tdate 型 ) 的 定 義 為:type TDate = type TDateTime; 而
TdateTime 型 的 定 義 為:type TDateTime = type Double; 可 見 日 期 型 歸
根 到 底 是 雙 精 度 浮 點 型(Double 型),Delphi 規 定 其 整 數 部 分
為1899 年12 月30 日 以 來 的 天 數, 小 數 部 分 則 為24 小 時 按 比 例
分 割 存 儲, 例 如:
0 12/30/1899 12:00 am 2.75 1/1/1900 6:00 pm
-1.25 12/29/1899 6:00 am 35065 1/1/1996 12:00 am
---- (12:00 am 即 為 淩 晨0 點,11:00 am 即 為 早 晨11 點,12:00 pm 即 為
中 午12 點,1:00 pm 即 為 中 午1 點)
---- 而 在Delphi1.0 中, 其 整 數 部 分 為 公 元1 年 以 來 的 天 數, 之 所
以 這 樣 改 動 是 為 了 更 好 地 與OLE2.0 相 兼 容。 對 於 日 期 的 運 算
一 定 得 注 意 類 型 的 匹 配, 而 且 由 於 日 期 型 實 則 為Double 型, 所
以 可 對 其 進 行 加 減 乘 除 運 算, 現 舉 例 如 下:
procedure TForm1.Table1CalcFields(DataSet: TDataset);
var
t1, t2: tDateTime;
begin
table1d1.asDateTime := Date + 2;
{or table1d1.value := date + 2;} // Date為系統日期
table1d2.asDateTime := Date - 2;
//d1,d2為表table1中date or dateTime型欄位。
t1 := table1d1.asDateTime;
t2 := table1d2.asDateTime;
table1d3.asInteger := trunc(double(t1) - double(t2));
// trunc為取整函數,d3為表table1
中integer型欄位,結果為日期d1和d2的差。
end;
---- 另 外, 在Delphi 中 可 以 方 便 地 顯 示 系 統 時 間, 只 要 利
用DateToStr(Date) 及TimeToStr(Time) 函 數 即 可 實 現。 也 可 以 通
過 調 用WindowsAPI 函 數 來 實 現 對 系 統 時 間 的 設 置, 具 體 方 法
如 下:
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text:='1998-12-12 12:00 am';
end;
//可在運行時,也可在Edit1中重新鍵入日期,
但須注意格式。
procedure TForm1.Button2Click(Sender: TObject);
var
systemtime:Tsystemtime;
DateTime:TDateTime;
begin
DateTime:=StrToDateTime(Edit1.text);
DateTimeToSystemTime(DateTime,systemtime);
SetLocalTime(SystemTime);
GetLocalTime(SystemTime);//讀取北京東8區時間
DateTime:=SystemTimeToDateTime(SystemTime);
Edit2.Text:=DateTimeToStr(DateTime);
end;
//Button2點激後,系統時間就變為Edit1中的時間
留言列表