width="84%">也谈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 属 性 无 论 取 何 值 都 可 使 用。
