Re: probleme de saisie dans table avec port serie

Posté par lass1250 le 20/5/2009 4:27:50
Correction a jours


Je galere depuis quelque jours sur ce probleme

Ce que je veux obtenir
1 - ouverture de ma fenetre directement en saisie sur le champs NoTag (Resolu)
Resolu avec la fonction DonneFocus(NoTag)

2 - via la lecture du port renseigne NoTag qui via une requette alimente
Nom et description

Non resolu il faut que lise 2 fois pour que NoTag renseigne bien NoTag
Je peux comprendre pour la premiere fois Car le buffer est vide

de plus il faut que je tappe un ENTER manuel pour alimenter le reste
de la ligne


3 - une fois informer Nom et descrition NoTag Change de ligne et reprend
la saisie et ainsi de suite,sans aucune manipulation du clavier
ni de la souris.


Non resolu le changementde ligne s'effectue grace a
EnvoieTouche ("{TAB 4}",Table.NoTag)

Mais il faut faire un retour ENTRE manuel pour continuer


Lors de l'ouverture de la fenetre ,Je veux que l'usager presente
son code barre et qui se lit ainsi de suite sans toucher au clavier ni souris

les lots a lire qui peut etre de 200 a 300 unites
j'ai 3 lecteur qui effectue le travail similiaire relie a un meme serveur


Donc une table avec saisie sur NoTag ,l'usager presente le code barre
identification et validation avec la requete et un autre code barre
ainsi de suit sans manipulation de la souris ou du clavier

La seule manipulation de la souris sera sur le bouton de fermeture

J'ai une Table memoire alimenter par le port serie
Ma table contient 3 colonne soit NoTag ,Nom et Description
NoTag est en saisie et les autre en affichage alimente par une requete


Pour assigner à la touche ENTREE l'action de générer une nouvelle ligne
dans la colonne,

- dans le détail de la table, cocher "Retour à la ligne par ENTREE"
- dans le détail de la colonne NoTag,Defilement Retour a la ligne automatique

//******************** Probleme a regler *************
Double lecture pour saisir la bonne information

Comment faire un ENTER software (dans le buffer il y a un cr et lf)
Je lit 14 caractere et 12 sont bons 12+cr+lf
J'ai essayer EnvoieTouche("{ENTREE 2 }",Table.NoTag)
Caract(13) + caract(10)
Peut etait-il mal placer

Je suis pas certain de l'emploie du timer et sEvenemt

Faut-il implanter un thread ,multitache ? si oui comment

Faut-il vider le buffer

Tous vos commentaire sont bons
s'il vous plait commenter avec du code


// ******************* voila le code *************

//******************** Declaration global fenetre7
GLOBAL
Port est un entier
gsGuyBuffer est une chaîne

LOCAL
Taux est un entier
Parite est un entier
BitDonnee est un entier
BitStop est un entier
Port=1
Taux=9600
Parite= 0
BitDonnee=8
BitStop=1

//SI sOuvre(Port,5000,5000)=FAUX ALORS
SI sOuvre(Port,5000,5000,sTimeoutDéfaut,Vrai)= Faux ALORS
Erreur("Erreur lors de l'ouverture du port "+Port)
Ferme()
FIN
sFixeParamètre(Port,Taux,Parite,BitDonnee,BitStop)
Timer("sReception",50,1)
//-- Fin du code généré par l'assistant

sEvénement(1,sEveCaractèreReçu,SRECEPTION)


//**************** fermeture fenetre7*****************
// Fermeture du port
sFerme(Port)
sFinEvénement(1)



// ************** Initalisation de Table ****************

DonneFocus(Table.NoTag)


// ***************** initialisation de NoTag *************




// ***************** entree de NoTag **************

SRECEPTION()


// **************** sortie de NoTag ***************


// Initialise la requête
SI PAS HExécuteRequête(REQ_VetementTag,hRequêteDéfaut,NoTag) ALORS
Erreur("Erreur d'initialisation de la requête"+RC+HErreurInfo())
RETOUR
FIN

// lecture du premier enregistrement de la requête
HLitPremier(REQ_VetementTag,NoTag)

NoTag = REQ_VetementTag.NoTag
Prenom = REQ_VetementTag.Prenom
Nom = REQ_VetementTag.NomEmployer
Description = REQ_VetementTag.DescService

HAnnuleDéclaration(REQ_VetementTag)

// permet de d'aller sur la prochaine ligne
EnvoieTouche("{TAB 4 }",Table.NoTag)

//EnvoieTouche("{ENTREE 2 }",Table.NoTag) // non operationnel test

// reprend la possession de la ligne
RepriseSaisie(NoTag)



// **************** Procedure Locale **********************


FONCTION SRECEPTION()
//Info ("guy1renvoueyer",NoTag)
wtaille est un entier
wtaille2 est un entier
sBuffer est une chaîne
FlagOK est un booléen
nbcaralire est un entier
nbcaralire=14
FinTimer(1)
wtaille=sDansFileEntrée(Port)

FlagOK=Faux

// Lecture des informations sur le port série en fonction de la condition d'arrêt
SI wtaille>nbcaralire ALORS
sBuffer=sLit(Port,nbcaralire)
FlagOK=Vrai
Trace(Port,sBuffer,wtaille)

NoTag = Gauche(sBuffer,12)

FIN

// Traitement des informations lues sur le port série
SI FlagOK
// Info(buffer)
FIN

Timer("sReception",50,1)

RENVOYER(NoTag)

Cette contribution était de : http://old.wdforge.org/newbb/viewtopic.php?forum=20&topic_id=6201&post_id=24708