2010-11-17 36 views
3

Ceci est une suite de that question.Ce qui peut empêcher VarDateFromStr d'utiliser les paramètres régionaux de l'utilisateur en cours lorsque VAR_LOCALE_USER_DEFAULT est fourni en tant qu'argument

Comme demandé, ce qui peut rendre VarDateFromStr (à partir de Oleaut32.dll) ne parvient pas à utiliser les paramètres régionaux de l'utilisateur actuel lorsque VAR_LOCALE_USER_DEFAULT est fourni en tant qu'argument?

Notre application a rencontré un certain nombre de problèmes à cause de cela.

Sur les systèmes avec le problème, si nous exécutons le code suivant:

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; 

avec Label28 commençant par une légende de « 11-05-2010 », la légende alterne de 11-05-2010 à 05-11-2010 entre chaque appel.

Sur le système donné, GetLocaleStr (GetThreadLocale, LOCALE_SSHORTDATE, 'm/d/yy') retourne "dd-MM-AAAA" (Le format de date courte pour l'utilisateur actuel)

Le problème se produit sur Windows XP SP3. (Bien que notre application ne soit utilisée sur aucune autre version du système d'exploitation, je ne peux pas dire si elle est spécifique à cette version). Ma première pensée est que cela pourrait être lié à la sécurité (la sécurité de l'utilisateur est hermétique), mais je n'ai pas pu le prouver pour le moment.

+0

Je rencontre exactement le même problème avec un TParameter.Value ADO (TADODataSet.Parameters.ParamByName(). Value). Si vous avez trouvé une solution, j'apprécierais grandement que vous puissiez répondre à votre propre question. :) –

Répondre

-1

La réponse probable est que les paramètres régionaux par défaut de l'utilisateur ne sont pas des IDc supportés pour votre instance O/S particulière.

La solution de contournement est simple: n'utilisez pas de variantes laides. Essayez plutôt DateTimeToString. P.S. Aide également à spécifier votre version de Delphi.

+0

Si quelqu'un cherchant une réponse pourrait utiliser une routine Delphi RTL pour formater la date et l'heure, j'espère qu'ils ne seraient pas venus à SO pour poser la question. La solution de contournement n'est pas si facile lorsque vous travaillez avec du code de bibliothèque qui utilise des variantes et appelle VarBStrFromDate sans même que vous le sachiez. Nous avons actuellement le même problème parce que TParameter.Value d'ADO (dbGo) est une variante. –

+0

Dans notre cas, bien que TVarData (Value) .VType révèle que la variante n'est pas une chaîne, la date de la variante est convertie en chaîne avant d'être affectée à un TDateTime. La chaîne convertie ne correspond pas aux paramètres régionaux de l'utilisateur, et nous obtenons donc une erreur de conversion en essayant de convertir l'OleStr en retour en double (TDateTime). Il semble étrange que le moyen idéal de convertir une valeur de date/heure en TDateTime soit de la convertir en une chaîne puis de la renvoyer en double. –