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

在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获得、设置鼠标双击间隔时间 VB获取当前系统平台 记载Windows使用的时间-VB资料 加速Visual Basic For Application(VBA) 监视程序的运行情况 -VB资料 交换鼠标按钮 -VB资料 交换鼠标左右键 -VB资料 禁止使用 Alt-Tab 或 Ctrl-Alt-Del -VB资料 控制光驱门的开关 -VB资料 VB利用 窗口函数监视系统的运行情况(VB类) VB判断是否在VB5环境下运行 VB判断一个32位程序是否结束 VB判断一个程序启动完成(不是结束) 屏蔽TextBox的系统菜单 -VB资料 启动时禁止装入 Add-Ins -VB资料 让Timer控件每5分钟触发一次事件 -VB资料 让程序启动快一点 -VB资料 VB如何调用系統的【查找】、【替换】的对话框? VB如何动态新增、移除 ODBC DSN? VB如何读取 Picture 内任何一点的颜色值? VB如何获取硬盘卷标、序列号和文件系统类型? VB如何判别程序是在Win95或NT下执行? VB如何启动控制面板? VB如何取得磁盘序列号? VB如何让Window不接受键盘输入及Mouse Click VB如何让程序拥有多个热键? VB如何让用户自行输入方程式,并计算其结果? VB如何使程序不在Ctrl+Alt+Del弹出的对话框内? VB如何使用 VB 编写自动反安装的程序? VB如何用VB建立快捷方式 VB如何用VB在桌面建立快捷方式 是读软件工程硕士还是去当程序员? 请问这是什么错误?谁能帮我翻译一下。最好给出解决方法。对者给分!...在线等待! 请问这是什么错误?谁能帮我翻译一下。最好给出解决方法。对者给分!...在线等待! 紧急求助:关于打印的问题 如何用C#在ASP.net中对数据库进行查询? 网络打印问题 【求助】一个小问题,在线待回 DBGrid1如何获得2个表里的数据 帮帮菜鸟呀`/! 如何用C#在ASP.net中对数据库进行查询? 求获取FTP服务器上文件的创建日期的代码 系统已经从一个严重错误中恢复。 怎样使一个页面访问过后立即过期? and 和 or 有什么不同??? 关于oracle 配置的问题 Oracle数据库实例和数据文件的问题求助 调查:各位用Lotus开发的时候,对源码如何做版本控制的?效果如何? 请问各位高手现在业界对工作流与电子工单有没有统一的标准? 动态生成STATIC 文本框,把里面的文字都加上下划线,怎么做? 有什么好的类似于QQ的局域网通讯程序???可支持WIN98及WINXP间的通讯!!! 我快晕了,急救! 低手勿入,高手请进,剧难??? 一个程序调试中产生的问题 -------数据接收和发送模式的问题!(非资深程序员勿入)100分只给答的最好的 求救!关于坐标系转换问题 现在很多邮件服务器要身份验证,ASP.NET(C#)的SMTPMAIL类有设置身份验证和密码的属性吗? 怎么在基于对话框的程序中加入一幅bmp作为底图? 刚学java,碰到一问题,请 有空进来看看 showMessageDialog的使用问题 disable mainmenu控件的某个subitem怎样实现 哈哈,需要短信网关IP地址及其源代码的快来顶一下。 sybase12.0安装时的问题??? 怎么样能用asp编写使得IE打开pdf文件?在查询后怎样还能在查询的输入框里面保留查询的输入? 如何使用TreeView进行分级管理 触发器的效率问题! 寻求解决方案 组件刷新问题,UP有分 请问 虚拟目录 和 WEB站点 有什么区别? DBEXPRESS的问题!很简单 请问那里有支持中文好的jsp开发的webmail下载?很急!谢谢大家了! 我如何在程序中切换输入法 怎么把一个COleDateTime类型的变量转成time_t类型(long型)变量? 结构成员这样定义 WCHAR bString[0]; 长度为0有意义吗? 关于DLL中的函数 如何动态分配指针数组? 哪里有关于delphi多线程资料下载? 急!!!SQL2000数据库IMAGE图象数据的存取?????? 这个存储过程怎么写? D7中的这个怎不见了啊-----急急 为什么只能传递两个汉字?有解决的办法吗? 关于DLL文件中的函数 小费除了tip还可以叫gratuity 蝴蝶效应是气象学家洛伦兹1963年在哪本著作或哪篇论文中最早提出来的? 如何验证溶液中既有硫酸钠又有稀硫酸 家里浇花用的手压式压力喷壶,如果打足了气其内部压力最大能达到多少个大气压? 有人给我三百块小费 用英文怎么说 要用tip这个词.完整的句子. 高锰酸钾把手染色了怎样去除 1151测气压 引压管有水会有什么影响 2.在使用生物样本如血浆进行TDM时,高效液相色谱分析法必须先开展什么工作?意义何 请问直流电阻测试仪哪个厂家的质量更好? 乌克兰的英文怎么写 又一杯清水,一杯盐水,用不品尝的方法加以区分,... 变压器直流电阻测试仪2011新品厂家?宝应高电电力设备厂,变压器直流电阻测试仪有呀 Hcl+盐=新盐+新酸,举两个例子, 如何把所学知识运用到实际工作中考试的时候有这样一个问答题 不知道怎么回答比较好 有文采好的朋友帮个忙 什么物质中含钙量多 Hcl为什么叫盐酸?他是属于盐还是属于酸也不是金属阳离子和酸根阴离子的化合物吧?为啥叫盐酸呢 PS在实际工作领域有哪些应用 98%的硫酸稀释成0.01mol/L的硫酸需要的硫酸和水的配比 求教:DMEM细胞培养,只在中央一片生长良好,四周几乎不生长,贴壁也少,怎么回事啊?DMEM细胞培养,只在中央一片生长良好,四周几乎不生长,贴壁也少,怎么回事啊?另外,生长液在培养过程中,慢慢变 有一杯清水 一杯盐水,用不品尝的方法加以分区,给你提供的器材如下:小方木块 铅笔 如何去除高锰酸钾的染色 为什么说喝蒸馏水不好?如题 “我从未对一个像你这样的人感到恶心”的英语,现等RT,拒绝机翻 用量筒取20ml05mol/l硫酸溶液于烧杯中加水80ml配置成01mol/l硫酸溶液对? 2004年乌克兰参加欧锦赛时用的那首歌的歌名叫什么?是乌克兰语和英语的那首歌 I tip way too much给小费太多,但是这里的way怎么理解? 那些食物含钙物质比较高?3Q 经过过滤的水是去离子水吗?我们公司有个过滤普通水后的水就直接喝机器,我想知道这些水是去离子水吗? 怎样记住tip的意思 它的一起好多啊 总是记不住 词义有 n.小窍门; 小费; 末梢; v.怎样记住tip的意思 它的一起好多啊 总是记不住 词义有 n.小窍门; 小费; 末梢; v.给小费; 倾斜,翻倒,顶端,倾覆; 在腌制咸菜几天里,怎么观察亚硝酸盐的多少? 木材的湿度要测量木材的温湿度,木材的种类也蛮多的所以希望温湿度计可以测量的木材种类也可以顾及是那仪牌子的那仪款好,可以的话给个联系方式吧 No need to tip.Thanks anyway.小费的tip还是tips? 浆细胞是唯一无法识别抗原的细胞,其原因是什么? 吞噬细胞能识别抗原,但不能特异性识别抗原. 根据小磁针的N、S极,在图中标出磁体的极性,并画出磁体周围的磁感线的分布.这个图的答案是别人早已给出的,可是我就是不明白.求解答,谢谢~~~万分 纸上谈兵的主人公是谁的 甲基绿、吡罗红染色观察DNA或RNA的实验染色时间过短或过长有什么影响?观察DNA与RNA的实验中要用到甲基绿与吡罗红.那么染色时间过短或过长对结果有什么影响? 什么叫荧光分光光度法? 浆细胞也不能识别抗原,为什么具有特异性? 为什么我以前买的高锰酸钾是紫色,这次买的是墨绿色,我把它们一部分混在一起了 CO2和氢氧根离子反应 CO2+OH-=CO32-+H+这个是不是不对?因为氢离子和氢氧根离子不共存 高锰酸钾溶液弄在手上洗不掉怎么办啊用什么方法可以洗下去呢急 高锰酸钾中加入氢氧化钠,置于空气中,墨绿色,并出现褐色沉淀.不久,墨绿色退去,成淡红色.求原因及反应方程式. 桌面上有一杯盐水、一杯清水,如何区别 滴入一定量的稀盐酸或稀硫酸以后,溶液从红色变为无色,这说明溶液的酸碱性发生了什么变化RT 氢氧化钠与高锰酸钾混合为什么变墨绿色,再跟三价的锑和铋离子反应 钱上被紫外线照射后发光的是 什么是无机物? 氢氟酸与纯碱溶液混合的化学方程式和离子方程式 有谁知道碳硫分析仪价格是多少?性价比高的 什么才是无机物? 洒水车用英语怎么说啊 硅酸根分析仪为什么一直是负的 新闻 无机物包括什么 洒水车 用英语怎么说啊?就是夏天在公路上喷水的洒水车~ 洛伦兹在他的哪篇论文推导了洛伦兹变换 怎样判断中心原子的价层电子对中的孤对电子对? tip 有给小费的意思吗? 关于混沌系统的文献翻译如图,划线的那句,favorite mood怎么翻译 证明一种溶液是稀硫酸溶液,要加什么物质? 巴基斯坦塔利班任命沙欣为临时首领1名中国游客在泰沉船事故中遇难 2名埃及前总统穆尔西今受审 “山雨欲来”埃及前总统穆尔西:从囚徒到总统再到囚一名中国游客在泰国芭堤雅沉船事故中遇安倍对俄“温和路线”欲解领土问题 难朴槿惠说如有益半岛和平愿与金正恩会谈克里说美国将继续与埃及政府紧密合作一游船在泰国芭提雅附近沉船6死 包括一艘游船在泰国旅游城市芭提雅附近发生孙杨无证驾驶被确认 浙江体育局表示深朴槿惠说如有益半岛和平愿与金正恩会谈缅甸若开邦近海翻船数十人失踪湖南希望小学为百亿项目腾地被拆 官方习近平叮嘱土家族群众:好好干、有奔头马来西亚要求“全面解释”对其监听行为奥运冠军孙杨驾卡宴被公交车追尾 涉嫌习近平赴湘西调研扶贫攻坚习近平摘柚子:“这是技术活”第六届“汉语桥”世界中学生中文比赛闭孙杨驾车发生交通事故 涉嫌无证驾驶警把脉皖茶产业:补齐短板 消费倒逼结构广东东莞藏茶30余万吨 打造“中国爱手机摄影 | 8招玩转手机摄影 之 旅行摄影怎么拍手机摄影 | 8招玩转手机摄影 之 摄影笔记第19条忠告——先自己琢磨人【大叔专场职位推荐】大平台,薪酬最高今晚21:00摄影笔记公开课 宁校长麒麟Kirin 650首秀!荣耀畅玩这么多品牌爱地球,尤其是杰士邦……手机摄影 | 8招玩转手机摄影 之 奥尼尔反驳巴克利:马刺会赢雷霆摄影初学者不要被这5点忽悠杜蕾斯昨晚成功把用户的裤子拖了下来,1分钟让照片更出“色”,局部去色Ap索尼微单镜头未来走向如何? 自信+黑手机修片“S+M大法”:让你的照片脱\\\\b\\\\b旅行重要一环 超商业摄影师是怎么炼成的 隋老师和你聊为打击ISIS 奥巴马支持美军发动网来,来。来,走过路过不要错过!真的没
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘