免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
专栏:Delphi技术 文章编号:934 文章类别: 原创 作者: yh 加贴时间:00-5-20 11:57:05 在Delphi中处理数据库日期型字段的显示与输入关键词:Delphi - MIS- 在使用Delphi进行数据库设计时,不可避免的会涉及到日期型字段的输入问题。不过与Microsoft的Access 97中文版等相比,Delphi本身提供的日期型字段的显示和输入方式并不适合中国人的习惯。因此对于日期型字段的处理,大家提出了不少解决方法,但是处理结果在显示和输入上并不统一,例如显示时可以实现“yyyy年mm月dd日”的格式,但是在输入时还是要按照国外的习惯用“yyyy-mm-dd”的形式进行输入;而使用TdateTimePicker进行选择输入总嫌麻烦;有些方法还要修改系统的一些设置属性,因而在进行软件发布时要将系统的属性进行调整;采用第三方控件的方式则还要将控件打包发布。而且对于常用到的“1999年”、“1999年11月”等日期格式,没有进行相应的处理。这里我根据自己的实践,利用TField的OnGetText和OnSetText两个事件的结合,以期达到日期型字段的显示和输入的统一,并可以处理我们常见的“1999年”、“1999年11月”等日期形式的显示和输入,全部利用Delphi提供的事件实现,不需要修改任何系统设置。进行相应的扩展后,还可以用于时间的显示和输入,如“hh点mm分”等。同时,由于是直接控制TField的事件,所以不论使用TDBGrid还是用TDBEdit,都可以正常的进行统一处理,而不必分开考虑。采用类似的方法,还可以应用于非数据库应用程序中的日期输入。 - 1 基本思想 - 利用TField的EditMask属性,将其同时作为显示和输入的掩码,在TField的OnGetText事件中处理日期字段的显示,而在OnSetText事件中处理输入值的有效性判断。为了重复利用代码,将OnGetText和OnSetText的事件处理过程调用的过程和函数放到一个独立的单元中。 - 2 具体实现代码 显示和判断单元unit DBDateEditMaskTrans;interfaceuses Windows, SysUtils, Controls, Forms,Db; 日期型字段显示过程,在OnGetText事件中调用 procedure DateFieldGetText(Sender: TField;var Text: String); 日期型字段输入判断函数,在OnSetText事件中调用 function DateFieldSetText(Sender: TField; const Text: String):Boolean;implementationprocedure DateFieldGetText(Sender: TField;var Text: String);var dDate:TDate; wYear,wMonth,wDay:Word; aryTestYMD:Array 1.2 of Char;测试输入掩码用临时数组 iYMD:Integer;begin dDate:=Sender.AsDateTime; DecodeDate(dDate,wYear,wMonth,wDay);测试输入掩码所包含的格式. aryTestYMD:=年; if StrScan(PChar(Sender.EditMask),aryTestYMD1)nil then iYMD:=1; aryTestYMD:=月; if StrScan(PChar(Sender.EditMask),aryTestYMD1)nil then iYMD:=2; aryTestYMD:=日; if StrScan(PChar(Sender.EditMask),aryTestYMD1)nil then iYMD:=3; case iYMD of 1:输入掩码为:”yyyy年”的格式. Text:=IntToStr(wYear)+年; 2: 输入掩码为:”yyyy年mm月”的格式. Text:=IntToStr(wYear)+年+IntToStr(wMonth)+月; 3: 输入掩码为:”yyyy年mm月dd日”的格式. Text:=IntToStr(wYear)+年+IntToStr(wMonth)+月 +IntToStr(wDay)+日; else 默认为:”yyyy年mm月dd日”的格式. Text:=IntToStr(wYear)+年+IntToStr(wMonth)+月 +IntToStr(wDay)+日; end;end;function DateFieldSetText(Sender: TField; const Text: String):Boolean;var dDate:TDate; sYear,sMonth,sDay:String; aryTestYMD:Array 1.2 of Char; iYMD:Integer;begin 获得用户输入的日期 sYear:=Copy(Text,1,4); sMonth:=Copy(Text,7,2); SDay:=Copy(Text,11,2); 测试输入掩码所包含的格式. aryTestYMD:=年; if StrScan(PChar(Sender.EditMask),aryTestYMD1)nil then iYMD:=1; aryTestYMD:=月; if StrScan(PChar(Sender.EditMask),aryTestYMD1)nil then iYMD:=2; aryTestYMD:=日; if StrScan(PChar(Sender.EditMask),aryTestYMD1)nil then iYMD:=3; 利用TryExcept进行输入的日期转换 try begin case iYMD of 1: 输入掩码为:”yyyy年”的格式. begin dDate:=StrToDate(sYear+-01-01) ;中文Windows默认的日期格式为:yyyy-mm-dd.下同 Sender.AsDateTime:=dDate; end; 2: 输入掩码为:”yyyy年mm月”的格式. begin dDate:=StrToDate(sYear+-+sMonth+-01); Sender.AsDateTime:=dDate; end; 3: 输入掩码为:”yyyy年mm月dd日”的格式. begin dDate:=StrToDate(sYear+-+sMonth+-+sDay); Sender.AsDateTime:=dDate; end; else 默认为:”yyyy年mm月dd日”的格式. begin dDate:=StrToDate(sYear+-+sMonth+-+sDay); Sender.AsDateTime:=dDate; end; end; DateFieldSetText:=True; end; except 日期转换出错 begin Application.MessageBox(PChar(Text+不是有效的日期!),错误,mb_Ok+mb_IconError); DateFieldSetText:=False; end; end;end;end.主窗口单元unit Main;interfaceuses略去其他内容procedure Table1BirthdayGetText(Sender: TField;var Text: String;DisplayText: Boolean);procedure Table1BirthdaySetText(Sender: TField; const Text: String);private Private declarations public Public declarations 略implementation将自定义的单元包含进来uses DBDateEditMaskTrans;$R *.DFM其他过程略procedure TForm1.FormActivate(Sender: TObject);设置一个日期型字段的输入掩码,可以放到TField字段定义中。begin Table1.FieldByName(Birthday).EditMask:=9999年99月99日;1;_;end;procedure TForm1.Table1BirthdayGetText(Sender: TField; var Text: String;DisplayText: Boolean);begin DateFieldGetText(Sender,Text);end;procedure TForm1.Table1BirthdaySetText(Sen
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年持证补贴配套奖惩细则
- 2026年吉林省蛟河市高二生物下册期末考试模拟测试卷附完整答案【名师系列】
- 2026-2027学年人教版九年级英语上册宾语从句期中专项(含答案)
- 2026年字幕员职业技能等级认定(三级)理论知识历年真题
- 人教版六年级上册《道德与法治》期中试卷及完整答案
- 2026年敏感肌专研粉底液气垫
- 2026年摄像师职业技能等级认定(五级)操作技能模拟试题
- 2026年广东省兴宁市高二历史上册期末考试测试卷【基础题】附答案
- 2026年湖北省赤壁市高考历史自测卷附答案(综合卷)
- 2026大数据服务市场供需格局与投资机会评估研究报告
- 急救知识科普宣传
- Ⅱ度烧伤创面治疗专家共识(2024版)
- 压力容器材料代用规范与实践
- 天府特资(四川)投资管理有限公司2026年招聘笔试参考题库及答案详解
- 2026部编人教版二年级语文上册全册教案教学设计
- 三级安全教育考试试题及答案(2025版)
- 泰国中文教师备课教案模板
- 新22J01 工程做法图集
- 学校石材工程投标书
- 下颌第一前磨牙拔除术考核评分表(2份)2024年度住院医生规范化培训评分表
- 少先队入队学少先知识做先锋少年课件
评论
0/150
提交评论