IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

Séparateur de dates et décimal avec Windows 7


Sujet :

Delphi

  1. #1
    Membre régulier
    Femme Profil pro
    Inscrit en
    Avril 2007
    Messages
    209
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2007
    Messages : 209
    Points : 93
    Points
    93
    Par défaut Séparateur de dates et décimal avec Windows 7
    Bonjour à tous,

    J'ai un petit problème avec Delphi 6 sous Windows 7. Lorsque je lis les valeurs de séparateur de date et de décimal via delphi de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Memo1.Lines.Add('DateSeparator : <'+DateSeparator+'>');
    Memo1.Lines.Add('DecimalSeparator : <'+DecimalSeparator+'>');
    Voici ce que j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    DateSeparator : </>
    DecimalSeparator : <,>
    Alors que dans mes paramètres régionaux, le séparateur de décimal est un point (Symbole décimal = '.') et le séparateur de date est également le point (Date courte = 'jj.MM.aaaa').

    Je devrais donc obtenir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    DateSeparator : <.>
    DecimalSeparator : <.>
    J'ai fait le test sous Windows XP et le résultat est correcte.

    Quelqu'un a-t-il déjà eu ce problème? si oui, comment lire les bons paramètres régionaux sans devoir forcer les valeurs au lancement de l'application? merci d'avance

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 423
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 423
    Points : 1 326
    Points
    1 326
    Par défaut
    Bonjour à toutes et à tous,

    @ Nono23, Le séparateur décimal pour un Windows français est par défaut la virgule quel que soit l'OS.

    A moins de forcer cette rêgle !

    @+,

    Cincap

  3. #3
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 967
    Points
    6 967
    Par défaut
    Citation Envoyé par cincap Voir le message
    Le séparateur décimal pour un Windows français est par défaut la virgule quel que soit l'OS.

    A moins de forcer cette rêgle !
    Ce paramètre est bien stocké dans les paramètres régionaux du poste, non ?
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  4. #4
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 423
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 423
    Points : 1 326
    Points
    1 326
    Par défaut
    @ guillemouze, ok j'avais déjà testé, mais si tu testes le code de Nono23 après avoir changé la langue puis la remettre, tu obtiens le même résultat dans le TMemo.

    DateSeparator : </>
    DecimalSeparator : <,>
    Edit avec Regedit :

    je pense que la valeur "sdecimal" existe dans la clé
    [HKEY_CURRENT_USER\Control Panel\International]
    @+,

    Cincap

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 423
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 423
    Points : 1 326
    Points
    1 326
    Par défaut
    Faut voir l'utilisation de Nono23.

    Sinon voici un petit test de lecture du Tmemo après le click du bouton "Change" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    type
      TForm1 = class(TForm)
        Memo1: TMemo;
        BMemo: TButton;
        BChange: TButton;
        procedure BMemoClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure BChangeClick(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    Const 
    {Séparateur décimal par défaut}
      DefaultDecimalSeparator = ',';
     
    Var
      OldDecimalSeparator: Char;
     
    {Mise à jour de la variable DecimalSeparator}
    Procedure GetDecimalSeparator;
    Begin
      DecimalSeparator := GetLocaleChar(GetThreadLocale, LOCALE_SDECIMAL, '.');
    End;
     
    {Change la valeur DecimalSeparator au niveau du système}
    Function SetDecimalSeparator(Const DecimalChar: Char = DefaultDecimalSeparator): Boolean;
    Var Buffer : Array[0..1] Of Char;
    Begin
      Buffer[0] := DecimalChar;
      Buffer[1] := #0;
      Result := SetLocaleInfo(GetThreadLocale, LOCALE_SDECIMAL, Buffer);
      {Force la mise à jour de la variable DecimalSeparator}
      GetDecimalSeparator;
    End;
     
    procedure TForm1.BMemoClick(Sender: TObject);
    begin
     
    Memo1.Lines.Add('DateSeparator : <'+DateSeparator+'>');
    Memo1.Lines.Add('DecimalSeparator : <'+DecimalSeparator+'>');
    end;
     
    procedure TForm1.BChangeClick(Sender: TObject);
    begin
    If DecimalSeparator = DefaultDecimalSeparator Then
        SetDecimalSeparator('.')
      Else
        SetDecimalSeparator(DefaultDecimalSeparator);  
    end;
     
    Initialization
      OldDecimalSeparator := DecimalSeparator;
     
    Finalization 
      {Avant de quitter on remet la variable comme on l'a trouvée} 
      SetDecimalSeparator(OldDecimalSeparator);
     
    end.
    A la fermeture de l'application on remet les valeurs par défaut.

    A réaliser avec DateSeparator de la même façon.

    @+,

    Cincap

  7. #7
    Membre régulier
    Femme Profil pro
    Inscrit en
    Avril 2007
    Messages
    209
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2007
    Messages : 209
    Points : 93
    Points
    93
    Par défaut
    OH lala, que de réponses. Merci d'avance à tous.

    Mon problème était identique au bug présenté par guillemouze à la page http://www.developpez.net/forums/d97...s/#post5482994

    Il m'a suffit de passer le format en anglais, d'appliquer les changements, puis de repasser en français et le tour est joué, le séparateur de date est un point et le séparateur de décimal est également un point.

    c'est apparemment un bug connu des applications Delphi avec Windows7. A retenir

    Merci à tous pour vos recherches et vos réponses très précieuses

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 423
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 423
    Points : 1 326
    Points
    1 326
    Par défaut
    @ Nono23, même en retestant ton code après le changement :

    Memo1.Lines.Add('DateSeparator : <'+DateSeparator+'>');
    Memo1.Lines.Add('DecimalSeparator : <'+DecimalSeparator+'>');
    J'ai D6 et Seven 64bits et cela ne fonctionne pas en changeant la langue.

    Maintenant faut voir quelle était l'utilisation qui posait problème.

    @+,

    Cincap

    P. s, si cela te convient, "Résolut"

  9. #9
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    petite remarque supplémentaire et un peu hors sujet,
    ce que je fais, c'est utiliser un TFormatSettings plutot que modifier les decimalSeparator, ShorDateFormat, ... (car modifier ces valeurs peut etre annulé automatiquement quand windows envoie un message WM_WININICHANGE ou un truc dans le genre, ce qui ne se produit pas seulement quand on modifie les parametres regionaux).
    Un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    var
      fs: TFormatSettings;
    ...
    procedure XXX;
    begin
      ...
      maChaine := Format('%f', [monFloat], fs);
      ...
    end;
    ...
    initialization
      GetLocalFormatSettings(..., fs);
      fs.DecimalSeparator := '.';

  10. #10
    Membre régulier
    Femme Profil pro
    Inscrit en
    Avril 2007
    Messages
    209
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2007
    Messages : 209
    Points : 93
    Points
    93
    Par défaut
    @CinCap : En fait, j'ai tout changé, la langue d'entrée (Clavier et langue) et surtout le format des données (Onglet format dans les options de date et langue) et sans rien changer à mon code, ni au configuration "Séparateur de date" ou "Séparateur de décimal", le résultat est juste, les bonnes valeurs sont lues ("." pour séparateur de date et de décimal)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. pb de date avec windows xp service pack2
    Par passion_info dans le forum Windows XP
    Réponses: 3
    Dernier message: 21/09/2006, 15h41
  2. [CR8] Problème de décimales avec Centura
    Par ccquick dans le forum SAP Crystal Reports
    Réponses: 13
    Dernier message: 05/10/2004, 10h46
  3. QueryString avec window.Open ??
    Par christine dans le forum ASP
    Réponses: 4
    Dernier message: 29/08/2003, 09h27
  4. Réponses: 4
    Dernier message: 23/07/2003, 13h07
  5. ADSI avec windows 2000
    Par alex2205 dans le forum Windows Serveur
    Réponses: 2
    Dernier message: 25/03/2003, 16h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo