Salut,
C'est "Default=true" qui déclenche le Click.
En mode design, click sur Button1, F11 pour les propriétés, cherche la propiiété "Default" que tu mets à True, c'est tout.
solilog.
Salut,
C'est "Default=true" qui déclenche le Click.
En mode design, click sur Button1, F11 pour les propriétés, cherche la propiiété "Default" que tu mets à True, c'est tout.
solilog.
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 TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin Q1.SQL.Add('select * from Article where CodBarre=:part'); Q1.Prepared; Q1.Active:=false; if key=vk_return then begin Q1.Parameters.ParamByName('part').Value:=edit1.text; Q1.Active:=true; Edit2.text:=Q1.Fieldbyname('DesignArt').text; Edit1.text:=''; Edit1.SetFocus; end; end;
si j'ai bien compris ,
si je quitte pas le tedit on arrive jamais a Edit1.setfocus
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 procedure TForm1.Edit1Exit(Sender: TObject); begin //...traitement Edit1.setfocus ? end;
Donc si le code barre a dix digits, la requête ressemblera à ça :
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 select * from Article where CodBarre=:part select * from Article where CodBarre=:part select * from Article where CodBarre=:part select * from Article where CodBarre=:part select * from Article where CodBarre=:part select * from Article where CodBarre=:part select * from Article where CodBarre=:part select * from Article where CodBarre=:part select * from Article where CodBarre=:part select * from Article where CodBarre=:part
J'ai Fait ça Mr solilog j’espère que j'ai bien écrit, lorsque je tape au clavier + ENTER ça marche bien sinon dans 2 jours je récupère la douchette chez mon client pour confirmé, merci...
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 procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin Button1.Click; end; ... procedure TForm1.Button1Click(Sender: TObject); Var x:string; begin x:=Edit1.text; with Q1 do Begin Close; SQL.Clear; SQL.Add ('select * from Article where CodBarre like "%' + x + '%" '); Open; Edit2.text:=Fieldbyname('DesignArt').text; end; end;
Salut,
Non, supprime ta procédure OnKeypressed !!!
Si tu as bien mis Default=True dans ton bouton (en mode concept), çà suffit, le code du bouton sera exécuté.
solilog
Salut,
AVEC LA PROPRIETE DEFAULT=TRUE. Cette propriété signifie que le bouton est clické si on frappe ENTER. et la douchette reverra #13 en fin de scanne selon tes réglages. Je pense même que le réglage "#13" en fin de scanne est la valeur par défaut.
Je t'ai donné les contraintes:
- button1.default=true (en mode conception)
- qu'à la fin de la procedure Button1Click, tu remettes le focus sur Edit1 pour une autre lecture
- et que la douchette termine le scan par ENTER.
Regarde (F1) le help de la propriété Default des boutons.
solilog.
Bonjour,
ce que j'aime (façon de parler) c'est qu'à deux interlocuteurs différents on a deux codes différents !
Post #22 on me ressort grosso modo ce que j'ai proposé sans faire attention à certaines choses, et pourquoi un keydown ! alors que dans mes commentaires de code il était indiqué onKeyPress ?
Post #25 on repart dans les mêmes erreurs de requête non paramétrées
Post #15 je vous ai indiqué qu'il valait mieux avoir une requête préparée, mais pas une requête créée au runtime dans l'évènement ou du moins pas telle que vous le faite dans le code Du post #22 Andnotor à parfaitement résumé la situation de ce que cela donne et je pense même que cela plante avant d'avoir pu obtenir ces 10 lignes à cause du prepare
N.B. à propos du code du Pot #15 j'y ai rajouté un Key:=#0 ce qui permet de ne pas utiliser la précaution du Edit1.SetFocus (AMHA il reste nécessaire cependant , par précaustion, si dans le traitement on utilise des showmessage ou autres traitement d'erreurs ou de traitement sur d'autres zones contenant un focus)
Et ne me dites pas que cela ne fonctionne pas, je me base pour cette réponse sur un programme de 2002 toujours utilisé dans mon entreprise, et qui sert à tester des codes barres à la volée.
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
Avant d'aller plus loin !
Il faut savoir comment fonctionne la Douchette
C'est simple
Lance Word ou Notepad++
Active l'affichage des caractères spéciaux c'est l'icone ¶
Et si cela affiche un ¶ en fin de code ou un CRLF sur Notepad++
Cela confirmera la présence du caractère 13 pour lancer un traitement automatique, soit via OnKeyDown ou OnKeyPress, soit via un TButton en Default à True
Parce que 30 messages pour l'explication d'une douchette USB qui normalement d'une simplicité enfantine cela fait beaucoup !
Il faudrait procéder par étape
Voici du code extrait depuis mes applications où des personnes passent leur journée à scanner des codes barres (entre le 18/07/2016 11:11:21 au 13/01/2017 11:01:35, soit plus presque 6 mois avec 164357 scan, donc petite moyenne de 923 scan par jour)
Pour une autre application avec exactement le même code, c'est juste 3 199 636 objets scannés entre 23/04/2015 15:31:49 et 13/01/2017 11:11:27, ce qui donne 630 jours, soit une moyenne de 5072 scan par jour
Donc je peux le dire "ça fonctionne"
Je plussois ce que dit SergioMaster, arrêter de partir dans tous les sens, on vous fait partager notre expérience et l'on sait ce que l'on écrit ici !
1- Juste la gestion de la douchette
avec un TEdit nommé edScan, un TLabel nommé lblScanConfirm et une TListBox nommé ListBox1
Cela dans une nouvelle fenêtre vierge ! juste pour le test
Evidemment mettre le code métier directement dans le OnKeyDown c'est vilain !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 //------------------------------------------------------------------------------ procedure TFormXXX.edScanKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key = VK_RETURN then begin edScan.SelectAll(); lblScanConfirm.Caption := ''; if TreatScan(edScan.Text) then begin lblScanConfirm.Caption := edScan.Text; edScan.Text := ''; end; end; end;
Déjà au moins ce truc minimal fonctionne-t-il correctement ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 //------------------------------------------------------------------------------ function TFormXXX.TreatScan(const ACodeBarre: string): Boolean; begin Result := False; ListBox1.Items.Add(ACodeBarre + ' a été traité '); Result = True; end;
Inutile d'aller plus loin sinon !
2- Intégrer cela dans la vraie fenêtre
Idem, faire l'essai, si il y a un problème à ce stade, c'est ça qu'il faut étudier
3- Ajouter le SQL
Pour cela un objet Query préparé à l'avance (par exemple dans le FormCreate de la TFom ou d'un TDataModule)
Et cela est pour moi, un autre sujet car dans un code bien conçu, la lecture d'une donnée est isolée et n'a pas de lien spécifique avec la lecteur d'un code barre
L'avantage de séparer TOUT c'est que l'on peut tester les éléments séparément les uns des autres
Tu peux donc tester la lecture dans la base même si tu n'as pas la douchette
Puis lorsque tu auras la douchette, tu pourras t'occuper juste d'elle pour commencer puis interconnecter le code gérant la douchette du code gérant la base !
C'est en tout mélangeant que l'on s'embourbe d'un code compliqué que l'on ne maitrise plus
Dans un TDataModule qui heberge les Query
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 //------------------------------------------------------------------------------ function TFormXXX.TreatScan(const ACodeBarre: string): Boolean; begin Result := False; try EdDesignArt.Text := DataModule.GetDesignArt(ACodeBarre); Result = True; except on E: Exception do begin EdDesignArt.Text := E.Message; end; end; end;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 function TDataModuleXXX.GetDesignArt(const ACodeBarre: string): string; begin with OpenArt(ACodeBarre) do try if not IsEmpty then Result := FieldByName('DesignArt').AsString else raise Exception.CreateFmt('Article "%s" non trouvé', [ACodeBarre]); finally Close(); end; end;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 function TDataModuleXXX.OpenArt(const ACodeArticle: string): TDataSet; begin Result := qryArticle; // tout simplement posé sur le TDataModule if not Result.Prepared then Result.Prepare(); Result.Close(); Result.ParamByName('pCodeArticle').AsString:= ACodeArticle; Result.Open(); end;
Code dfm : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 object qryArticle: TQuery SQL.Strings = ( 'SELECT * FROM Article WHERE CodBarre = :pCodeArticle') ParamData = < item DataType = ftUnknown Name = 'pCodeArticle' ParamType = ptUnknown end> end
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
Grand merci à messieurs, SergioMaster ShaiLeTroll pour les dernières citation ainsi qu'au autre qui m'on aidé, je vais les exploités..
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