六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

Delphi系列的Y2K問題

[摘要]Delphi發(fā)展至今,已經(jīng)是第五版本了。盡管各個(gè)版本有大大小小的Bug,但疵不掩暇,她還是贏得了廣大程序員和編程愛好者的追隨和愛戴。隨著2000年的逼近, Y2K的一系列問題和各種解決方案也就隨之提...
Delphi發(fā)展至今,已經(jīng)是第五版本了。盡管各個(gè)版本有大大小小的Bug,但疵不掩暇,她還是贏得了廣大程序員和編程愛好者的追隨和愛戴。隨著2000年的逼近, Y2K的一系列問題和各種解決方案也就隨之提到日程上來。對(duì)編程者來說,我們現(xiàn)在關(guān)心的焦點(diǎn)是:Delphi系列有沒有Y2K問題呢?

---- 答案當(dāng)然是肯定的。從 Delphi4 起,Inprise 公司就在系統(tǒng)單元 Sysutils. pas(dcu)中增加了TwoDigitCenturyWindow 這一關(guān)鍵詞。它表示從當(dāng)前年份起加到兩位數(shù)的年份的數(shù)值,缺省為50(年),也就是說允許Y2K拖后50年才發(fā)生。可以這樣舉一簡(jiǎn)單的例子:

---- 當(dāng)前日期為 1999年,調(diào)用 FormatDatetime(LongdateFormat,'20-11-04') 為 2020年11月4日。而 FormatDatetime(LongdateFormat,'50-11-04') 卻為 1950年 11月4日 而不是 2050 年11月4日。

---- 因此,現(xiàn)在的Y2K問題方案只是在爭(zhēng)取時(shí)間,而沒有徹底解決. 理想的解答是到了 2000年,年份的輸入和表示應(yīng)該是4位數(shù),而不是兩位,這樣才能除去世紀(jì)之交的二義性。

---- 沿著這一思路 Delphi5中最重要的插件 MIDAS 3.X(多層分布式應(yīng)用服務(wù)),也是建立在這一時(shí)間差基礎(chǔ)之上的,它往往和 BDE 的Y2K 修正日期范圍聯(lián)系在一起。需要注意的是:運(yùn)行時(shí)(RTL)控件,Inspire 建議在日期多應(yīng)用場(chǎng)合,如出生登記,到期付款憑證等事務(wù)處理應(yīng)用時(shí),可根據(jù)自己的實(shí)際需要來設(shè)定(TwoDigitCenturyWindow) 這一初始值,最好實(shí)在窗口建立時(shí),及 OnCreate 事件里面設(shè)置。Inprise 建議用 100年的世紀(jì)窗口(the century window)(相對(duì)2000年以前),大部分程序員都喜歡這樣設(shè) TwoDigitYearCenturyWindow := CurrentYear - 1950。

---- 100年的世紀(jì)窗口(the century window)應(yīng)作如下解釋 :

---- 設(shè) TwoDigitCenturyWindow := 20,那么從現(xiàn)在起,時(shí)間支持是20年,其中80年應(yīng)為過去時(shí)間。如:當(dāng)前時(shí)間是 1999年,F(xiàn)ormatDatetime(LongdateFormat,'18-11-04') 為 2018年11月4日,超過了期限,FormatDatetime(LongdateFormat,'20-11-04') 為 1920年11月4日。

---- 在標(biāo)準(zhǔn)控件中,與日期輸入有關(guān)的插件是 TMaskEdit.及其派生的子類。TdateTimePicker 插件在沒有安裝最新的微軟 Visual Dev 6.0 以前,到了2000年2月29日時(shí),不能顯示正確的日期。另外由于操作系統(tǒng)的原因,COMCTL32.DLL如果不更新到 4.72.2106.4 版本(及以后),那么在 NT 4 或視窗 95 操作系統(tǒng)上,TdateTimePicker 將會(huì)用1752 替換所有的奇數(shù)。

---- 在數(shù)據(jù)庫控件中,漏斗和過濾(Filter)函數(shù)將 '00-1-1' 轉(zhuǎn)換到 ’1900-1-1', 在用 Locate 指令時(shí),'00-1-1' 到 '99-1-1'期間將被轉(zhuǎn)換成 '20XX-1-11','30-1-1' 到 '99-1-1' 期間將被轉(zhuǎn)換到 '19XX-1-1'.原因是 Locate 使用變數(shù)(variants)進(jìn)行定位,日期定位并被沒有通過 Delphi 的運(yùn)行時(shí)庫進(jìn)行,而是調(diào)用了 WIN32 API 函數(shù)轉(zhuǎn)換到日期類型。這是由于 OLE 自動(dòng)服務(wù)器對(duì)象的 OLE 字串轉(zhuǎn)換到日期類型的規(guī)則造成的。尤其是當(dāng)你調(diào)VarToDateTime 函數(shù)去試圖從一包含日期的字串分離出 TDateTime 類型時(shí)。一些數(shù)據(jù)庫操作在內(nèi)部使用變體來提取實(shí)際數(shù)據(jù),TDataset.Locate 和 Tparams 類將依照 OLE 變體轉(zhuǎn)換規(guī)則來實(shí)施具體操作,而非通過Delphi的"字串-日期"轉(zhuǎn)換過程。

---- 因此,Delphi IDE 環(huán)境和 DBExplorer 都在安裝時(shí)設(shè)定了50 年的世紀(jì)窗口,其設(shè)定對(duì)獨(dú)立運(yùn)行的 SQL Explorer.exe 也有效,在數(shù)據(jù)瀏覽時(shí)的"2-4"年份轉(zhuǎn)換都是這樣設(shè)定. 不過,這些值是可以修改的。IDE 的注冊(cè)表項(xiàng)為

"HKEY_CURRENTUSER\Software\Borland\Delphi\4.x\
Globals\TwoDigitYearCenturyWindow".
DBExplorer.EXE 的注冊(cè)表項(xiàng)為
"HKEY_CURRENTUSER\Software\Borland\Database Explorer\
2.x\DBXForm\TwoDigitYearCenturyWindow".

---- 如果將TwoDigitYearCenturyWindow變?yōu)?,那么 Delphi3、Delphi4、Delphi5 對(duì)日期的解釋都將一模一樣只處理兩位數(shù)年份。
---- J-MIDAS (Java Midas) 和 J-TClientDataSet 是依靠 JBUILDER 引擎對(duì)日期格式進(jìn)行解釋,所以對(duì)兩位數(shù)的年份,JBUILDER 只保留了 20 年的有效期。

---- 現(xiàn)在回頭來看一下 Delphi 3。由于先天不足,對(duì)仍還在使用他的程序員們來說,多少是有些失望。不過,如果進(jìn)行一番改造,再把 BDE 升級(jí)到 5.1 以上,或用 ADO 2.1 代替 BDE,還是可以正常在低檔機(jī)上披星戴月,披掛上陣。

----   我們先看一下 Delphi 3 中對(duì)年份處理的 EraToYear 函數(shù)。該函數(shù)返回一符號(hào)整形值。定義如下:

function EraToYear(Year: Integer): Integer;
begin
if SysLocale.PriLangID = LANG_KOREAN then
begin
if Year <= 99 then
Inc(Year, (CurrentYear + Abs
(EraYearOffset)) div 100 * 100);
if EraYearOffset > 0 then
EraYearOffset := -EraYearOffset;
end
else
Dec(EraYearOffset);
Result := Year + EraYearOffset;
end;

---- 我們看到,Delphi 對(duì) 2000 年并未加以考慮,其中 Year 獲取年份的后兩位。這樣的話,到了2000 年,日期將回到從前。故而,必須將此函數(shù)加以修改,以便使我們的日期轉(zhuǎn)換能通過2000 年。首先,按照 Delphi 一貫的兼容性做法,應(yīng)該在單元頭部聲明一 TwoDigitCenturyWindow 的 Byte 變量。在單元初試化時(shí)(initialization),把其附值為 50。其次,對(duì) EraToYear 做如下改動(dòng):
function EraToYear(Year: Integer): Integer;
begin
if SysLocale.PriLangID = LANG_KOREAN then
begin
if Year <= 99 then
Begin
if Year > TwoDigitYearCenturyWindow then
Inc(Year, (CurrentYear + Abs(EraYearOffset))
div 100 * 100)
else
Inc(Year, (2000 + Abs(EraYearOffset))
div 100 * 100);
end;
if EraYearOffset > 0 then
EraYearOffset := -EraYearOffset;
end
else
Dec(EraYearOffset);
Result := Year + EraYearOffset;
end;


---- 然后對(duì) ScanDate 函數(shù)做相應(yīng)的處理,以使其適應(yīng) 2000 年過度。
function ScanDate(const S: string; var Pos: Integer;
var Date: TDateTime): Boolean;
var
DateOrder: TDateOrder;
N1, N2, N3, Y, M, D: Word;
EraName : string;
EraYearOffset: Integer;

.....

begin
Y := 0;
M := 0;
D := 0;
Result := False;
DateOrder := GetDateOrder(ShortDateFormat);
EraYearOffset := 0;
if ShortDateFormat[1] = 'g' then
// skip over prefix text
begin
ScanToNumber(S, Pos);
EraName := Trim(Copy(S, 1, Pos-1));
EraYearOffset := GetEraYearOffset(EraName);
end
else
if AnsiPos('e', ShortDateFormat) > 0 then
EraYearOffset := EraYearOffsets[1];
if not (ScanNumber(S, Pos, N1) and ScanChar(S,
Pos, DateSeparator) and
ScanNumber(S, Pos, N2)) then Exit;
if ScanChar(S, Pos, DateSeparator) then
begin
if not ScanNumber(S, Pos, N3) then Exit;
case DateOrder of
if not ScanNumber(S, Pos, N3) then Exit;
case DateOrder of
doMDY: begin Y := N3; M := N1; D := N2; end;
doDMY: begin Y := N3; M := N2; D := N1; end;
doYMD: begin Y := N1; M := N2; D := N3; end;
end;
if EraYearOffset > 0 then Y := EraToYear(Y);

{ 在這里 Century Window 發(fā)揮作用 }
if Y <= 99 then
Begin
if Y > TwoDigitYearCenturyWindow then
Inc(Y, CurrentYear div 100 * 100)
else
Inc(Y, 2000);
end;
end else
.....


---- 由此,Delphi 3 已經(jīng)可以渡過 2000 年了,不過,Inprise 建議 Delphi 3 的版本為 3.02。如果是 3.0 極其以下(不支持 MIDAS 1.,X) 象Delphi 1.x(16位)、Delphi 2.x(32位)不如直接升級(jí)到 Delphi 4.02. 有條件的愛好者用 Delphi 5 就更好了。


標(biāo)簽:Delphi系列的Y2K問題 
主站蜘蛛池模板: 五月天激情婷婷 | 在线黄色毛片 | 亚洲黄色网址大全 | 日韩精品视频免费在线观看 | 青青国产线免观看手机版精品 | 香蕉欧美成人精品a∨在线观看 | 亚洲国产精久久久久久久 | 日本免费看片在线播放 | 日韩精品免费在线视频 | 四虎影视免费永久在线观看黄 | 在线国产91 | 综合自拍 | 天天澡天天碰天天狠伊人五月 | 日本不卡免费新一区二区三区 | 日本在线看免费 | 一本到视频在线观看 | 日本高清色本免费现在观看 | 手机在线成人精品视频网 | 青娱乐自拍 | 特a级黄色片 | 亚洲伦乱 | 亚洲免费在线观看 | 日韩专区欧美 | 人人公开免费超级碰碰碰视频 | 欧美一级欧美三级在线观看 | 天堂网在线资源 | 午夜免费入口 | 最近最新中文字幕1页 | 日操夜操 | 色久综合网 | 色伊人影院 | 日韩天堂网 | 亚洲人成网男女大片在线播放 | 日日噜噜噜夜夜爽爽狠狠 | 日韩免费精品一级毛片 | 亚洲国产成人久久综合野外 | 亚洲综合色一区 | 污视频在线免费 | 亚洲六月丁香婷婷综合 | 日本中文字幕在线观看 | 亚洲大片免费看 |