2010-11-17 44 views
3

這是從that question開始的後續操作。當VAR_LOCALE_USER_DEFAULT作爲參數提供時,什麼使VarDateFromStr無法使用當前用戶的區域設置

問:當VAR_LOCALE_USER_DEFAULT作爲參數提供時,VarDateFromStr(來自Oleaut32.dll)無法使用當前用戶的Locale?

因爲這個,我們的應用程序遇到了很多問題。

在具有問題的系統中,如果我們執行以下代碼:

procedure TForm1.Button3Click(Sender: TObject); 
var V : Variant; 
    dte : TDateTime; 
begin 
    V := Label28.Caption; 
    dte := VarAsType(V,varDate) ; //Implicitly calls VarDateFromStr 
    V := dte; 
    Label28.Caption := V; //Implicitly calls VarBStrFromDate 
end; 

與Label28開始的「2010年11月5日」的字幕,字幕會從2010年11月5日的替代品每次通話之間爲05-11-2010。

在給定的系統,GetLocaleStr(GetThreadLocale,LOCALE_SSHORTDATE, 'M/d/YY')返回 「DD-MM-YYYY」(當前用戶的短日期格式)在WinXP

的問題發生SP3。 (雖然我們的應用程序沒有用於任何其他操作系統版本,但不能說它是否特定於該版本)。

我最初的想法是它可能與安全有關(用戶的安全性是不透氣的),但我還不能證明它。

+0

我與ADO TParameter.Value(TADODataSet.Parameters.ParamByName()Value)具有完全相同的問題。如果你找到了解決方案,如果你能回答你自己的問題,我將不勝感激。 :) – 2012-10-09 22:38:15

回答

-1

可能的答案是用戶的默認語言環境不是您的特定o/s實例支持的lcid。

解決方法很簡單 - 只是不使用醜陋的變體。嘗試使用DateTimeToString。 P.S.也有助於指定你的Delphi版本。

+0

如果有人在尋找答案可以使用德爾福RTL例程格式化日期/時間,我希望他們不會來問這個問題。當您使用使用變體的庫代碼並且在您不知道的情況下調用VarBStrFromDate時,解決方法並不那麼容易。我們目前遇到同樣的問題,因爲ADO(dbGo)的TParameter.Value是一個變體。 – 2012-10-09 22:35:25

+0

在我們的例子中,雖然TVarData(Value).VType顯示變體不是字符串,但變體日期在被分配到TDateTime之前轉換爲字符串。轉換後的字符串與用戶的語言環境不匹配,因此我們會嘗試將OleStr轉換回double(TDateTime)時發生轉換錯誤。將一個不同的日期/時間值轉換爲TDateTime的理想方法是將其轉換爲字符串,然後再轉換爲double。 – 2012-10-09 22:35:54

相關問題