说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

在Delphi中处理数据库日期型字段的显示与输入

HTML文档下载 WORD文档下载 PDF文档下载
在Delphi中处理数据库日期型字段的显示与输入

在使用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;

interface

uses

Windows

SysUtils

Controls

Forms

Db;

{日期型字段显示过程

在OnGetText事件中调用}

procedure DateFieldGetText(Sender: TField;

var Text: String);

{日期型字段输入判断函数

在OnSetText事件中调用}

function DateFieldSetText(Sender: TField;

const Text: String):Boolean;

implementation

procedure 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)

aryTestYMD[1])< >nil then

iYMD:=1;

aryTestYMD:='月';

if StrScan(PChar(Sender.EditMask)

aryTestYMD[1])< >nil then

iYMD:=2;

aryTestYMD:='日';

if StrScan(PChar(Sender.EditMask)

aryTestYMD[1])< >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)

aryTestYMD[1])< >nil then

iYMD:=1;

aryTestYMD:='月';

if StrScan(PChar(Sender.EditMask)

aryTestYMD[1])< >nil then

iYMD:=2;

aryTestYMD:='日';

if StrScan(PChar(Sender.EditMask)

aryTestYMD[1])< >nil then

iYMD:=3;

{利用Try…Except进行输入的日期转换}

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;

interface

uses

……{略去其他内容}

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(Sender:

TField; const Text: String);

begin

if DateFieldSetText(Sender

Text)=False then

Abort; {转换不成功

日期非法}

end;

end.

---- 以上代码在中文Windows95 + Delphi3 + Paradox7环境下测试通过。

QQ手机浏览器推出5.1播霸版 内置强解码引擎支持22种视频格式 Ceph浅析(上):概况与设计思想 IBM:你好,互联网 光网络SDN化的四大驱动力及两条路径 《近匠》酷传:解除App发布和监控痛苦 有道heX正式开源:用HTML5和NodeJS开发桌面应用 在3D空间创作:英大学生发明增强现实设计产品 2014年3月浏览器份额:Chrome终超Firefox 成市场第二大浏览器 2014年3月操作系统份额:Windows 7大涨,Windows XP仍未跌破27%大关 路透社:iPhone 6仅有4.7寸版本,将于5月量产,5.5寸遭冷冻 高端实战技术培训:OpenStack企业应用之路 据统计,Oracle已击败IBM跃居软件行业第二 【技术博客推荐】2014年值得关注的10个开源项目 Intel在深圳建立智能设备创新中心 将投入1亿美元 免费获得价值1200元Unity2014顶级盛会门票! IBM公布Softlayer中国业务落地时间表 推荐30款最佳的数据可视化工具 数据库迁移测试:选白盒还是黑盒? 东软发布首款英特尔架构企业级移动终端解决方案 英特尔与腾讯创立游戏创新实验室 推进RealSense技术 《近匠》系列沙龙之探寻绝密武器:移动跨平台开发 iOS走向开放:苹果新推iAd Workbench广告服务 腾讯薛伟:快速模型更新在精准广告推荐中的应用 微软Build2014第一天要点精华汇总(组图) Windows 8.1 Update 1五大改变:任务栏回归,增强鼠标支持(图) 【十大院士】怀进鹏:全球的计算模式可能重新形成 微软Build2014第一天应了解的15件事 TypeScript1.0发布,完美支持Visual Studio系列产品 欲与Android展开价格战,微软宣布在移动设备上免费开放Windows 2014深圳英特尔信息技术峰会次日要点汇总 4月4日:微软39周岁,生日快乐! 请问谁又对第三方控件imgscan.ocx操作的例子,发给我bit_hj@163.com。小弟不胜感激 肯请各位帮忙! 应该是简单问题,求高手帮忙,100分相送,绝不食言,一下午都没弄出来,太灰心了..... linux下,mysql数据库密码怎么找回?(在线等) 新手求救:关于8086和80386的中断类型号上的冲突? sleep函数 网络难题,跨网段传输 恢复数据库 有谁的信誉分比我低阿!!我送给他50分阿!! 谁能提供一个切实可用的“防止刷新页面重复提交表单”的方法 Web安装项目中的managed.msm和stdole.dll是何东东,何用?? java中字符串操作函数在哪?java中分解字串的函数(如asp中的:split)在哪个类中? 为何ACCESS出现“#已删除的”的记录? 欲交Java良师益友,愿伸援助之手请进。 关于复选框的初始问题(100份在线4:00-8:00 怎样在asp中把一个文件变成临时文件?? 求解奇怪问题,非常奇怪,分不够再加! 高分求IPMI开发资料 如何用Jtree将一个xml文件显示出来? 招聘系统分析员(北京) 深圳兼职电脑维护,哪个有兴趣? 求购 产品进销存源代码 VB or c# +SQL SERVER @@@@@@ 不送分而送现金!!!!! 谁能教我配置PHP服务器啊? 帮我看一下, 紧急求救!!!jsp的出错信息! 如何合并两个Image对象为一个Image对象 还有一个问题,帮帮我嘛! 高分请教高手!简单,看了你也是高手 代码编辑器的问题。 计论:大家都用什么工具进行数据库的比较? 我高中的班主任 请大家评评理,特别是JAVA版版主! 这样的SQL语句怎么写啊 form切换!VB.net里面如何在语句里调出别的FORM 如何用ADO连接EXCEL数据? 什么是上溯造型? 如何把console.write 输出很多内容保存到文件?thread.join()如何使用? 我想实现像网络蚂蚁那样在IE上点右键,把这个IE中的信息传送给我主程序,现在遇到两个问题! 控件的布局问题? 实例化算不算继承? 急!!!!关于SQL数据堵塞 请大家推荐一下哪个汇编集成环境比较好用?DOS下用什么?WIN下用什么? 向各位请教两个tomcat的问题:(谢谢) 高手请问 拉格朗日算法VB=>BCB 求ASP的字符串比较函数. 找C++BUILDER高手!! 我在做演示光盘,用camtasia录制的屏幕图象,可是在客户的机器上播放不出来,在线等待,解决问题马上揭贴! fastreport如何不进行预览而直接打印! 不使用下拉数据窗口,如何实现输入产品代码即可显示产品名称 大哥救命啊 一个简单问题,在一个Win32 applicaion 中如何使用CString变量! 在线等待! 几道不难的生物题,羊群中有没有最占优势者?它有哪些行为表现?最占优势者是公羊还是母羊?在平时和繁殖期的表现都有哪些特点? 一个周长为64厘米的长方形,是由3个完全一样的正方形平成的,求每个正方形的周长 谁能帮我写篇英语作文?作文要求如下:(Direction:Write a short piece of around 150 words about the advantages of bicycling to work.In your writing be sure to include the following points)Bicycling to Work1.lighten the burden on public tra 合力与分力?有一个刚体两个互成角度的力作用在两个端点带动物体运动 可以用平行四边形则求到合力的大小与方向但是不知道合理的作用点呀 (虽然不存在合理 可是合力与分力作用效果要 用32个一平方厘米的正方形平成长方形,有几种不同的拼法?他们的周长各是多少?列一个表格. 求写英语作文!高奖赏!求写八十字英语作文(初一学生)1.I love shopping2.My favourite international city3.It's fun to fly kites4.Our Life in the future5.We should save electricity6.An Enjoyable School Life 以"大漠孤烟直,长河落日圆"为题画一幅画要上颜色,可以的话直接画出来,也可以说出构思 伤仲永-受之天和受之人怎么理解 蜗牛每分钟爬行七分之三米,二分之一小时可以爬行多远?注意单位(分钟和小时) 设 cher a[20]={"switch"},*p=a;,则 printf(”%c\n“,*(p+2));的结果是 《伤仲永》中的“受于天”指什么?“受于人”又指什么,两者有何关系? 什么动物绕家三圈 分力与合力两个共点力F1F2的合力大小是100N已知F1F2的夹角是30°,则分力F2的最小值为 ,在这种情况下,分力F1的大小为 (伤仲永)受之天也的也是什么意思? 如何应用数学课程标准解决生活中的数学问题? 阿里巴巴和四十大盗中文+英文(简单一些) 到处为家的动物有什么 映射个数公式A中有m个元素,B中有n个元素,那么从A到B的映射个数就可以这样算:对于A中的每个元素都可以分别对应B中的每个元素,也就是A中一个元素可以对应B中n个元素,这样一共就可以有n^m 关于合力与分力合力可能小于它的任一分力合力大小可能等于某一分力的大小这两种说法对不哦? 麻烦看下高中数学小论文要从什么方面写哟? 会的人说下嘛,非常谢谢了耗7 什么动物是家野 VB中Switch()和Choose()语句使用的多吗? 麻烦大家看下高中数学小论文要从什么方面写哟?会的人说下嘛, 吃家饭呵野屎 只顾外头是什么动物啊 有谁提供一点阿里巴巴和四十大盗英文原文,几个片段也行 伤仲永里 受之天也 受的意思 (急求)tan(a-3π/2)化简之后等于多少? 关于合力与分力的假若质量为m的物体只受力F,F可分解为任意的F1、F2(1)则物体在F方向的加速度a=F/m(2)物体在F1方向的加速度a1=F1/m(3)物体在F2方向的加速度a2=F2/m以上说法正确吗 勤家有余指什么动物 as if,seem to区别 合力和分力1:合力既然能分解成两个力,分力又能合成合力,那还有什么意义叻?反正怎么分怎么合都是一样的?2:拱桥能把向下的力分解成两个斜向下的力,可是即使这样在结构上有什么好处呢 Can you finish your homework?No,I cna't.It's so d_____ .Can you help me?.填入d字開頭的單詞 as if,seem as区别 合力分力 同时存在合力分力是否能同时存在与物体上? 伤仲永中的受于天和受与人各指什么? 化简:{sin(2派-α)cos(3派+α)cos3派/2+α}/{sin(-派+α)sin(3派-α)cos(-α-派)} 家中长辈刚出院 说什么问候的话比较好 本人不大善于表达所以请教一下 真的很急了,本人先在此谢谢给位朋友了7n 请问look as if与seem as if有什么不同? 伤仲永第三段受于天指什么 受于人又指什么 双手自残家难和 指一 个什么动物 第六题, 伤仲永 怎样认识受之天与受之人的关系 伤仲永中受之天和受之人分贝什么意思? 天梭表什么型号有海拔高度功能 四字词成语,第二同第四个字是一样的.例如:将心比心 特别简单的映射个数问题A集合有m个元素,B集合有n个元素,从A到B的映射个数为什么是n^m个.比如A:{a,b,c} B:{1,2} A中元素到B中元素不是有两种选择吗?那一共应该有2+2+2=6种选择,为什么是8种?求大家 天梭touch怎么调海拔如题,怎么调touch的海拔 问字~一个王字旁,草字头下面一个宝盖在下班一个玉,读什么? 映射数量问题假设集合A中有m个元素,集合B中有n个元素构造A到B的映射求A、B之间映射的数量和一一映射的数量 映射个数. 请问一下for(i=0;i 会的人说下嘛,非常感受大伙了 关于映射个数的题函数f:{1,2,3}→{1,2,3}满足f[f(x)]=f(x),则这样的函数个数共有几个? 几道生物题(高手请进)1.心壁主要由____组成,心壁最厚的是______.2.血液流入小肠壁前与流出小肠壁后相比,氧____(增加,减少)了,养料_____(增加,减少)了.3.正常情况下,红细胞能主要运输下列物质中 会的人说下嘛,非常谢谢了8i 【急】怎么求一一映射个数?如题,设集合A={1,2,3},集合B={a,b,c}那么从集合A到集合B的一一映射个数为( B)A.3 B.6 C.9 D.18 如何理解“大漠孤烟直,长河落日圆”一句中蕴含的图画美 麻烦大家看下高中数学小论文要从什么方面写哟?会的人说下嘛,非常谢谢了5i 形容头脑不清辨不清方向的成语是什么 巴基斯坦工厂闹鬼办驱魔仪式 反致24法记者在马里遭绑遇难 奥朗德将赴机场舆论不支持 安倍政权解禁集体自卫权再小德美网后实现17连胜 让年终第一悬罗马10连胜纪录被终结 国米3比0击傅博希望国脚们别再受伤 战印尼沙特须花圃变向日葵园 新加坡华人被称“向日卫计委:将H7N9纳入法定乙类传染病最高法:伪造证据、暴力抗拒执行是常见“IT男”非法贩卖300多万条“客户解放军学员体验德国军校:74岁军官坚最高法通报首批失信被执行人 3万余老最高法:公布失信名单威慑效果明显 自学校开“学生使用手机”听证会 家长请上海市一小学因作业量太大遭教育部通报大学生零成本创业 半天卖千根糖葫芦收发改委:在未得资金支持时已积极应对气黑莓放弃出售计划 撤换首席执行长海因发改委:雾霾天气几乎常态化 通过5-部分高校将学位证挂钩英语四级 教育部英国内阁会议严禁使用平板电脑 避免遭打造国际化现代化文化创意产业聚集区波尔加盟鲁能俱乐部深圳彩民中体彩600万大奖吃饭刷卡信息被盗损失12万事业单位将建工资增长机制看得见的与看不见的龙岗法院副院长 涉嫌受贿被逮捕谁帮我们带娃恒大或将再遇韩流奖池近5亿元 超级大乐透派奖送幸运让代表能直接听到民声“你的梦,我帮你圆”公司合并公告证件作废“有什么事,随时打我电话”清算公告文化与科技融合的魅力湖南省房地产业协会中介专业委员会严打“伪基站”不妨多管齐下以人的和谐促进社会和谐浏阳五个“十项行动”
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘