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

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

用VB与MS-Draw开发通用作图软件 用VB制作TopMost类型窗口 用VB制作Windows风格安装盘 用Visual Basic 6创建基于MTS的商务组件 用Visual Basic实现Windows的重启动 VB用Windows管理技术做你的应用程序 VB用程序给标识字段(ID)赋值的一种简单实现方法 VB用自己的&#39;PROGRAM&#39;测试自己的电脑 有 BitMap 之Menu -VB资料 运行其他程序,并等待执行完毕 -VB资料 再谈VB程序的加密 在 VB 程序中如何设定 Mouse 光标的位置? 在ActiveX DLL工程中慎用App对象-VB资料 在ActiveX控件工程中设置DataField属性-VB资料 在VB中异步执行程序 在VB编程中有效地组织和利用资源 在VB应用程序中巧用DLL 在VB应用程序中使用INI文件的一点体会 在VB中操纵OLE服务器应用程序 在VB中改变显示器的分辨率 在VB中获取和修改计算机名字 在vb中没有指针,怎样才能将数组作为参数。 在VB中如何调用C++Builder创建的DLL 在VB中设置常用的外部设备 在VB中使用枚举变量 在Visual Basic 中使用C++ 类 在WindowsNT网络中广播消息 -VB资料 在可编辑控件中创建一个新的上下文菜单 -VB资料 在软件中设定热键-VB资料 在注册表中添加自己的文件类型-VB资料 在桌面上建立 Internet 快捷键 -VB资料 我想问什么是temporary object?请高手指教 那位大哥在HP-UX下配置过PHP和ORACLE? 宝丽金120首金曲 Dialogs(wdDialogFileOpen)提示ActiveX不能创建对象? 那位朋友知道如何在网络上截取一个信息(数据包) 大家看过dvdrip的片子吗?有一个问题请问 (winform)我想编写一个简单的浏览器,问题1 在LINUX下如何安装软件啊? 苏州的朋友可以进来看看吗? 关于游标类型的问题 如何比较两幅近似图像并得出偏移的距离? 怎样处理鼠标拖动事件。 绘制图形时的自动滚屏问题 请教怎么去掉字符串后面带的空格? 请教关于双机通讯的问题,谢谢 播放问题 如何使用jsp显示数据库中的数据? 请问什么叫模态窗口啊? Win32标准dll,VB下调用问题 挑战:对手机短信文字自动解析? 推荐一个linux下的杀毒软件. 关于oicq? 二手笔记本多小钱? 关于在iis中的resin的配值问题,急,求帮助!!!! PHP中的类到底是怎么回事 怎么知道INI文件的某一个小节下有几个关键字? 不知道发在这里对不对。。。有关DVD 菜鸟级:关于两台都接了宽带的机子彼此可见的问题。请高手指教!谢谢! 我最近发现,我所喜欢的人,她不喜欢我了? 关于游标类型问题? 急!急!急!COMBOBOX问题!(在线等候!)! the problem of CButtonST 如何用java 做一个游戏? 只要有道理就有分! 中程要注册的吗? 大家帮我看看我得曲线重画代码错在那里阿????? 今天我生日,郁闷散分 如果一个项目延期了,你作为一个主管,应该怎么办? sorry,我想问的是怎么去掉字符串后面带的回车符? 请问下怎么编译通过CJLibrary? 是不是SQL server不支持table1.filter语句? vbscript里怎么设置弹出窗口的大小? 全套MCSE2000 BIBLE 是TESTKING的,要的进 怎么用VB编写DLL,请告知如何编写(举例)。 网络安全引发Checkpoint认证培训热 编程注册表--有高分相赠!(请教高手,多谢!) winfax 如何进入win2000 新手幼稚问题 ado中服务器游标使用中的问题? 怎么设置双网卡,让大家一起上网? 求教!sos! 海的最深处在哪里具体 世界最深处位于哪大洋? 如哈哈大笑的词语 xx大笑 为什么你会感到孤独呢?用英语怎么说? Do you think neighbors are important in life why or why not? 桑基鱼塘生态在利用蚕沙.人畜粪便.秸秆.杂草.树叶等物质生产沼气的过程,发挥作用的生物主要是什么 “你们感觉味道怎么样”用英语怎么说 世界海洋最深处是哪里,哪里漂亮吗? 已知曲线y=ln(x+2)+0.5x^2+2x+0.5同上,在点A处的切线与曲线y=sin(2x+Φ),(-派/2就今天过了没分 已知二次函数y=ax的平方的图像与直线y=1/2x-1相交于点P(-2,m)(1)求a、m的值(2)指出抛物线y=ax的平方开口方向和顶点坐标(3)当x取什么值时,二次函数的值随着自变量的增大而减小 作文实验与观察 若曲线y=x^2与y=2x^2-5x+m的交点间的距离等于13,则m的值为 A、35/8 B、4/25 C、4/27 D、8/37 Is there clock in your roon?yes,there is A.a B.an C.the D.\ 关于描写实验的作文300字 描写中国会馆的文章 已知二次函数y=ax平方的图像与直线y=-2x+1相交于点P(1,n).求a和n的值 补全对话 A.hello!what are you looking( ) B.I’d( )to buy a skirt.A.what( )do you want?B.I‘m a size .I like one.could I ( )it( ),please.A.yes,of course.B.I‘m afraid it’s a little smaller.can I have a( )one.A.OK.what 曲线x^2/4+y^2/m=1的离心率e满足方程2x^2-5x+2=0,则m所有可能的值的积为 A.36 B.-36 C.-192 D.-198但为什么m可以为负数啊。 女字咋打 为什么说科学技术成为推动经济发展的决定因素? 中国馆的作文怎么写 这个人这个词一般用于男的多还是女的多 在刚刚过去的20年中,世界经济发展的主要特点是什么?请列举出两个推动此特点出现的科技方面的因素 中国,你在我心里的作文怎吗写 女是是什么字 大梁;汴京;汴梁是哪里 求y的取值范围y=0.5x^2+2x-1 (m 海底最深处有什么 大梁,汴京,汴梁是现在的什么城市 两个字反过来意思就不一样的词 海底最深处达到多少米 我怕在网上找的牛头不对马嘴.所以我想说下.我的英文成绩不好、 所以来此求谁帮我写一篇英文的关于梦想的作文.本人没啥梦想 不需要写的很好.是要300多个单词,写的语病没有就OK了. 谁有前面两个字不一样,后面两个字一样的四字词语? 上面是个[亦]下面加个[女]字念什么? 下面的格言你是怎么理解的写一下感受和引用一下生活的事件例子说明一下(选两个即可)Путешествие как самая великая наука и серьезная наука помогает нам вно 描写实验的文章500字,文章具体,不罗嗦 歌词中有I` m sorry for the walking away是什么歌曲是一个酒吧慢速的蓝调音乐.歌词还有tell me baby,Where are you going,Where gonna be baby,I` m sorry for the walking away,walk away,walk away,walk away, 请用一句名言或一个道理,结合生活实际,写一写自己的感悟或体会吧.不要无谓的答案! 用所给词的适当形式填空:the skirt (look) very nice. 生存战争这些什么用? my clock is (on the table)对括号内的提问 you look very blue意思 把250g20%的硝酸钾溶液蒸发掉80g水後,拾好配成t度时的硝酸钾饱和溶液,求t度时硝酸钾溶液的解度 this is my (brother)room 补全单词 on the table?my alarm clockwhere ia your father .A they are in the bedroom B it in the bedroom C i don't know D he is 选择翻译:你能把我的书带到学校来吗?他的双肩背包在椅子上吗?this i ---You look very nice on that blue T-shirt.---_____.A)Sorry,but I don't think so B)Good C)Yes,you are right D)Thank you 若定义在R上的函数f(x)为减函数,为满足不等式f(3-2a)>f(a2)的a的取值范围. “口”里面有个“女”是什么字? The red sweater looks nice.请问句中为什麼用looks而不是look呢? 已知奇函数f(x)为R上的减函数,求不等式f(a^2)+f(2a)>0 口字里面一个女字怎么读啊` You look nice in light blue?的答语 若定义在[1,4]上的函数f(x)为减函数,求满足不等式f(3-2a)>f(a2)的a取值范围. 女口 月三个字怎么可以组成一个什么字? 八上科学气候和影响气候的因素(1)P23第9题 Let me have a look at the modern skirt.改为同义句Let me()()the modern skirt. 有口里面有个女念什么字? 科学气候因素...紧急我国北方楼房中都装有用水做介质的“暖气”,它把燃料燃烧时所产生的热量通过水带到房屋中取暖.用水做输送能量的介质有什么好处?在生活和生产中,还有没有用水加热 You look_____than before in this skirt,Cathy.(love) 请问:现在人类可以到达世界上海洋最深处吗?就是哪个好像叫玛丽亚娜海沟的最底下11000多米的深处, 桑基鱼塘的生产模式不属于:A生态经济 B循环经济 c生态工程 d生态农业 我认为这几个选项都相似.请大师们帮助分析,高中生物选修3P113页:桑基鱼塘是一种典型的水陆物质和能量交换型生态
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘