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

在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怎样使我的程序总处于屏幕最前方?(Always on top) VB怎样延迟一个VB程序? VB怎样在VB中控制WORD VB怎样找到鼠标指针的XY坐标? 增加快捷方式到启动组-VB资料 直接呼叫RUNDLL来关机-VB资料 VB制作VB安装程序问答(二) VB制作VB安装程序问答(一) VB制作帮助文件速成 重新验证 Win 95 用户口令 -VB资料 桌面的大小 -VB资料 字体改变事件 -VB资料 自定义组合热键 -VB资料 自动更换墙纸的小软件-VB资料 自动记录应用软件工作时间 -VB资料 自动卷动TextBox -VB资料 自动开始上次关机时关闭的应用 -VB资料 自动装入注册设置 -VB资料 自己编程模拟 MouseEnter,MouseExit 事件 -VB资料 走进VB6啃一块骨头 做成一个时间限制的测试版 -VB资料 PHP中利用jQuery实现SWF图像上传和裁剪 VB.NET或C#将DataSet快速导出到Excel中 HashSet的equals和hashCode重写问题 PendingIntent实现原理和代码 IntentService实现原理及内部代码 AsyncTask实现原理和内部代码 Neither user nor current process错误 ListView的右边滚动滑块启用方法 Live Wallpaper动态壁纸开发 天啊!救命啊!! 如何在客户端IE中执行服务器上的应用程序呢,十万火急。请各位大虾不吝赐教 :如何将包含各种数据类型的文件读入,而且要考虑文件的定位(比如从文件最后一个数据往前读) 如何响应wm_nchittest 消息? SHELL是否可以调用网络资源 在PHP中使用word COM对象的问题。 请教一个问题:如何反回一个MonthCalendar1控件上的的周期(控件上有显示,但不知道如何在程序中得到)? 老板叫我做一个界面,跟VC的界面视图一样, 能不能作一个中文编译器??? 我不要活了。。。 菜鸟:一个小问题 基于对话框的程序中,使用了Tree Control和Edit box,如何在Edit box中显示TreeControl中选中的文本文件的内容。希望提供类似的例子。 ★★★★★★★紧急求救★★★★★★★★ 寻找丢失的分区表!!! windows2000进入“等待”后,唤不醒是怎么回事,请指点! jsp数据库中的Date类型? 在vb中如何进行时间比较?例如1 / 7 / 17 10:00:00 - 1 / 7 / 17 00:00:00 得到一个值?? 请问如何获得其他机器的网卡MAC地址?非常感谢!!! 别了,最爱的BCB! 如何判断一个指向窗口的指针可用? 请教高手:怎么样破windows2000的登陆密码?其密文存放在什么地方? 急:哪里有电子文档 找到找到 网络编程、大虾有请!如何获得当前每秒的字节数? 各位高手,有人喜欢用mysql吗?谈谈这个东东吧 大富翁怎么连不上了? 各位武汉的大虾,请教武汉程序员、高级程序员、系统管理员(正规的大公司)、以及用JAVA做开发的工资一般为多少。希望大家给予帮助!!前途问题!! 网络编程大虾有请!如何获得当前每秒的字节数? 怎样在treeview中设置背景图片 to 版主:精华区太乱了,请给予分类。谢了 听说VB可以写PAD的程序,TRUE? JLabel中文本换行问题 马上要开始学BCB,请问BCB有那种类似于VC的创建类的向导吗,看到BCB的界面我就想到DELPHI中创建类的难度 我的游戏引擎BATTLEFIELD作好了,欢迎下载(这次是真的) 一个pop_up menu的问题 那位高手知道在SDK中使用ADO的方法 为普天之下正直而上进的程序员找一个温馨的家 为什么不能把JMF包打进去??? 内存泄露是指例如“为对象分配一个内存区后,未删除内存区,但删除了对象”是吗? 装pws时遇到的麻烦! to freezwy(网络自由人) 有没有限制上传图片大小的asp代码??(不是组件) 还是没有解决!!! 有关VC中数据库绑定的问题! 扔个骨头……下个“圈套”,呵呵? ^_^ 紧急情况!如何改变DataGrid控件中个别行的颜色?? 如果实现断开共享目录的连接 acces 表 SQL语句中如何转换字符型字段为整型? First-chance exception 请教directx的一个入门问题? 诚征MM中…… 多线程问题?? 610乘800等于多少? 无限循环小数是有理数,都是可以化成分数形式, 推荐一下雷鬼音乐 60乘800等于多少?60乘800等于48000 “有理数可以表示成分数的形式”对吗 推荐几条鲍勃 迪伦bob dylan的最经典歌曲.要最经典、百听不厌的. 3吨50千克等于几分之几吨要化成最简分数 有理数都能写成分数形式,那0呢? 请问一首鲍勃.迪伦(Bob Dylan)的歌名windows xp 第一次发行的时候,捆绑的windows media player 里面自带了一首美国乡村歌手鲍勃.迪伦(Bob Dylan)的歌,我忘了是歌名, 学校食堂运来1500千克煤,计划烧50天.由于改炉灶,每天节省5千克煤,实际可以烧多少天? ( )/( )=0.28=几分之几=( )% 任何一个有理数都可以表示成分数的形式吗?急 食堂运来10吨煤,计划烧40天.由于改进炉灶,每天节省5千克.这批煤现在可以烧多少天?列式为() 4是28的几分之几的答案是多少 凡是有理数都可以化成分数吗 食堂改进炉灶后每天烧煤69千克,比原来节省8%.原来每天烧煤多少千克? ( )÷5=几分之几=0.4=10﹕( )=( )% 小数,分数可不可以都化成有理数?在分类题当中,小数、分数可不可以互化?分母能被分子整除的算不算做整数? 食堂运来2000千克煤,计划40天烧完,由于改进炉灶,每天节省5千克,这批煤大约可以烧多少天?两种方法 6分之5 既表示1的几分之几,还表示5的几分之几 把0.017(17循环)化成有理数(分数) 食堂改进炉灶后,比原计划节约5分之1,正好节约6分之7吨,实际用煤多少吨 3/1是5/6的几分之几?3/1表示3分之13/1是5/6的几分之几?24/5是36/25的几分之几?大大大大大虾们 可以OK么?3分之1是6分之5的几分之几,24分之5是36分之25的几分之几 算式这么列? 一个最筒分数,如果把分子减1,可以约成1/2;如分子如1,可约成2/3.问这个最筒分数是几分之几? 某食堂本月改进炉灶后,比原计划节约用煤五分之一,正好节约2吨.本月实际用煤多少吨? 0.6里面有6个几分之一表示几分之几 0.48=几分之几(分数) 食堂运来3吨煤.计划可以烧20天.由于改进炉灶,每天可比计划节约30千克,这批煤现在可以烧多少天?第二个问题:甲乙两个仓库存有大米,乙仓库比甲仓库少2800千克,甲仓库大米的重量是乙仓库的 ∠A=90度,BD是△ABC的角平分线,DE是BC的垂直平分线,求∠ABC和∠CDE的度数. 百分之12.5怎样化成分数? 某食堂改造炉灶后,每天节约用煤60千克,这样原来计划用32天的煤,现在可以用48天.这堆煤共有多少千克? 已知关于x的不等式组{x-a≥0,5-3x>-1,它的整数解共有5个,求a的取值范围. 把下面的百分数化成分数 50% 75% 40% 12.5% 10% 水泥厂食堂运回3吨煤计划可以烧20天,改进炉灶后,这批煤烧了25天,实际平均每天比原计划节约用煤多少千克 已知5x-3y-2=0,则1010x ÷106y =(        ) 12.5化成分数是多少 食堂改进炉灶后,每月比计划少用煤五分之一,正好节约十分之九吨,现在每月实际用煤多少吨 某商场以50元/件的价格进来一批羊毛衫.前期市场点调查表明:如果以60元/件的价格卖出,则每周可卖出100件,在此基础上销售价格每件增加5元,则周销售量减少4件.假设该商店把销售价格定为x 将0.252525252525.化为分数 一项工程,计划10天完成,实际8天完成任务,工作时间缩短了20%,工作效率提高了25%!为什么?工作时间缩短了:(10-8)÷10=20%工作效率:原来10天完成,每天10分之1,实际8天完成,每天8分之1.提高了: 小明向一个底面为30cm*30cm的长方体玻璃容器中装满水,并将一部分水倒入一个正方体铁桶中,当这个正方体铁桶装满水时,长方体容器中的睡眠下降了20cm,则这个正方体铁桶的棱长有没有超过25cm? 分数化成小数:12分之5 一件工作,原计划10天完成,实际8天完成,工作时间缩短了()%?工作效率提高了()%A12.5 B20 C25 D10(是选择题) 快急!19/78是几分之几? 把小数化成分数0.75 3.42 2.12 一项工作,原计划十天完成,实际八天完成,工作时间缩短了百分之几,工作效率提供了百分之几工作效率是10/8-1=25%吗这道算式的思路是什么 一杯牛奶,第一次喝了全杯的2分之1,第二次喝了全杯的4分之1,还剩全杯的几分之几?快 将下列小数化成分数:0.85=( ) 3.12=( ) 一件工作,原计划10天完成,实际8天完成,工作时间缩短了百分之多少,工作效率提高了百分之多少? 1.22222 ×9-1.33332 ×4=(        ) 18.4%怎样才能化成分数或小数, 一箱工程原计划25天完成,实际提前了5天完成,工作时间缩短了几分之几? 100分之28化成最简分数是几分之几? 芭比之歌星公主 我在这 中文版歌词 求啊.各种球 一件工作,原计划10天完成,实际8天完成,工作时间缩短了( )%,工作效率提高了( )%. 100分之304化成最简分数 here i am歌词(芭比之歌星公主) I wish i had life歌词(芭比之歌星公主) how high we can fly 歌词最好还有princess want have fun歌词 完成一项工程的时间由5小时缩短到4小时,工作效率提高了几分之几?要有思考过程 成绩优秀率=几分之几*100%人员的出勤率=几分之几*100%急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急 急需一份雷鬼音乐的英文介绍与一份Bob Marley的英文介绍一定是纯英文翻译!不是翻译软件翻译出来的!reggae与hip-hop,jazz的节奏有什么关系?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn