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

在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环境下测试通过。

MOTODev试用报告- Android开发效率之源 安装MOTODEV Studio for Android版方法 Android开发工具-motoDEV studio介绍 Android过后Chrome OS又是如何开发? Android安全模型导致开发时功能受限 Android导出一个JAR库 APK汉化原理及方法 APK文件格式分析,Android反编译入门(一) ApiDemos中的Android Widget例子解析 APK签名导出向导 - Use the Export Wizard 剖析Android自带Widget - Music播放器 剖析Android自带Widget - Clock指针钟表 C#取得Excel工作簿工作表名称 C#中用Automation自动化方式对Excel的操作 VB如何打开或保存为有密码保护的Excel sheets工作表 VB在Excel表格文件中搜索指定内容 VB复制Excel表到另外一个Excel中 Java实现生成网站快照缩略图片 php实现生成网站快照缩略图片 C#实现生成网站快照缩略图片 VB比较两个Excel表格的内容 VB实现Excel按列或行排序 VB删除EXCEL表格指定行 用vb.net写的验证码识别代码 VB删除EXCEL表格指定列 Oracle数据库Windows 2003环境自动备份批处理 VB通过ADODB连接EXCEL表格文件读取数据 使用VBScript卸载软件 Discuz X2用户注册过程SQL Android手机参数表 用jQuery改变图片(image src) EXCEL里的时间问题!!谢~ 在word2000里怎样输入数学公式啊 重载[][],请各位帮忙。 我准备参加程序员考试 法国,阿根廷,我的心在滴血。:( :( 为阿根廷哭的人太多了(我的同事,同学等等)。。。是不是央视的沈冰也当场哭了? 寻dialogic代理商合作,急 分页程序中如何加书签,用rs.bookmark最好!!! 听说VB.net的编译器使用C#做的,是吗? 计算机英语在程序员考试中占多大比例? 令人失望的世界杯,放分!!!!!!!!! 怎样获得Mp3的歌曲信息 如何在ACCESS数据库中引用自身数据库? 阿根廷,别为我哭泣! 线程的同步问题(在线等待100) 请问如何在bcb中引用delphi的*.pas文件?(如果可以的话) 如何将CRichEditCtrl的内容输出到打印机? 关于jcreator编译时的问题 在xslt中如何判断一个结点在xml中出现的次数? 请邦邦忙--数据库不能启动了 请问..... 两个存储过程问题,帮我答了,重分酬谢 如何捕获键盘事件 讨论EAS,留步,您请进! 开发自己的组件库! 如何调用.chm帮助文件?? jbuilder6的经典书籍哪里有? 在seek(0,2)中,0,2表示什么意思,整个函数又是什么意思。 WebForm2中如果要引用WebForm1中的变量X(属性),怎么办?X在form1中怎样定义?在form2中怎样引用? 关于汇编语言? 用TC如何在开发OpenGL? 机工出的影印版让人失望!!! 我想问一个关于注册表的问题 如何在ASP中显式的声明一个变量,和dim xxx as xxx一样吗? 对图片处理,请问哪里有抓热点的工具Hospot4.exe下载 用jb5+wls7可以吗 急需关于网际协议分析的论文 哪里有关于学习汇编语言的网站? 请教: 我在程序中对excel的单元格作了修改,每次改后都弹出”修改了excel,是否保存“对话框,怎么去掉呀? 请问如何用VC得到局域网中所有SQLSERVER服务器的名称?请高手指教 一个小问题! 关于写帮助文件的问题 要做一个图书馆管理系统,请提些意见,加100分 请问如何判断一个对象类型? 要去面试,调查一下 上海做 J2EE 的开发的月薪是多少? 找带按钮(button)的text类型控件 怎么改变标题蓝的颜色,不要蓝色的 找带按钮(button)的text类型控件 请教一下:现在windows平台上的网络编程一般用什么工具啊??? 问微软专家:关于Windows 服务应用程序问题 世界上最硬的东西到底是不是金刚石 1米×2米 1毫米后紫铜板有多重? 那些天然矿物比刚玉硬比金刚石软 sketchup中移动面很难捕捉到绿轴怎么办?求高手指教. 摩擦起电可不可以证明原子是有更小的微粒组成 足球是由几个黑5边型几个白6边形组成的 sketchup怎么只能移动蓝轴不能红轴移动? 单位电荷在电场力作用下沿闭合回路中移动一周释放的电能决定于什么? 全世界除金刚石外最硬的矿物是什么?1楼的 碳化硅算天然的吗 SketchUp移动问题~~急~~为什么我创建了群组,移动的时候总是在水平面上移动啊,我想在z轴方向移动~~怎么解决呀~~ 电场线与场强方向一样吗为什么负电荷可沿电场方向运动?它电势和点势能怎样变化?其实我还搞不清电势 场强 电场线 电势能的关系? 有一个足球,它有12个5边形的黑块和若干个6边形的白块组成,求有多少个白块用带未知数的代数式表示 sketchup移动时如何准确移动到一个面上面 铜排的重量怎么计算长300mm宽60mm厚8mm的铜排重量是多少?另:铜的比重是多少? 足球表面是由黑色的正五边形和正六边行组成,共32块,这个足球有黑和白各多少?列一元一次方程像设黑皮x块,则白皮32-x块,顶点数V,棱数E,列方程:5x+(32-x)*6=E*2 (每一条棱两块皮共用) 5x+(32-x sketchup中移动工具为什么不能延绿轴移动 两颗共同绕太阳运行的行星a和b,已知它们的质量之比ma:mb=2:1,它们的球体半径之比ra:rb=2:1,则它们各...两颗共同绕太阳运行的行星a和b,已知它们的质量之比ma:mb=2:1,它们的球体半径之比ra:rb=2:1,则 问:一个足球用黑白色皮组成,黑为正5边形,白为正6边形,黑有12块.求白皮的块数. 同种原子构成的物质摩擦会发生摩擦起电现象吗?说明理由明天交作业了 Thank you A、B两物体做匀速圆周运动.质量Ma:Mb=1:2 半径Ra:Rb=1:2.当A转60圈B恰好转45圈.求向心力之比 电场能与电势能的有区别吗? 由原子勾成的初步知识解释摩擦起电的原因简略点 高中化学奥赛 数理方程 拉普拉斯格林函数方法 如题 铜板怎么算重量 哪儿有高中化学奥赛题啊哪儿有高中化学奥赛题 外在经济和规模经济的区别在哪里啊? 请问供应:铜板重量怎么计算 1mm紫铜板比重是多少 谁给我辨析一下内在经济、外在经济、内部经济、外部经济、规模经济、规模不经济? 长方体的铜板重量怎么算?宽一米,长两米,厚4公分.怎么算出来它的重量? 同步卫星是什么?有什么特点?近地卫星是什么?有什么特点?什么情况下重力等于万有引力?黄金代换什么情况下才可以用? 什么叫规模经济何时又规模不经济 黄铜板的重量怎么计算 44、 一个英国人曾经提出过所谓的“登天缆绳”的设想:用一根绳竖在赤道正上方,使绳随着地球同步自转,只要这根绳足够长,就不会坠落,人们可以沿着这条“登天缆绳”到太空中去游览.尽 什么是规模经济? 紫铜板重量怎么算出来啊.单位是12公分宽8个厚 15米长的.和20公分宽8个厚12米长 厚0.8CM谢谢那个懂的人帮我算 我有急用一定给你高分奖赏的 一个高中物理问题(关于万有引力)我知道在地球表面上,物体所受重力是其万有引力的一个分力,向心力是另一个分力.当飞船绕地球做匀速圆周运动时,万有引力完全提供向心力,那么,飞船受 足球表面有多少块皮组成? 一道物理题:小华同学在教室里用教室里用一个焦距为10cm的凸透镜在一张白纸上得到了窗外一棵数清晰的像这个像是____、_____的____像 高中物理 万有引力一题两颗卫星a、b在同一平面内绕地球做匀速圆周运动,它们的周期之比为:(根号2):4 ,若某个时刻两卫星正好同时通过地面上同一地点的正上方,则a卫星至少经过多少 用咪唑、丁醇、碘甲烷、四氟硼酸钠和其他无机试剂合成1-甲基-3-丁基咪唑四氟硼酸盐, 电势能是电场和电荷共有的能,他为什么是共有的,就是类似重力势能的共有,我也不是很清楚。不是很能理解共有这个概念, 微观经济学中规模经济分析题有人说,企业的桂嬷嬷越大越好,规模大了,可以发挥规模经济的作用;也有人说,企业的规模小点好,所谓“船小好调头”.你认为这两种说法如何?并分析. 足球表面为什么要拼块组成? 正场源电荷的电场中,负试探电荷逆电场线运动电势能会越来越大吗? 什么是规模经济?导致规模经济的原因是什么? 足球的表面是由哪些几何图形组成的 电荷在电场中的位置一定,他的电势能也一定? 电场能与电势能的关系我的理解:电势能是电荷的能量,电场能是电场的能量.电场能与电势能又有什么关系?是包含关系吗?二者在什么情况下相等?请举例说明 有关万有引力的一道高中物理题考察太阳M的卫星甲和地球m(mr2 B、r1 已知298K时,N2(g)+3H2(g)=2NH3(g)的△G(θ)=-33kJ·mol-1,则NH3(g)=1/2N2(g)+3/2H2(g)的平衡常数Kp为( ) A.6.4×10^(-4) B.3.2×10^(-4) C.2.3×10^(-3) D.1.28×10^(-3) 神经冲动中电流流动方向具体是指的什么Rt 电势能 电势差 电场 的大小判断方法md,本银被这些东东搞到头晕脑胀了,一么搞混了关系,一么又不会判断大小了.烦心!求高手总结方法,不要只给我公式,木用!比如老师好像说给一条线就不能判 金刚石是不是最硬的东西? 我是一名高三的学生,从来没有学过化学奥赛,但是这次化学奥赛预赛得了115分,所以能够去参加复赛,但是我不知道该不该去.因为毕竟没有看过高中意外的化学相关书籍,但是我想知道这样的水 神经纤维内局部电流的流动方向与兴奋传导方向一致..判断正误,并说明理由. 比金刚石还硬的东西还有吗? 黄铜板,铍铜板,紫铜板,磷铜板性能及化学成分 神经冲动在神经纤维上传导时,与膜内电流方向?与膜外电流方向?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘