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

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

Android游戏开发之旅五 Path和Typeface Android游戏开发之旅四 Canvas和Paint实例 Android游戏开发之旅三 View类详解 Android游戏开发之旅二 View和SurfaceView Android游戏开发之旅一 长按Button原理 Android程序内存管理必读 Android按键事件映射表和转义符对照 Android Intent大全更新到API Level8 Android中Intent对应的category列表大全 Android中内嵌字体实现个性化 TextView多行本文滚动轻松实现 获取和设置ListView的选择项 EditText中显示隐藏Android输入法窗口 自定义ListView行间的分割线 Android程序完全退出的三种方法 WebView使用技巧和介绍 EditText仅允许特定类型数据输入 自定义Android应用的访问权限 android.text.format文件大小和日期解析类 Android Rootkit相关揭秘 androidmanifest.xml高级属性解析 根据packageName构造Context SQLite操作,还是raw方法更简洁高效 Android开发基础YesNo对话框构造代码 Android代码性能优化技巧 Android开发注意点 Part One onSaveInstanceState和onRestoreInstanceState的用处 Android基础概念Context的作用 在Android的Notification中显示进度条 Android跨进程数据通讯-剪切板Clipboard ConditionVariable Android线程同步 如何退出函数?exit function??? 测试2000的TCP/IP是否通,用什么命令 求助开发课程表提示 (*****向斑竹你提个小见意,大家最好都来看看,这个想法好不好!****) 为什么我做的增加功能有两个必须要按两次“添加”按钮才能新增一条记录啊? 很急,请教高手,如何把一个ip格式的字符串转换成ip类型,不是用getbyname(),而是像int和string转换一样的概念 请问如何让基于对话框的工具条一开始就浮在上面 来者有分,关于ado的 毛子青论文<<动态规划的优化>>,一个最长子序列的算法,请高手看过来(给出c实现代码的送20分!) 在鼠标单击时间中,可以使用什么函数取得鼠标点击处的坐标值 怎样在单击左键时弹出PopupMenu? 连续20多天加班,近来明显感到体力透支,做个调查!!!(有分) ASP调用VB编写的ActiveX DLL的问题 请教一sql语句 在Unix下用cc(实际上是cc_bundled文件)编译c程序时,报错“const" will become a keyword,或者告诉我“Function prototypes are an ANSI feature" 为何加入winsock2.h后会出现很多问题? 热烈庆祝:Kingron重出江湖!!!菜鸟们有福喽……散分 you shen me qu bie ? please tell me , xie xie ! [■■■Delphi猛料■■■]V1.3发布~~~~~~~更新到2001.12.12 提问:如何在ToolBar上加控件? 我在OLE里调用了word2000文档,为什么只显示第一页,我查了半天资料都没有解决,请帮我 哪里有多媒体软件制作论文啊? 继续请教各位前辈:能否将非新增加的字段定义成计算字段?谢谢! 软件创意、需求大汇集:列创意,拿专家分,120分值大赠送(以后可继续追加) 局渔网 巨简单问题~~~ 进来有分,回答多分,不够再加!!! 关于关闭和启动数据库的问题,很急的!! java VS c#^-^ ?? 请进 寻求QuickReport3以上版本 for Delphi3 的源代码或者安装包? 請問哪大俠用過 ibm 的 bridge2java啊,我把Excel的所有類都導出來了,但它的QuickExcel.java文件還是運行不了, 求救!新装了一块硬盘,为何找不到呀? SetWindowLong函数在delphi里可用,为什么在c++builder 中不能用??? 用弹出式菜单命令弹出一个dialog,可以响应键盘,可是不响应鼠标? 请教,Inserts类是拿来干什么用的? !!!急急急!!!怎样在WIN2000下把NTFS转换成FAT32啊。数据不丢失。 回复太短!或太长!!! visio2002的数据库建模,能不能生成SQL脚本? 急急啊,有關servlet的問題,源碼如下: 添加数据的问题 坐标问题 unix下的nfs Merry Christmas! 给分!祝大家一路发! 每个文件(目录)有3种权限 写DLL? 我定义了三个CSS样式表 高分求教:谁用pb7作过三层结构的东东,我现在要做啦,指点一下吗 Somebody Help Me!! 我安装软件包里的一个DIREX8.1的升级程序后常会出现一个对话框,要我到微软网站升级一个程序 最近在构思一个大型的论坛系统,也想听听大伙的意见,发言就给分!!! 有什么好用数据库建模工具? 帮我看看这段代码错在哪里 为什么马达加斯加岛的东部形成了热带雨林气候而西部形成了热带草原气候 大自流盆地的水为什么盐度高呢? 在已经产生AgCl沉淀的溶液中,能使沉淀溶解的方法是:加入浓氨水.为什么加入浓氨水能溶解沉淀,化学方程式是什么样? 马达加斯加岛的东侧为热带雨林气候,形成此类气候类型的原因是什么?是不是和迎风坡有关系?什么是迎风坡?感激不尽~ 生活中,浪费水现象是十分严重的,请你列举一些. 取Cu和Cu2O的混合样品12克,加入到足量的稀HNO3中用排水集气法收集产生的气体,标准状况下其体积为2.24升,则样品中Cu2O的质量为多少? 为什么水银温度计用过要甩,否则就无法继续用呢? 回归线附近的马达加斯加岛东部不是热带草原气候而是热带雨林气候? 请举出两个实例,说明物质的溶解性与溶剂有关 为什么用完温度计要把水银甩回去?而且再怎么甩也甩不回原点? 澳大利亚东北部热带雨林气候的形成因素有哪些?也就是形成这种气候是由哪些因素促成的. 为什么澳大利亚西部地下水盐分较多?能满足牲畜的生理调节?是不是还和盆地有关? 水银温度计是否可以把水银甩下去以迅速再用? 澳大利亚东北部一小块热带雨林气候形成原因RT. 地下水盐度与什么有关,岛国地下水盐度就高吗? 将一块石蜡,分别放入足量的水和酒精中,当石蜡静止时,它排开水的体积与排开酒精的体积之比为 (ρ石蜡=0.9×103kg/m3,ρ酒精=0.8×103kg/m3) 澳大利亚热带雨林气候与热带沙漠气候的成因 不同物质在同一溶剂中的溶解度不同,举例还有啊同一种物质在不同的溶剂中的溶解能力不同不要只给几个字母的答案= =||| 地处太平洋与印度洋、亚洲与大洋洲之间的“十字路口”是指? 不规则的海绵的体积怎么求?(认真的)不规则的海绵体积怎么求?用沙吧,误差大怎么测呢?个人认为用橡皮泥.请不用水测,水的误差还大些!固化海绵?你那测的是体积?益出水的体积就是海面的体 溶解性指的是溶剂还是溶液的性质? 为什么澳大利亚人口集中在太平洋沿岸地区? 测量一块不规则塑料块的体积利用水和量筒测量一个不规则的塑料块体积,要求能尽量减少误差. 结合生活中的实例,举例说明影响气体溶解度的各种因素.如题 (1)以亚洲太平洋沿岸地区为例,比较自地纬至高纬各气候类型的气候特征的主要差异(2)以亚欧大陆中高纬度地区为例,比较大路西岸,大陆内部,大陆东岸各气候类型的气候特征的主要差异. 生活中有哪些浪费水的现象?怎样制止 乒乓球的体积?乒乓球的体积 处于亚洲与大洋洲之间,连接太平洋与印度洋的海上通道是 如何测白砂糖的体积?辩泉注钝 澳大利亚为什么地下水丰富 一个实心物体放在水中静止时处于漂浮状态,有4/1的体积露出水面,求该物体的密度? 浪费水的例子有哪些 澳大利亚西部的地下水为什么盐分较多? 甲 乙两个实心物体漂浮在水面上,体积之比为2比1,浸在水中部分的体积之比为1比2,那么它们的密度比是多少. 家庭中有哪些浪费水的事例例如:洗脸或刷牙时一直让水流 生活中应用氧气与隔绝氧气的例子!个举两个!谢谢 质量相等但密度不同的A、B两个小球,方放入水中后都处于漂浮状态,其露出水面部分的体积是总体积的三分之一和一半,则两球A.受的浮力比FA:FB=2:3B.受的浮力比FA:FB=1:1C.密度比ρA:ρB=3:4D. 生活中浪费资源的事例比如:使用一次性筷子 浪费水资源之类的 要求距离5个以上 当然越多越好 为什么温度影响氧气在水中溶解的多少 将密度均匀、重为10N的物体放入水中,静止后物体漂浮在水面,若将露出水面的部分切去后,剩下部分重为8N则物体密度为A、1g/cm3 B、0.8g/cm3 C、0.2g/cm3 D、1.2g/cm3 浪费水的例子 生活中隔绝氧气的例子 热带雨林气候的成因!a终年气温高,气流下沉强烈 b终年气温高,气流上升旺盛 如何测量泡沫的体积不可以是排水法 在生活中隔绝氧气的例子 氧气不易溶与水,那水中的生物怎么生存呢(不是生物问题) 海绵的体积海绵,δ=20,加工尺寸510*505,数量1,体积怎么算啊?万分感激 澳大利亚大自流盆地的原理 如果氧气在水中溶解很大时我们可以在水中活吗瞎想的 60°s附近海域海水的盐度比60°N附近海域海水的盐度要高,原因是什么? 澳大利亚大自流盆地形成的原因? 请问:物质溶解在水中,体积是否会发生改变如果是NaCl溶于水呢 测乒乓球的体积器材;量杯.水.细线. 向A溶液中加入B溶液,先有沉淀生成后又溶解.AB分别是? 一块糖在水中溶解后,水和糖的总体积有什么变化?为什么? 为何澳大利亚大自流盆地的自流井盐度较高? 沉淀溶解溶液将BaCO3(Ksp=2.6x10-9)和 CaCO3(Ksp=4.9x10-9)置于水中,形成含有CaCO3(s)和 BaCO3(s)的饱和溶液,此溶液中c(Ba2+)和c(Ca2+)分别是()0x10-5 和 5.7x10-5 水中溶解物质时 温度或体积为啥有变化 澳大利亚大自流盆地中的井水,不宜灌溉农田的主要原因是 A、 水量过少,仅能提供牲畜饮水 B、水位低,提水灌溉成本过高 C、井水盐度较高,会引起土地盐渍化 D、井水含沙量过大 都有什么是加溶液先加沉淀再溶解
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn