
本站地址:http://www.bajiao123.com

Delphi中日期输入法二则
在Windows 95 中, 日 期 的 显 示 格 式
和 输 入 格 式 有 好 几 种, 如:yyyy-m-d、m-d-yyyy 等, 这 可 以 在
控 制 面 板 的 区 域 设 置 中 设 置。 因 此, 不 同 计 算 机 上 的
日 期 格 式 很 可 能 不 一 样, 在 输 入 日 期 值 时, 年、 月、
日 的 输 入 顺 序 就 可 能 随 机 器 的 不 同 而 发 生 变 化, 这 往
往 会 把 用 户 弄 糊 涂。 另 外, 日 期 值 的 有 效 性 也 是 一 个
值 得 注 意 的 问 题。 为 此, 笔 者 介 绍 两 种 既 可 以 避 免 日
期 格 式 不 一 致, 又 可 以 保 证 日 期 有 效 性 的 日 期 输 入 方
法。
一、 使 用TdateTimePicker 控 件
TdateTimePicker 控 件 在Delphi 名 为Win32 的 控 件 面 板 中。 它 提
供 了 一 个 象 日 历 一 样 的 日 期 选 择 界 面, 可 以 从 中 选 择
一 个 日 期 值, 选 中 的 日 期 值 存 放 在 名 为Date 的 属 性 中。TdateTimePicker
控 件 的 使 用 比 较 简 单, 读 者 不 妨 亲 自 去 体 验 一 下。 需
要 注 意 的 是, 其 属 性Kind 的 值 为dtkDate 时 输 入 日 期, 为dtkTime
时 输 入 时 间, 时 间 值 存 放 在 名 为Time 的 属 性 中。TdateTimePicker
控 件 使 用 方 便 并 能 保 证 输 入 的 是 有 效 的 日 期 值, 但 日
期 的 输 入 采 用 选 择 的 方 式, 因 此 输 入 的 速 度 较 慢。
二、 定 制 日 期 输 入 窗 口
定 制 自 己 的 日 期 输 入 窗 口 可 以 较 快 地 输 入 日 期
值, 同 时 也 可 以 保 证 输 入 有 效 的 日 期 值, 但 需 要 编 程
来 控 制。 下 面 逐 步 介 绍 日 期 输 入 示 例 程 序 的 编 制 过
程。
1.建 立 一 个 应 用 程 序( 项 目), 在 窗 体(Form) 中 放 置 三
个 编 辑 框, 名 字 分 别 为EditYear、EditMonth 和EditDay, 分 别 用 来
输 入 年、 月 和 日。 清 除 它 们 的Text 属 性 中 的 字 符。
2.为 了 保 证 只 能 在 编 辑 框 中 输 入 数 字, 在EditYear 的OnKeyPress
事 件 中, 加 入 如 下 所 示 的 代 码:
procedure TForm1.EditYearKeyPress(Sender: TObject; var Key: Char);
begin
if not (key in ['0'..'9',#8,#13]) then
//输入的不是数字键、删除键或回车键
begin
Beep; //发声警告
Key:=#0; //删除输入的非法字符
end;
end;
3.把EditMonth 和EditDay 的OnKeyPress 事 件 指 定 为EditYearKeyPress。
4.在 窗 体 中 放 入 一 个 按 钮, 取 名 为BitBtnCheck, 把 其 属 性Caption
改 为" 检 验", 在BitBtnCheck 的OnClick 事 件 中, 加 入 代 码
后 如 下 所 示:
procedure TForm1.BitBtnCheckClick(Sender: TObject);
var Year,Month,Day,ErrorCode:Integer;
Datetime:TDatetime;
begin
Val(EditYear.Text,Year,ErrorCode);
Val(EditMonth.Text,Month,ErrorCode);
Val(EditDay.Text,Day,ErrorCode);
try
Datetime:=EncodeDate(Year,Month,Day);
//把年月日合成日期值
ShowMessage('输入的日期为:'+DatetimeToStr(Datetime));
except
on EConvertError do //若日期值无效,则执行以下代码
begin
ShowMessage('输入的日期无效,请检查!');
EditYear.SetFocus;
end;
end;
end;
5.在 窗 体 中 再 加 入 一 个 按 钮, 取 名 为BitBtnClose, 把 其 属 性Caption
改 为" 关 闭", 在BitBtnClose 的OnClick 事 件 中, 添 加 如 下
代 码:
procedure TForm1.BitBtnCloseClick(Sender: TObject);
begin
Close;
end;
6.运 行 本 程 序, 输 入 日 期 值, 按" 检 验" 按 钮 进 行
测 试。
7.单 击 按 钮" 关 闭", 退 出 运 行。
本 程 序 在Delphi 3.0 下 调 试 通 过。
根 据 第 二 种 方 法 的 思 想, 可 以 编 制 一 个 输 入 日 期
值 的 控 件。 把 它 注 册 到Delphi 的 控 件 面 板 后, 就 可 以 象TEdit
等 标 准 控 件 那 样 使 用 它 了。 实 现 的 大 致 思 路 是: 以TPanel
类( 控 件) 为 父 类 创 建 一 个 名 为TDatePanel 的 类, 在 类TDatePanel
中 加 入 三 个 编 辑 框, 分 别 用 来 输 入 年 月 日, 并 在 类TDatePanel
的 实 现(implementation) 中 对 输 入 的 日 期 进 行 有 效 性 检 查。
感 兴 趣 的 读 者 不 妨 试 一 试。
yuqing yq_buaa@263.net
1.Mail.txt: 本 文 件, 信 函 文 件
2.issue.rtf:Word 文 件, 稿 件
3.DatePanl.pas:TdatePanel 控 件 的 实 现 单 元( 其 使 用 请 见 该 单 元
开 头 部 分 的 注 释)
4.Project1.dpr : 测 试TdatePanel 控 件 的 项 目 文 件
5.Project1.res: 项 目 的 资 源 文 件
6.demo.dfm:TdatePanel 控 件 的 测 试 单 元 对 应 的Form 文 件
7.demo.pas:TdatePanel 控 件 的 测 试 单 元 对 应 的 源 程 序
本站地址:http://www.bajiao123.com

