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

在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获得分区信息并判断是否有CD VB获得某个文件夹下的所有子目录 VB获得驱动器的卷标 VB获得系统中的所有字体列表 VB获得系统中鼠标的键数 获取驱动器信息-VB资料 文章主题: 获取桌面图象 -VB资料 计算两个日期间的工作日-VB资料 监视外部程序的运行情况-VB资料 检测文件是否存在 -VB资料 检测系统驱动器-VB资料 检查电子邮件地址输入的有效性 -VB资料 检查硬盘空间 -VB资料 将数据转换为内存二进制形式字符串(模拟CV?和MK?$两组函数) -VB资料 禁用 Alt-Tab 或 Ctrl-Alt-Del -VB资料 禁止使用 Alt+F4 关闭窗口-VB资料 绝非玩笑:VB7将完全面向对象 拷贝磁盘 -VB资料 控制Ctrl+Del+Alt键-VB资料 快速编辑VB程序技巧 快速查找或替换文本中的字符-VB资料 快速建立目录 -VB资料 快速交换整数 -VB资料 快速注册/注销动态链接库或控件-VB资料 理解面向对象编程 -VB资料 VB利用GetCursorPos 读取滑鼠的座标 利用Visual Basic 关闭Windows9X或者Windows NT VB利用代码启动/关闭中文输入法 模拟一次鼠标事件 -VB资料 目前执行的是哪一国语言的 Windows -VB资料 VB判断剪贴板的所有可用格式 Label控件拖放时,拖放结束(放开鼠标)触发哪个事件?急... 技术问题中的非技术问题》》》》》 请大侠看看这个怎么实现比较好!读取文件的一部分。。。 如何把c++builder开发的程序移植到 windows ce环境下???共有6870分送!!! 如何显示JPG文件? 再问审批流程中的多角色定义 屏蔽IE工具栏等的高难度问题?????路过的高手都都看看吧;-) 急问:在VC中怎样些中断服务程序? 关于时间字段的问题 怎样用ATL制作一个Dialog容器,里面可以放置别的窗口 请问VC中为什么需要动态创建(与序列化有关的)?求通俗的解释或举例说明。谢。 紧急求助!! 请问那里有tc++ 3.0的下载?小弟先行谢过啦! 怎样从句柄得到对象,附有具体代码? 关于CStringArray的使用问题???? 我的程序错了么?? 我的程序错了么? DHCP问题 关于IIS的使用 XML中华网(www.xmlchina.net)诚邀您的加盟,让我们共同讨论.NET!! 请问:DCOM连接成功,但是不执行客户微服务器代码是什么原因? 建议有CMM实施经验的同仁定期召开一个讨论会,交流一些方法和思想。 请问在哪儿可以下载c++编译期(在UNIX环境下运行) 听说新出的JB6是4张盘,是吗?都是什么内容?大家讨论一下好吗? 一个菜鸟的问题,请问 rs_user.open sql,conn,3,2 中的3,2 是什么意思 test 如何显示AUTOCAD 生成的DWG矢量文件?(来者有分) 我送分来了 名词解释........ 一个菜鸟的问题,请问 rs_user.open sql,conn,3,2 中的3,2 是什么意思 c#中的DataGrid问题 请教关于jdk库的文档的问题 机器一启动,IE就跳出来,转到指定的网站,怎么办? 有空来坐坐啊各位大虾们 微狗是什么東西﹐它的原理是什么. 谁知道用vb怎么编出来能读出PCI数据的程序啊。我有高分相送啊 jsp 中 include 的问题 高手请指点:winuser.h明明有KBDLLHOOKSTRUCT的说明,但在程序中却老是出现未定义,你知道原因吗? 可以用例子说明一下ORACLE的外连接的SQL语句吗? 水晶报表的菜鸟问题 visual C#能制作类似于它自已的菜单吗?也就是office xp的菜单 在ADO中怎么用模糊查询? ftp的多线程下载问题 请教有关jdk库的文档的问题 谁有在启动时候装载引导界面的程序呀?先告诉我给分,都给了 一个SQL生成脚本,在查询分析中运行后,同一个源程式,客户端界面成乱码。 谁知道用vb怎么编出来能读出PCI数据的程序啊。我有高分相送啊 那个兄弟试过在delphi里用互斥元来实现多线程? 请问如何判断一个对象是否已经初始化??? 谁知道用vb怎么编出来能读出PCI数据的程序啊。我有高分相送啊 显示中文遇到困难,有经验的请进 建索引的问题。 二氧化硫的化学性质 包括所有化学方程式 如何配制1g/L的百里香酚酞指示剂 历代中央政府对新疆,西藏,台湾的管辖谢绝长篇大论,有要点就可以了(什么时候在哪里干吗) 战国时期,“士〔有才能有胆识的人〕”是一个非常特殊的社会阶层.请你举出历史上几个有名的“士” 要故事要带故事的 不要太长的 详细见初三语文上册“唐雎不辱使命”课后第4题 战国时期的“士”指那一类人?举出历史上有名的“士”,说说他们的故事. 越南语翻译成中文!女对男说:em chua ve anh a,vi may hom em ko di lam,con 3hom nua em moi het thang anh a,het htang em moi ve viet nam dc amh a. so2有什么化学性质? 英语翻译我是北方人,我的家乡会下雪,很美,你们越南肯定没有的,中国有很美的地方,很想带你看看,但是很失望,我们的语言沟通出现了问题,你很可爱,认识你我很开心,2008年北京奥运会欢迎你 我想问问各位,大理石(500G) 的碳酸钙含量大约多少? 战国时期,“士”是一个非常特殊的社会阶层.“士”是指哪一类人,举出几个历史上有名的“士”. 举出战国时期的士的故事简短一点 .太长不好、、 大理石中碳酸钙.取100g大理石加入足量盐酸,生成26.4g二氧化碳.1.大理石中碳酸钙的质量.2.大理石中碳酸钙的质量分数. 二氧化硫 物理性质和化学性质question:大气中的有害气体主要是一氧化碳,二氧化硫,二氧化氮等,其中二氧化硫在通常情况下是一种无色,有刺激性气味的有毒气体,且易溶于水,他也能与水反应, 怎么做?拜托拜托~~~这是数学题,要用概率解的,一定要帮我啊、、、田忌赛马是一个为人熟知的故事.传说战国时期,齐王与田忌各有上、中、下三匹马,同等级的马中,齐王的马比田忌的马强. 某大理石样品50g 中含有40g纯碳酸钙则该大理石中的碳酸钙的质量分数是多少? 战国时期,“士”是一个非常特殊的社会阶层.举出几个历史上有名的“士”的例子 战国时候的士分哪几类?除《唐雎不辱使命》外,再举两个史上有名的“士”的故事?“士子精神”的内涵 用大理石制CO2时,反应物是大理石还是碳酸钙? SO2、SO3都有什么化学性质 我国古代农业的特点古代的 CaCO3是试剂吗? SO2的化学性质及物理性质no的化学性质 中国古代农业特点? 镁条在空气中点燃,与氧气反应,发生燃烧,发出耀眼的白光,同时生成氧化镁是化学性质吗? 请问众位高手:格氏试剂与醛、酮或腈的加成反应对温度、搅拌、浓度、纯度等有没有特别的要求?请问众位高手:格氏试剂与醛、酮或腈的加成反应要注意哪些事项?对温度、搅拌、浓度、 NaCl KNO3 NH4NO3 NaOH 这四个固体哪种固体加入水能生成气体?这种气体是什么气体?如题 碳酸钙能否一步反应到氢氧化钙? α,β-不饱和醛酮的1,4加成的典型反应极其反应机理?效果好后面追加20!先谢咯! 英语翻译Minh yeu nhau nhe anh!nhung thoi vay vi em rat thich bai hat nay ma 呵呵..^_^cho den khi that lon如题 上面的越南语的意思是? 氢氧化钙和碳酸钙反应式 什么叫α,β -不饱和醛酮?α,β -不饱和醛酮是什么? 将等质量的NACL,KNO3,NH4NO3,NAOH等4种固体放入试管中,再加入等量的水,盖好橡胶塞,振荡,静置,观察到 C5H10O的同分异构体有几种 除了醛和酮好像还有烯醇和环醇 我写了24种 醛有4 酮有3 一烯醇有7二烯醇有1 五环醇有1 四环醇有3 三环醇有5 搞晕了 请问~格氏试剂和醛或酮加成后的产物R-O-Mg-X稳定吗? 我国重视农业的思想家和皇帝各一位 写出戊醇的同分异构体,其中能满足氧化成戊醛的醇 战国时期的“士”是指哪一类人,举出几个历史上有名的“士”以及他们的故事 自制饮料:要求含蛋白质、葡萄糖、多种维生素、充足钙质、电解质、盐.请问这么搭配科学么.比例是多少 先后顺序或者说有更好的建议神码的还有 把制作方法告诉我. 碳的化学性质尽可能全面一点 欲除去氢氧化钠溶液中的少量杂质氢氧化钙,可以选用的试剂是(B)做这类题目方法是什么?A氢氧化钾溶液 B碳酸钠溶液 C氯化钡溶液 D稀盐酸 他说B反应不会产生新杂质,请问碳酸钙不是新杂质么 二氧化硫的化学性质,用方程式说明,除漂白性以外,急,急····· 醋是怎么制造出来的?请说得通俗一点, 人体电解质会怎样流失和怎样补充?我的工作环境是在露天的工地上,每天都被太阳晒的很口渴所以我每天都能喝大概5瓶纯净水,因此排尿多.会不会导致流失电解质?最近会感到腿软没劲,饮食很 格式试剂与醛酮加成产物水解制取醇时有时候用硫酸溶液有时候用氯化铵,为什么? 液体醋酸是电解质吗 啥情况下人体电解质容易流失? 格式试剂与醛、酮加成产物水解成醇,有时用硫酸,有时用氯化铵这是为什么? 醋酸是强电解质吗 怎么查人体电解质 氢氧化钠滴定磷酸,用百里香酚酞做指示剂,终点为蓝色,最后生成物是什么 液态醋酸是电解质吗? 格林尼亚试剂简称"格氏试剂",它是卤代烃与金属镁在无水乙醚中作用得到的,如CH3CH2Br+Mg――→乙醚CH3CH2MgBr,它可与羰基发生加成反应,其中的"-MgBr"部分加到羰基的氧上,所得产物经水解可得醇 二氧化硫的化学性质二氧化硫的气味,属于什么性质? 中国古代中央政府出台的促进农业发展的政策和措施 化学:格氏试剂与环乙醚怎么反应啊 百里香酚酞的配制 醋酸是否为电解质如题 格氏试剂中乙醚起什么作用不能用乙醇代替吗 二氧化硫物理性质、化学性质将一只充满二氧化硫的试管倒立与滴有石蕊试液的水槽中,现象?结论?化学方程式:SO2+Na2O、SO2+CaO、SO2+NaOH、SO2+Ca(OH)2、SO2+O2、H2S+SO2 历代中央政府对西北的管辖
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘