昨天有一位網友在群聊中提到了這個問題,晚上回去想了很久。花了三個小時,終於找到了解決的方法,現在拿出來與大家分享:
首先想到的是TDateTimePicker控件有沒有屬性來實現這一功能的轉換,因為這樣做的好處不言而知。在我看了TDateTimePicker、
TCommonCalendar這兩個類的源碼後得出了結論,不能用控件的屬性或過程來實現這一轉換。
於是只好改變思路:
我們知道,在Windows下可以修改時間的顯示方式,具體方法如下:
“控制面板”->“區域選項”(WINXP則是“日期與時間的顯示方式”)->“時
間”。在“時間格式”一欄中可以修改時間的顯示格式,具的顯示格式可在在“外觀
示例”中可以看到。
現在可以知道“H:mm:ss”顯示的是24小時制,而“tth:mm:ss”顯示的則是12小時
制。
我們把“時間格式”設置為“tth:mm:ss”後再點擊“確定”按鈕退出。
現在再來在窗體上放一個TDateTimePicker控件,OK,達到的預期的效果。
剛准備舒一口氣,又轉念一想,程序到了別人的電腦那不是又不行了??
看來,還得繼續工作。
我們知道Windows的系統設置一般都保存在注冊表中。現在的關鍵是找到時間顯示格式所保存的注冊表主鍵。
想一下,用的注冊表搜索功能。
我現在的系統時間是12小時制,它的顯示格式是“tth:mm:ss”。好,就來搜索這個
吧。終於找到了第一個,仔細思量一下,應該是的:主鍵是:
HKEY_CURRENT_USER\ControlPanel\International
而其中的sTimeFormat鍵值名就是時間格式。
但是,裡邊還有那麼多的鍵值,要修改哪些呢?又是一個問題。
想了一下,行,就用這個辦法:
1、導出主鍵
2、在控制面板中把系統時間改為24小時制
3、再導出主鍵
4、運行兩個記事體實例,分別打開剛才導出的主鍵(擴展名為.reg)
5、比較,刪除鍵值名和數據都相同的行
現在出來了結果:
12小時制和24小時制有三個鍵值的數據不同
鍵值名12小時頻鬧?4小時制的值
iTime01
iTimePrefix10
sTimeFormatH:mm:sstth:mm:ss
現在余下的問題就是如何編程序來實現了。
Delphi對注冊表的操作一般都是用TRegistry類來實現,具體的操作請參考相關資料。
現在貼出其源碼:
unitSetTimeSotryUnit;
interface
uses
Windows,Registry;
Type
Time_Story=(ts_12,{12小時制}
ts_24{24小時制}
);
procedureSetTimeStory(constStory:Time_Story);
functionGetTimeStory:Time_Story;
implementation
{---------------------------------------------------------------------------
//
//把系統時間的顯示方式設置為指定類型
//
//參數:
//Story:指定類型
//
--------------------------------------------------------------------------}
procedureSetTimeStory(constStory:Time_Story);
var
Reg:TRegistry;
begin
Reg:=TRegistry.Create;
{設置根主鍵為HKEY_CURRENT_USER}
Reg.RootKey:=HKEY_CURRENT_USER;
{打開主鍵'\ControlPanel\International'}
Reg.OpenKey('\ControlPanel\International',False);
Try{寫入數據}
CaseStoryof
ts_12:{12小時制}
begin
Reg.WriteString('iTime','0');
Reg.WriteString('iTimePrefix','1');
Reg.WriteString('sTimeFormat','tth: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小時制
//
-----------------------------------------------------------------------}
functionGetTimeStory:Time_Story;
var
Reg:TRegistry;
begin
Result:=ts_24;
Reg:=TRegistry.Create;
Reg.RootKey:=HKEY_CURRENT_USER;
Reg.OpenKey('\ControlPanel\International',False);
Try
ifReg.ReadString('sTimeFormat')='tth:mm:ss'then
Result:=ts_12
else
Result:=ts_24