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 :

Saisie kilométrique sans appuyer sur entrée


Sujet :

Delphi

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Avril 2003
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Saisie kilométrique sans appuyer sur entrée
    Bonsoir,

    Je dois faire une application qui scanne trois sort de codes barres différents avec des longueurs différents : 13, 24 et 28 caractères.

    L'utilisateur scanne le code barre depuis une zone edit et sans appuyer sur entrée le code barre est ajouté sur une liste box.

    J'essaie d'utiliser l'événement onchange :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if length(ed_code.text)>=13 and length(ed_code.text)<=28 then ...
    ça marche bien pour les codes barres avec 13 mais pas pour les deux autres ...

    Merci

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Quelle version de Delphi ?
    Qu'est sensé renvoyer le scanneur ? de l'AnsiString ? du WideString (unicode) ?
    Avez tracé pas à pas le code de l'événement OnChange et examiner le contenu du TEdit en question ?

    --
    Philippe.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 755
    Points : 13 351
    Points
    13 351
    Par défaut
    A l'instar d'un clavier, un scanner envoie des codes sur un octet
    En général, le code de terminaison est VK_RETURN. (mais dépend des réglages du scanner)
    C'est le seul code que tu devrais avoir à gérer.

  4. #4
    Membre confirmé
    Avatar de JP.NUAGE
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 82
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 769
    Points : 542
    Points
    542
    Par défaut
    J'ai du mal à comprendre le problème. Comme le dit fort justement Andoter, un lecteur de code barre n'est rien d'autre qu'un clavier qui envoie des caractères et un caractère de fin de ligne de type Key_Enter. Donc lorsque je traitais ce problème, il me suffisait de déterminer la longueur de la zone sur l'évènement OnKeyDown, options Key_enter ou Key_return. Mais j'avais pris la précaution de prévoir un zone suffisamment longue pour lire le code le plus long (ou une zone à défilement horizontal)

    En revanche certains scanners, s'ils sont mal paramétrés renvoient autre chose qu'un caractère de fin de ligne : c'est alors le scanner qu'il faut examiner

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Avril 2003
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Ce scanner est connecté à une caisse et l'application caisse n'utilise pas le caractère vk_return. Je dois donc m'y adapter.

    J'utilise la version de delphi 7

    Merci

  6. #6
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    si je comprend bien tu reçois 13, 24 ou 28 caractères et pas de touche ENTREE.

    j'imagine que les caractères arrivent en un temps très court et qu'il se passe un peu plus de temps avant le scan suivant.

    du coup si le temps passé depuis la dernière touche est court, je suis en train de recevoir un numero, s'il est long c'est que le précédent numéro est terminé.

    tout cela avec un timer pour tester la fin de saisie du dernier scan

    quelque chose 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
    15
    16
    17
     
    procedure TForm1Edit1Change(Sender: TObject);
    var
      Ticks: Cardinal;
    begin
      Ticks := GetTickCount; // ou avec un TDateTime
      if LastTime > 0 then // on ignore le premier coup
      begin
        if Ticks - LastTime > 50 then // valeur à déterminer de façon empirique
        begin
         // ici Edit1 doit contenir un nombre 13, 24 ou 28 caractères
          Edit1.Text := '';
          LastTime := 0; // reset
        end;
      end;
      LastTime := Ticks
    end;

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 755
    Points : 13 351
    Points
    13 351
    Par défaut
    Citation Envoyé par smrh2002 Voir le message
    ...l'application caisse n'utilise pas le caractère vk_return.
    La question n'est pas de savoir si l'application à besoin ou non de ce caractère, mais si le scanner le génère (celui-là ou un autre)

    Sur OnKeyUp de l'Edit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    begin
      if Key = VK_RETURN then
        ListBox1.Items.Add(Edit1.Text);
    end;
    Scanne des codes dans le bloc-notes et regarde ce qui arrive. (retour à la ligne, tab, espace, ...)

  8. #8
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 105
    Points : 41 195
    Points
    41 195
    Billets dans le blog
    63
    Par défaut
    moi c'est sur le onKeyPress que je gère les scans code barre mais sinon le principe est le même que ANDNOTOR

    exemple pour un code128A ou 2/5i ou EAN13
    programme D3 encore en utilisation
    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
    procedure TForm.SaisieKeyPress(Sender: TObject; var Key: Char);
    begin
    if Key=#13 then
     begin
       Key:=#0;
       SelectNext(Sender as TwinControl,true,true);
     end;
    end;
     
    procedure TForm_Finition.SaisieExit(Sender: TObject);
    var CDB : Double;
        S : String[30];
    begin
    // ICI j'ai eu des problèmes avec certains postes et la touche MAJ 
    // j'obtenais des caractères non conformes a mes codes ALPHA 
    S:=UpperCase(Saisie.text);
    for i:=0 to 29 do
    begin
     if S[i]='µ' then S[i]:='*';
     if S[i]=',' then S[i]:='?';
     if S[i]='£' then S[i]:='$';
    end;
    Saisie.text:=S;
    if (Length(Saisie.Text)=0) then Exit;
    // ICI NOUVELLE modification des spécifications les codes barre pouvait être soit alpha soit sur 13 chiffres (2/5 entrelacé ou EAN13)
    try  CDB:=StrtoFloat(s); except  CDB:=0; end;
    ......
    end;

  9. #9
    Membre confirmé
    Avatar de JP.NUAGE
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 82
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 769
    Points : 542
    Points
    542
    Par défaut
    Je ne sais pas si tu as cette possibilité mais si c'est le cas, branche ton scanner sur un ordinateur normal, ouvre un bloc note et lis tes différents codes barre.

    Que vois-tu ? Cela aiderait pas mal.

    Si en lisant trois codes différents tu récupères trois lignes dans ton bloc note, c'est que le scanner est bien configuré. Si tu n'obtiens qu'une seule ligne, c'est qu'effectivement il n'y a pas de retour chariot.

    MAIS ...... et je crois que j'ai eu le cas, si le code à 13 fait passer à la ligne et pas les autres, là coton

    Je suis curieux de connaître les résultat si tu pouvais faire ce petit test

  10. #10
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 105
    Points : 41 195
    Points
    41 195
    Billets dans le blog
    63
    Par défaut
    pour rajouter aux tests proposés :
    faire un scan sur des codes barres non générés par le programme
    (boites de conserve, revues etc....) qui eux ont un caractère de fin de ligne confirmé

Discussions similaires

  1. Executer fonction Edit text sans appuyer sur entrée
    Par Pauline57 dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 26/09/2014, 15h59
  2. Réponses: 3
    Dernier message: 18/11/2011, 19h23
  3. Saisie au clavier sans appuyer sur Entrée
    Par Invité dans le forum Général Python
    Réponses: 1
    Dernier message: 14/05/2008, 15h23
  4. Réponses: 8
    Dernier message: 11/04/2007, 11h52
  5. Réponses: 9
    Dernier message: 10/11/2005, 23h31

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