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 :

différencier entre clavier et lecteur code à barres


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut différencier entre clavier et lecteur code à barres
    Bonjour à tous,

    Mon problème est tout simple, comment savoir dans un onkeydown d'un Tdbgrid le périphérique transmetteur clavier ou lecteur code à bar.

  2. #2
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    Citation Envoyé par chekkal Voir le message
    Bonjour à tous,

    Mon problème est tout simple, comment savoir dans un onkeydown d'un Tdbgrid le périphérique transmetteur clavier ou lecteur code à bar.
    Bonsoir,

    Dans l'événement "onkeydown " du DBGrid qu'est-ce que tu fais exactement? Une recherche du code bar,...?

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut
    Bonjour,

    je fait une recherche par rapport à la variable key de l'evenement , le probléme c'est comment savoir qui est le transmetteur de la valeur.

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    sauf à configurer la douchette de façon à rajouter un préfixe à la saisie (P.S. je ne me souviens pas s'il y a la possibilité de mettre un suffixe) , préfixe qu'il faudra traiter bien évidement pour obtenir la valeur, il n'y a pas vraiment de solution. Pour donner un exemple : soit un code barre ean13 en saisie manuelle on tapera les 13 chiffres, si la douchette envoi l'information, et que celle-ci est configurée de façon à avoir un préfixe='A' on obtient de cette dernière 14 caractères.

    Problème : la taille de la zone saisie doit être de 14 et non de 13.

    une solution autre serait de tester le temps de saisie, il est évident que la lecture codebarre sera toujours plus rapide (remplissage instantané) que la saisie manuelle, le temps entre le onchange et le keypress=#13 pourrait servir de calcul ?

    [Edit]
    (P.S. je ne me souviens pas s'il y a la possibilité de mettre un suffixe)
    c'est le cas pour le modèle eclipse ms5145, on peut mettre jusqu'à 7 caractères en plus soit en préfixe soit en suffixe manuel de configuration page 43
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Cette détection n'est pas possible dans les événements Delphi, il faut descendre à plus bas niveau et le faire par Raw Input. La structure retournée par WM_INPUT contenant le handle du device, on connait la source. Un exemple ici.

  6. #6
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    La 1ère solution est celle proposée par Andnotor WM_INPUT


    Je pense que la solution la plus simple est de tester le temps de saisi du code barre et du clavier : comme a dit Sergio, le code barre fait une saisi plus rapide que le clavier bien sûr.
    ça peut se faire avec un Timer et un TEdit.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TForm1.timerResetTimer(Sender: TObject);
    begin
    edit1.Text := '';
    end;
     
    procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
    begin
    timerReset.Enabled := False;
      timerReset.Enabled := True;
      if Key = #13 then
        if edit1.Text <> '' then
          ShowMessage(edit1.Text);
    end;
    Timer interval réglé à 1 seconde(1000).
    Pour remplir le Edit1, la douchette met moins d'une seconde par contre la saisie manuelle avec le clavier ça va prendre plus d'une seconde.
    - Si le temps de saisie est inférieur à 1 seconde => douchette.
    - Si le temps de saisie est supérieur à 1 seconde => clavier.


    La 3e solution est d'écouter un scanner de code barres sur le port usb.

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut
    Bonjour ,

    Pour donner un exemple : soit un code barre ean13 en saisie manuelle on tapera les 13 chiffres, si la douchette envoi l'information, et que celle-ci est configurée de façon à avoir un préfixe='A' on obtient de cette dernière 14 caractères.

    Problème : la taille de la zone saisie doit être de 14 et non de 13.
    13 chiffres seulement pour les code à bar prédefinis, mais il ya les codes personalisées qui peuvent avoir des tailles variables.

    Timer interval réglé à 1 seconde(1000).
    Pour remplir le Edit1, la douchette met moins d'une seconde par contre la saisie manuelle avec le clavier ça va prendre plus d'une seconde.
    - Si le temps de saisie est inférieur à 1 seconde => douchette.
    - Si le temps de saisie est supérieur à 1 seconde => clavier.
    pas toujours exacte, exemple , essaye de saisir ce code '11',ça prend même pas une seconde.

    je vai essayé l'exemple de @andnotor et je vous tiens au courant

  8. #8
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    Citation Envoyé par chekkal Voir le message
    pas toujours exacte, exemple , essaye de saisir ce code '11',ça prend même pas une seconde.
    '11' c'est pas un code barre... Logiquement un code barre saisit manuellement va prendre sûrement plus d'une seconde non?...

    Dans l'exemple que j'ai proposé, 1 seconde était à titre d'exemple seulement. Tu peux régler ton Timer à 100 ou comme tu veux.
    Enfin c'est à toi de voir.

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par chekkal Voir le message
    13 chiffres seulement pour les code à barres prédéfinis, mais il y a les codes personnalisées qui peuvent avoir des tailles variables.
    je donnais un exemple, pas une généralité
    pas toujours exact, exemple , essaye de saisir ce code '11',ça prend même pas une seconde.
    Tester sur le temps de saisie est effectivement plus aléatoire
    je vais essayé l'exemple de @andnotor et je vous tiens au courant
    en tout cas cela m'a mis sur une piste en ce qui concerne les pc-tablettes : "clavier présent ou non ?" telle était une des questions qui me trottait dans la tête)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    en tout cas cela m'a mis sur une piste en ce qui concerne les pc-tablettes : "clavier présent ou non ?" telle était une des questions qui me trottait dans la tête)
    Raw Input te dira si la touche provient d'un clavier physique ou si elle est simulée mais pas si un clavier est connecté.
    Mais c'est souvent mieux que de tester la présence du clavier. Tu pourrais être sur ton divan, tablette sur les genoux avec ton clavier bluetooth reposant à quelques mètres de toi. Tu ne l'utilises pas mais il est in-range et donc connecté

    C'est d'ailleurs le principe Windows 8+, le panneau de saisie apparaît normalement mais disparaît à l'appui sur une touche physique.

    Ça pourrait faire l'objet d'un autre sujet

  11. #11
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut
    Bonjour,

    J'ai testé l'exemple mais il signale que l'unité "JwaWinUser" n'existe pas, ou je peut la trouvé?

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128

  13. #13
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut
    Bonjour,

    J'ai installé la librairie et l'exemple que tu ma donné s’exécute mais il répond pas à ma question, il permet de lister les périphériques existants ou peut être j'ai mal compris?

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    L'exemple provient d'une discussion sur la désactivation pure et simple d'un élément mais le principe reste le même.
    Il faut bien lister l'existant pour savoir à quoi se rattache le hDevice.

  15. #15
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut
    Bonjour,

    On étudiant un peu plus l'exemple que tu m'a donné, j'ai relevé cette procedure qui peut répondre à ma question
    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
    procedure TForm1.WMInput(var Message :TMessage);
    var
      Data :PRawInput;
      Size :dword;
      i    :integer;
     
    begin
      Message.Result := 1;
     
      if Assigned(ActiveControl) then
      begin
        GetRawInputData(Message.LParam, RID_INPUT, nil, Size, SizeOf(TRawInputHeader));
        GetMem(Data, Size);
     
        if GetRawInputData(Message.LParam, RID_INPUT, Data, Size, SizeOf(TRawInputHeader)) = Size then
        begin
          //Est-ce un clavier ?.. (ça devrait, mais pour être sûr !)
          if Data.header.dwType = RIM_TYPEKEYBOARD then ////ici 
          begin
            //...oui. Ce handle est dans notre liste ?..
            i := CheckListBox1.Items.IndexOfObject(pointer(Data.header.hDevice));
     
            //...oui. Est-il coché ?..
            if (i > -1) and CheckListBox1.Checked[i] then
            begin
              //...oui => Traitement du WM_KEYDOWN
              if Data.keyboard.Message = WM_KEYDOWN then
                ActiveControl.Perform(WM_CHAR, Data.keyboard.VKey, 0);
     
              Message.Result := 0;
            end;
          end;
        end;
      end;
    end;
    maintenant comment la modifier?

Discussions similaires

  1. connexion entre lecteur Code barres et Access
    Par yassineos19 dans le forum Access
    Réponses: 3
    Dernier message: 03/02/2012, 11h24
  2. Identifier clavier/lecteurs codes barres
    Par Alikendarfen dans le forum Développement Windows
    Réponses: 1
    Dernier message: 01/05/2011, 14h17
  3. Réponses: 6
    Dernier message: 28/07/2010, 19h05
  4. Lecteur code barre et Access 2000
    Par DMboup dans le forum Access
    Réponses: 11
    Dernier message: 17/06/2006, 14h05
  5. [HARDWARE] [Conseil] Lecteur code barre
    Par Ni(o dans le forum Périphériques
    Réponses: 4
    Dernier message: 22/06/2004, 19h14

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