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.
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.
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.
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]
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(P.S. je ne me souviens pas s'il y a la possibilité de mettre un suffixe)
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.
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.
Timer interval réglé à 1 seconde(1000).
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;
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.
Bonjour ,
13 chiffres seulement pour les code à bar prédefinis, mais il ya les codes personalisées qui peuvent avoir des tailles variables.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.
pas toujours exacte, exemple , essaye de saisir ce code '11',ça prend même pas une seconde.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.
je vai essayé l'exemple de @andnotor et je vous tiens au courant
je donnais un exemple, pas une généralité
Tester sur le temps de saisie est effectivement plus aléatoirepas toujours exact, exemple , essaye de saisir ce code '11',ça prend même pas une seconde.
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)je vais essayé l'exemple de @andnotor et je vous tiens au courant
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
Bonjour,
J'ai testé l'exemple mais il signale que l'unité "JwaWinUser" n'existe pas, ou je peut la trouvé?
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?
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.
Bonjour,
On étudiant un peu plus l'exemple que tu m'a donné, j'ai relevé cette procedure qui peut répondre à ma question
maintenant comment la modifier?
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;
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager