进入旧版 | 服务项目 | 成功案例 | 联系方式 | 过客留言 | 友情链接
   
设为首页
加入收藏
联系我们
网站首页 | 新闻资讯 | 操作系统 | 办公软件 | 网络软件 | 工具软件 | 媒体动画 | 网页制作 | 网站开发 | 程序开发 | 平面设计
Photoshop视频教程 | Word入门 | Flash入门 | JScript | VBScript | ASP | PHP | ADO | 网页特效 | 3DS MAX6.0命令 | 系统进程
您当前的位置:GOODSGY电脑学习网 -> 程序开发 -> DLEPHI -> 文章内容  
在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.

在百度中搜索:在Delphi中处理数据库日期型字段的显示与输入
在Google中搜索:在Delphi中处理数据库日期型字段的显示与输入
在Yahoo中搜索:在Delphi中处理数据库日期型字段的显示与输入

收藏到网摘:新浪VIVI 365key 我摘 POCO网摘 博采中心 YouNote 和讯网摘 天天收藏
[] [返回上一页] [打 印] [收 藏]

 相关文章    最新文章
· 在DIV中class与id的区别及应用
· 在DreamWeaver3中应用CSS样式表技巧两则
· [组图] 如何在Dreamweaver中制作表格美化页..
· [组图] 如何在Dreamweaver中嵌入式框架
· [组图] 在Dreamweaver中插入有颜色的直线
· [组图] 在Dreamweaver MX中应用“占位图形..
· [组图] 在Dreamweaver制作可拖动表格
· [图文] 在DW 4中用CSS样式表来美化网页
· [组图] 在Dreamweaver中使用样式表
· 解决在Dreamweaver中不支持中文文件名的方..
 
· 小技巧:如何用Delphi创建快捷方式
· Delphi版模仿熊猫烧香病毒核心源码
· Delphi“判断服务器路径”与“清空日志文..
· 应用程序敏感键的实现
· 用Delphi实现远程屏幕抓取
· 用DEPHI为应用软件建立注册机制
· 利用Hook技术实现键盘监控
· Delphi编程实现Ping操作
· 通用Delphi数据库输入控件DBPanel的实现
· 用Delphi开发屏幕保护预览程序

∷相关文章评论∷    (评论内容只代表网友观点,与本站立场无关!) [更多评论…]
站内搜索

精彩图文
  网站导航  
操作系统 办公软件 网络软件
Vista Windows2003 WindowsXP Windows2000/NT Windows9X/ME Linux 其他 Word Excel Powerpoint Outlook 金山系列 其他 网页浏览 上传下载 联络聊天 邮件工具 服务器软件 网络辅助
工具软件 媒体动画 网页制作
系统工具 媒体工具 压缩工具 图文处理 文件管理 其他 3DMAX Authorware Director Maya 视频处理 其他 Flash Dreamweaver FireWorks FrontPage LiveMotion Golive HTML/CSS 其它
网站开发 平面设计 程序设计
ASP JSP PHP CGI JavaScript VBScript XML/SOAP Web服务器 Photoshop PhotoImpact CorelDraw Illustrator Freehand 设计欣赏 其他 VB VC .NET C/C++ DELPHI JAVA

冀ICP备05019428号
Copyright © 2004-2008 电脑学习网 Inc.All rights reserved.
TEL:13832340607
QQ:39873155
E_Mail:goodsgy(#)hotmail.com   (把(#)替换成@)
MSN:goodsgy(#)hotmail.com   (把(#)替换成@)