首 页 | 精品电影 | 音乐天堂 | 在线游戏 | Flash MTV | 三湘书屋 | 幽默笑话 | 三湘图库 | 美女写真 | IT知识库 | QQ贴图 | 加入书签

网页制作网络编程图形图象操作系统冲浪宝典软件教学网络安全认证考试通信技术电子商务业内动态书籍教程原码

最近更新 文章分类 多媒体类 精品软件

本站搜索:
您的位置:三湘时空 -> IT知识库 -> 文章分类 -> Delphi -> 如何用编程实现TDateTimePicker的24小时制到12小时制的转换?
如何用编程实现TDateTimePicker的24小时制到12小时制的转换?


文章类别:Delphi 来源: 作者: 发表日期:2006-2-4 字体:[ ]

小游戏 | 在线影院 | 幽默笑话 | 源码下载 | Flash MTV | 音乐试听 | 书屋 | 美女写真

 

昨天有一位网友在群聊中提到了这个问题,晚上回去想了很久。花了三个小时,终于找到了解决的方法,现在拿出来与大家分享:

  首先想到的是TDateTimePicker控件有没有属性来实现这一功能的转换,因为这样做的好处不言而知。在我看了TDateTimePicker、
TCommonCalendar这两个类的源码后得出了结论,不能用控件的属性或过程来实现这一转换。
  于是只好改变思路:
    我们知道,在Windows下可以修改时间的显示方式,具体方法如下:
    “控制面板”->“区域选项”(WINXP则是“日期与时间的显示方式”)->“时
     间”。在“时间格式”一栏中可以修改时间的显示格式,具的显示格式可在在“外观
     示例”中可以看到。
    现在可以知道“H:mm:ss”显示的是24小时制,而“tt h:mm:ss”显示的则是12小时
    制。

  我们把“时间格式”设置为“tt h:mm:ss”后再点击“确定”按钮退出。
  现在再来在窗体上放一个TDateTimePicker控件,OK,达到的预期的效果。

刚准备舒一口气,又转念一想,程序到了别人的电脑那不是又不行了??
看来,还得继续工作。

我们知道Windows的系统设置一般都保存在注册表中。现在的关键是找到时间显示格式所保存的注册表主键。
想一下,用的注册表搜索功能。
    我现在的系统时间是12小时制,它的显示格式是“tt h:mm:ss”。好,就来搜索这个
    吧。终于找到了第一个,仔细思量一下,应该是的:主键是:
        HKEY_CURRENadmin\Control Panel\International
    而其中的sTimeFormat键值名就是时间格式。
    但是,里边还有那么多的键值,要修改哪些呢?又是一个问题。
    想了一下,行,就用这个办法:
       1、导出主键
       2、在控制面板中把系统时间改为24小时制
       3、再导出主键
       4、运行两个记事体实例,分别打开刚才导出的主键(扩展名为.reg)
       5、比较,删除键值名和数据都相同的行
    现在出来了结果:
      12小时制和24小时制有三个键值的数据不同
        键值名      12小时制的值          24小时制的值
         iTime                   0                                      1
              iTimePrefix           1                                      0
             sTimeFormat       H:mm:ss                        tt h:mm:ss

  现在余下的问题就是如何编程序来实现了。
  Delphi对注册表的操作一般都是用TRegistry类来实现,具体的操作请参考相关资料。
  现在贴出其源码:

unit SetTimeSotryUnit;

interface

uses
  Windows, Registry;


Type
  Time_Story  =   (ts_12,       {12 小时制}
                          ts_24        {24 小时制}
                           );

procedure SetTimeStory(const Story: Time_Story);
function GetTimeStory: Time_Story;

implementation

{ ---------------------------------------------------------------------------
//
//   把系统时间的显示方式设置为指定类型
//
//   参数   :
//          Story       :       指定类型
//
  --------------------------------------------------------------------------}
procedure SetTimeStory(const Story: Time_Story);
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  {设置根主键为  HKEY_CURRENadmin}
  Reg.RootKey := HKEY_CURRENadmin;
  {打开主键   '\Control Panel\International'}
  Reg.OpenKey('\Control Panel\International', False);
  Try   {写入数据}
    Case Story of
      ts_12:    {12 小时制}
        begin
          Reg.WriteString('iTime', '0');
          Reg.WriteString('iTimePrefix', '1');
          Reg.WriteString('sTimeFormat', 'tt h:mm:ss');
        end;
      ts_24:    {24 小时制}
        begin
          Reg.WriteString('iTime', '1');
          Reg.WriteString('iTimePrefix', '0');
          Reg.WriteString('sTimeFormat', 'H:mm:ss');
        end;
    end;
  Finally;
    Reg.CloseKey;       {关闭主键}
    Reg.Free;
  end;
end;

{ ------------------------------------------------------------------------
//
//   返回当前系统时间的显示方式
//
//   返回值 :
//          默认的返回为 24 小时制
//
  -----------------------------------------------------------------------}
function GetTimeStory: Time_Story;
var
  Reg: TRegistry;
begin
  Result := ts_24;
  Reg := TRegistry.Create;
  Reg.RootKey := HKEY_CURRENadmin;
  Reg.OpenKey('\Control Panel\International', False);
  Try
    if Reg.ReadString('sTimeFormat') = 'tt h:mm:ss' then
       Result := ts_12
    else
       Result := ts_24;
  Finally;
    Reg.CloseKey;
    Reg.Free;
  end;
end;

end.

以上的实现功能的转换,而我们要在TDateTimePicker创建之前就要设置好系统时间格式。
所以还要修改.dpr的文件,如下:
program Project1;

uses
  Forms,
  SetTimeSotryUnit in 'SetTimeSotryUnit.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  if GetTimeStory = ts_12 then {如果为 12 小时制则显示为 24 小时制}
     SetTimeStory(ts_24)
  else                         {//如果为 24 小时制则显示为 12 小时制}
     SetTimeStory(ts_12);
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

至此全部完成....

上一篇:源代码的学习(如何学习) 下一篇:办公之星控件在Delphi里的使用
本栏目热门文章
·Delphi工具—反编译Delphi(三) 2006-2-4
·Delphi工具—反编译Delphi(二) 2006-2-4
·Delphi工具——反编译Delphi(一) 2006-2-4
·用FASTREPORT实现WEB应用中自定义报表 2006-2-4
·Delphi中ScriptControl的高级应用(一) 2006-2-4
·利用内存映射文件扩充程序可用的内存 2006-2-4
·QQ聊天记录器演示程序 2006-2-4
·Delphi与DirectShow&DSPack/在 2006-2-4
·UltraEdit也支持Delphi语法高亮 2006-2-4
·DirectShow之接口实战篇(二) 2006-2-4
新近更新文章
·BPCS系统现金流量分析工具开发日志 2006-2-4
·程序间相互通讯问题的解决 2006-2-4
·如何获取本地HTML文件的标题,超级链接 2006-2-4
·建立自己的csdn知识管理库(1) 2006-2-4
·使用Delphi开发多媒体播放音轨问题的FAQ(原创) 2006-2-4
·监视资源管理器的文件变化 2006-2-4
·实现在virtualStringtree中编辑的标准步骤 2006-2-4
·WINDOWS编程技巧之DELPHI篇 2006-2-4
·DELPHI面向对象支持特点--保护级类成员的应用 2006-2-4
·取Run下所有值(原创) 2006-2-4
首 页 | 软件发布 | 广告联系 | 下载帮助 | 意见反馈 | 网站地图
  CopyRight? 2002-2004 WWW.SXSKY.NET? All Rights Reserved
三湘时空 站长QQ:82675303 Email: