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

Langage Delphi Discussion :

Transformer le point du pavé numérique en virgule


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 57
    Points : 53
    Points
    53
    Par défaut Transformer le point du pavé numérique en virgule
    Bonjour,

    j'utilise le code suivant pour que l'appuie sur la touche "point" du pavé numérique renvoie la "virgule" dans le composant TApplicationEvents dans l'évenement "OnMessage":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      if msg.message = WM_KEYDOWN then
      begin
        // forcage de la virgule pour le "point" du pavé numérique !!!
        if (Msg.wParam = VK_DECIMAL) and (DecimalSeparator = ',') then
        begin
          Msg.wParam := 188; // virgule
        end;
      end;
    Cela fonctionne bien si le clavier est en mode "minuscule", en revanche en mode "majuscule" il affiche le "?" au lieu de la virgule...

    Comment gérer cela quand le clavier est en mode majuscule ?

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 695
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 695
    Points : 13 133
    Points
    13 133
    Par défaut
    Pour moi, le test avec un TEdit fonctionne dans les deux cas

    Le problème est peut être à chercher du coté de la gestion à la destination plutôt qu'à la source. Il y a peut-être un test sur GetKeyboardState qui se comporte mal avec le CapsLock toggled.

    Dans tous les cas, je suis d'accord avec toi qu'il n'est pas admissible que le TEdit (ou peut-être d'autres composants) ne tienne pas compte de la localisation interne à l'application.

    Maintenant, si le problème se pose, c'est que ton soft va s'exporter à l'extérieur de la France (ou de l'Allemagne ). Sache qu'il n'y a rien de plus désagréable pour un utilisateur final que de se retrouver avec une "," alors qu'il attend un ".". (Source de questions inutiles au support technique pour un utilisateur qui ne sera de toute façon pas content de la réponse )

    Si tu le peux, il est préférable de laisser la localisation telle qu'elle est et de forcer l'écriture dans (et la lecture depuis) les fichiers dans un format précis. Les routines standards sur des réels acceptent un paramètre FormatSettings (ex. StrToFloat)

  3. #3
    Membre du Club Avatar de ddubois
    Profil pro
    Inscrit en
    Février 2005
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 111
    Points : 47
    Points
    47
    Par défaut
    Dans OnKeypress je met

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if StringGrid1.Col > 1 then begin
          if not (Key in [#8, #13, '0'..'9', ',', '.']) then Key := #0;
          if Key = '.' then Key := ',';
          if Key <> #0 then
            inherited KeyPress(Key);
      end;
    Ca marche en minuscule et majuscule.

    Denis

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Je me suis heurté au même problème, lorsque le Caps Lock est actif, l'appui sur la virgule renvoie un point d'interrogation, et c'est logique.

    J'ai trouvé cette manière de faire, c'est pas forcément le plus élégant, mais ça fonctionne:

    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
    if (Msg.message = WM_KEYDOWN) and
           (Msg.wParam  = VK_DECIMAL) and
           (DecimalSeparator = ',') then
        begin
           if Odd(GetKeyState(VK_CAPITAL)) then                     // Caps Lock actif; il faut simuler l'action de Maj+, sinon, on obtient un '?'
           begin
              keybd_event(VK_SHIFT,0,0,0);                          // Shift Down
              keybd_event(VkKeyScan(DecimalSeparator),0,0,0);       // ',' Down
              keybd_event(VkKeyScan(DecimalSeparator),0,2,0);       // ',' Up
              keybd_event(VK_SHIFT,0,2,0);                          // Shift Up
              Handled := True;
           end
           else                                                     // Caps Lock inactif, l'envoi de la VK_KEY ',' est suffisant
              Msg.wParam := 188;
        end;
    Le truc est de d'envoyer un Maj+virgule lorsque le Caps Lock est actif.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 141
    Points : 142
    Points
    142
    Par défaut
    Salut,

    Moi je transformerais carrément le message en WM_CHAR :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     if msg.message = WM_KEYDOWN then
      begin
        // forcage de la virgule pour le "point" du pavé numérique !!!
        if (Msg.wParam = VK_DECIMAL) and (DecimalSeparator = ',') then
        begin
          Msg.message := WM_CHAR;
          Msg.wParam := 44; // carcatère virgule (je ne suis pas sûr du codage, à vérifier...)
        end;
      end;
    Il faut cependant vérifier que ça ne pose pas de problème avec la suite de la boucle de traitement des messages, peut-être intercepter aussi le KeyUp qui viendra après...

    Pour tout savoir sur le traitement des messages clavier sous Windows et en Delphi, je (re)recommande l'article
    http://dn.codegear.com/article/38447

    A la fin de cet article il y a un résumé du processus de traitement d'un message, qui vous dira plein de chose sur où et quand traiter quoi.

    Ce que tu cherches à faire a l'air de correspondre au boulot de la fonction TranslateMessage, mais je ne suis pas bien sûr d'avoir compris le rôle de cette fonction, ni s'il y a des moyens de la surcharger.

    *LeGEC*
    *LeGEC*

Discussions similaires

  1. [AC-2010] Problème virgule et point sur pavé numérique
    Par titisoft43 dans le forum Access
    Réponses: 1
    Dernier message: 04/08/2014, 17h24
  2. Virgule au lieu de point sur pavé numérique
    Par blaame dans le forum SAP
    Réponses: 1
    Dernier message: 20/02/2011, 16h28
  3. Réponses: 6
    Dernier message: 06/01/2010, 14h48
  4. Réponses: 0
    Dernier message: 20/03/2009, 11h44
  5. [OpenOffice] le point du pavé numérique ne s'affiche pas
    Par sidahmed dans le forum OpenOffice & LibreOffice
    Réponses: 2
    Dernier message: 27/08/2007, 16h45

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