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

WinDev Discussion :

Récupérer ce qui est lu par un lecteur code barre USB dans toute une fenêtre


Sujet :

WinDev

  1. #1
    Candidat au Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juillet 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juillet 2015
    Messages : 11
    Points : 3
    Points
    3
    Par défaut Récupérer ce qui est lu par un lecteur code barre USB dans toute une fenêtre
    Bonjour,

    C'est la première fois que je poste, s'il vous plaît, soyez indulgent ;-)

    J'ai un code barre du type F9999-999
    Dans une fenêtre, à chaque fois que je scanne ce code barre, avec un lecteur code barre USB/PS2, j'aimerai remplir 2 cases (une case avec F9999 et l'autre avec 999) et exécuter le code de sortie de ces 2 cases.
    Pas de soucis, si je suis dans la 1ère case, cela rempli bien mes 2 cases.
    Mais j'aimerai que cela le fasse quand je suis dans n'importe quelle case de ma fenêtre, afin de réinitialiser mon écran avec ces nouvelles données scannées.

    J'ai un début de solution en faisant commencer mon code barre par µµ par exemple, puis F9999-999.
    Le fait de mettre µµ je forcerai avec un RepriseSaisie à aller dans la 1ère case puis de rempli mes 2 cases.
    Mais cela inscrit µµ dans la case où je me trouve...

    Dans une discussion de mail.spam :
    http://www.developpez.net/forums/d11...b-usb-clavier/
    je pense qu'il répond en grande partie à mon problème, mais j'ai du mal à appliquer sa solution car les "µµ" s'affiche chez moi

    Il y a surement une solution plus simple, mais je ne sais pas par quel bout le prendre.
    Donc s'il y a une personne qui a une idée, je suis preneur

    Merci

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Une autre solution serait de paramétrer la douchette pour qu'elle envoi la "lettre d'appel" de ton premier champ de saisie, par exemple F12.
    Ainsi la lecture d'un code barre provoquera l'entrée dans le champ de saisie.

    Mais je ne suis pas fan de ce genre de solution. Imagine que l'utilisateur est dans un autre champ de saisie, qu'il scanne un code barre et que le code de sortie du champ affiche un message demandant une confirmation.
    Que se passe t'il ? Le message est validé "automatiquement", sans que l'utilisateur n'ai le temps de le lire.

    Tatayo.

  3. #3
    Candidat au Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juillet 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juillet 2015
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Bonjour Tatayo,

    Tout d'abord merci pour ta réponse rapide.
    Et tu as raison, il risque d'avoir des messages d'info.

    Le code barre est en EAN 128 et je ne sais pas comment imprimer le F12 en code barre.
    Même mon "µ" imprimé en code barre, me donne un autre code ascii quand je le lis avec le scanner.
    Cela doit s'expliquer car le code ascci de "µ" est supérieur à 128.

    Je tente avec "#" imprimé en 1er sur le code barre. "#" me renvoie un code ASCII de 17, ce qui est bizarre car son code ascci devrait être 35 (surement mauvais paramétrage de mon scanner) ??

    Le "#" me permet bien d'aller dans la 1ère case avec un RepriseSaisie(), mais il s'affiche dans la 1ère case.

    Il faudrait que "#" soit zappé.
    Avec la fonction Evénement(), je pense que cela est possible, mais l'aide de Windev sur cette fonction ne me paraît pas très claire.
    D'habitude cette dernière est super bien documentée, mais là il me manque la liste des code pour les différents message Windows, ou que représente exactement wParam, lParam dans la procédure de l'exemple PROCEDURE EveClicDroit(Message, wParam, lParam)...
    Je continue à chercher mais si vous avez des liens intéressant, je vous en remercie d'avance.

  4. #4
    Candidat au Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juillet 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juillet 2015
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Autant pour moi, la liste des événements Windows est dans l'aide de Windev dans : Valeur des constantes de l'API Windows 32 bits

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Il ne faut pas imprimer de code supplémentaire dans le code barres (surtout avec un EAN13 !), mais paramétrer le lecteur pour ajouter un préfixe.
    Je viens d'essayer dans une fenêtre (en 19), j'ai deux champ de saisie: la lettre d'appel du deuxième est u (sans modificateur).
    Quand je suis en saisie dans le premier champ, dès que j'appuie sur u je me retrouve dans le deuxième champ, et le u n'apparait pas.
    Par contre si je suis déjà dans le champ, le u apparait bien.

    Donc je dirai qu'il faut ajouter un caractère bien précis en préfixe, qui est accepté par WinDev comme lettre d'appel.
    Ensuite dans la section "à chaque modification" ou "en sortie de champ" du champ de saisie, tu vérifies si le premier caractère saisie est celui-ci, et le cas échéant tu le supprimes.

    Tatayo.

  6. #6
    Candidat au Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juillet 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juillet 2015
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Bonjour Tatayo

    Super sympa pour les tests !

    Je ne peux pas faire de préfixe car le scanner me sert à lire d'autres code barre tout simple (1 code barre, 1 case) dans d'autres fenêtres.

    Et vu que mon code barre a déjà une structure bizarre, je peux le rendre encore plus bizarre :-)

    J'ai une solution qui n'est pas "propre" du tout, mais qui à l'air de fonctionner :

    1°) Dans tous les champs de la fenêtre : j'ajoute, dans le code du Touche enfoncée, la procédure Lit_Code_Barre :

    Procédure Lit_Code_Barre()
    VL_Touche est un caractère
    VL_Code_Ascii est un entier

    VL_Touche=Caract(_EVE.wParam) // Récupère la touche qui est enfoncée
    VL_Code_Ascii=Asc(VL_Touche) // Récupère le code ASCII de la touche enfoncée

    SI VL_Code_Ascii=17 ALORS // Si la touche enfoncée est # (bizarrement 17 est le code qui est renvoyé quand je lis le code barre de "#"...)
    RepriseSaisie("Saisie_1_LETTRE") // Saisie_1_LETTRE est un champ de saisie qui a comme masque de saisie 1 lettre et dont la fin de saisie automatique est cochée
    FIN

    Donc le "#" est écrit dans le champ Saisie_1_LETTRE et dans l'ordre de navigation de la fenêtre, ma 1ère case est la case suivante, ce qui écrit F9999 dans la 1ère case (sans "#") et écrit -999 dans la 2ème case.

    J'aurai préféré mettre un Evenement() sur toute la fenêtre, mais j'ai franchement du mal à faire fonctionner cette procédure.
    Donc s'il a une âme charitable qui pourrait me donner le code pour et surtout où le mettre dans la fenêtre, mon code serait plus rapide et plus propre et cela me permettrait de mieux comprendre cette procédure.

    Quand j'aurai fini de faire ma fenêtre, si je ne trouve pas de contrainte, je mettrai la discussion comme résolu.
    Et encore un grand merci à Tatayo

  7. #7
    Candidat au Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juillet 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juillet 2015
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Enfin, je pense avoir trouver le bon bout

    Dans la déclaration globale de la fenêtre

    //// Déclaration de l'événement
    Evénement(Lit_Code_Barre, MaFenêtre..Nom + ".*", WM_KEYDOWN)


    A priori cela fonctionne de partout dans la fenêtre, même si le focus est sur un bouton

  8. #8
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2014
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2014
    Messages : 69
    Points : 128
    Points
    128
    Par défaut
    Bonjour,

    L'utilisation d'un préfixe sur la douchette aurait été plus souple mais on peut gérer l’événement en champ de saisie sur la fenêtre
    Exemple :

    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
     
    //Déclaration globale de fenetre 
    //-------------------------------
     
    nEvenementCB est entier = -1
     
    constant
        WM_SETFOCUS  = 7
    FIN
     
    //Prise de focus
    //-------------------------------
    SI nEvenementCB =-1 ALORS nEvenementCB =Evénement("ProcedureCB",".*",WM_SETFOCUS)
     
     
    //Perte de focus
    //-------------------------------
    SI nEvenementCB <>-1 ALORS
         FinEvénement(nEvenementCB )
        nEvenementCB  = -1
    FIN
     
    // Fermeture de la fenetre
    //-------------------------
     
    SI nEvenementCB <>-1 ALORS FinEvénement(nEvenementCB )
    Reste à écrire la procédure "ProcedureCB" du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    PROCEDURE ProcedureCB()
    SELON {_EVE.nom,indChamp}..Type
    	CAS typTexte
    		SI _EVE.wMessage=WM_SETFOCUS ALORS
                           <TRAITEMENT>
    		FIN
          fin

  9. #9
    Candidat au Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juillet 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juillet 2015
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Bonjour JG_33,


    Merci beaucoup pour ton code, cela fait plaisir d'être suivi et épaulé !

    Si j'ai bien compris le but du code est de remplacer mon champ de saisie "1 lettre" par l’événement. Ce qui serait un codage plus "fin" que le mien.

    1ère remarque : tu as raison il vaut mieux enlever l'événement si on perd le focus de la fenêtre et le relancer quand on le reprend.

    2ème remarque/queston : A quoi correspond exactement le chiffre 7 dans WM_SETFOCUS=7

    3ème question : Je reconnais avoir du mal à saisir ce qu'est _EVE...
    Donc dans ta procédure "ProcedureCB"
    voici ce que comprend :
    SELON le type de l'évènement // Mais que vient faire indChamp ?? Je pensais que l'événement regardait à chaque fois que l'on appuyait sur une touche, non ???
    CAS où c'est du texte
    SI _EVE.wMessage=WM_SETFOCUS ALORS // enfin ici c'est très flou pour moi


    Je pense ne pas comprendre exactement la définition de l'événement et sa mise en pratique,
    si tu pouvais m'expliquer un peu plus en détail comment tu as manipulé l'événement pour qu'il remplace mon champ de saisie, je me sentirai plus à l'aise avec les événements.

  10. #10
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2014
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2014
    Messages : 69
    Points : 128
    Points
    128
    Par défaut
    Bonjour,


    J'utilise le multi fenêtrage, c'est pourquoi je désactive l’événement en perte de focus pour éviter d'éventuels problèmes.

    L’événement WM_SETFOCUS est l'événement de prise de focus du champ lorsque le curseur entre dans la zone de sasie. J'ai pensé qu'il était le plus adapté à ta situation, mais c'est à tester.

    En réalité dans mes applications j'utilise un préfixe sur la douchette et j'utilise l’événement WM_CHAR qui est la saisie d'un caractère (WM_CHAR = 258) L’événement se déclenche dès qu'un caractère est saisi dans la fenêtre.Ca ne gène absolument pas la saisie.

    Dans ma procédure je teste si la valeur saisie est égale à mon préfixe douchette
    SI _EVE.wParam=Asc(gcPrefixeDouchettte) ALORS
    .....

    - Mais que vient faire indChamp ??
    Il s'agit d'une indirection (voir doc windev), _EVE.nom renvoie le nom du champ, comme une variable.Pour tester le type du champ contenu dans _EVE.nom et non pas le type de _EVE.nom, il faut utiliser l'indirection.

    Ci dessous le code de ma procédure avec utilisation d'un préfixe. Je n'ai pas besoin de tester le type de champ
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     // 
    SI _EVE.wParam=Asc(gcPrefixeDoucheCB) ALORS
     
       // zonecodebarrre est un champ de saisie texe invisible par défaut, de 13 caractères avec sortie automatique
    	ZONECODEBARRE..Etat=Actif; ZONECODEBARRE..Visible=Vrai
    	ZONECODEBARRE=""
           // Le contenu de la douchette est automatiquement redirigé vers zonecodebarre grace à reprisesaisie
           //Le code barre ayant 13 caractères, le code de sortie de zonecodebarre est exécuté.C'est ce code qui recherche l'article,  l'affiche , 
           // et rend  à nouveau le champ zonecodebarre invisible
    	RepriseSaisie(ZONECODEBARRE)
     
    	_EVE.Retour=0
    FIN
    Cordialement

  11. #11
    Candidat au Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juillet 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juillet 2015
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Bonjour JG_33,

    Excuse pour ma réponse un peu (très) tardive, mais je voulais tester ce que tu m'avais envoyé avant de te répondre.

    Un grand merci pour tes exemples qui m'ont permis de mieux comprendre les événements.

    En fait, l'événement lance une procédure.
    L'événement a des paramètres/variables (les fameux _EVE) que l'on peut utiliser dans la procédure.

    Pour mon cas, l'événement WM_CHAR = 258 est plus approprié que celui du WM_SETFOCUS = 7.
    Ton exemple permet bien de remplir "ZONECODEBARRE" en enlevant le préfixe de mon code barre (celui de ta douchette pour ton exemple), grâce au RepriseSaisie qui "efface" le préfixe et rempli les données du code barre dans "ZONECODEBARRE".

    N'hésite pas à me dire si je ne raconte pas trop de bêtise...http://www.developpez.net/forums/ima...s/whistle2.gif

    Enfin, j'ai vu dans l'aide de Windev la liste des événements Windows où l'on retrouve tes constantes 7 et 258 : Valeur des constantes de l'API Windows 32 bits
    Mais cette liste est trop complète et c'est dur de trouver ce que l'on recherche.
    Existe-t-il une liste plus petite, plus simple et mieux documentée avec les principales constantes les plus usitées dans les applications.
    Je sais que j'en demande beaucoup, mais si cela existerait déjà, cela ferait gagner beaucoup de temps en compréhension.

    Cordialement

Discussions similaires

  1. Réponses: 3
    Dernier message: 14/05/2014, 13h56
  2. Réponses: 0
    Dernier message: 13/05/2014, 17h15
  3. [WD14] Récupérer la valeur lue par un lecteur Code Barre
    Par idoukan dans le forum WinDev
    Réponses: 8
    Dernier message: 10/04/2011, 05h49
  4. Réponses: 2
    Dernier message: 10/01/2007, 15h34
  5. Réponses: 2
    Dernier message: 16/10/2003, 17h17

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