PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV Mobile 24 → Problème pour positionner le focus dans champ de saisie sur ZoneRépétée
Problème pour positionner le focus dans champ de saisie sur ZoneRépétée
Débuté par mizar, 09 oct. 2018 10:15 - 10 réponses
Membre enregistré
6 messages
Posté le 09 octobre 2018 - 10:15
Bonjour à tous,

Je prépare une application de scan tournant sur Android sur un appareil dédié.

Le principe est le suivant: sur un écran j'ai une ZoneRépétée Zr_SansNom1 contenant deux libellés LibCodeBarres et LibQuantité, et leurs champs de saisie correspondants SAI_Code_Barres et SAI_Quantité. J'ai déclaré un Attribut Valeur dans la ZoneRépétée pour les quatre éléments.

Pour chaque instance de ma zonerépétée j'instancie sans problème mes libellés :
ATT_LibCB[Indice] = "Code Barres"
ATT_LibQte[Indice] = "Quantité"

A chaque fois que mon champ SAI_Code_Barres est remplie par 13 caractères numériques, j'incrémente ensuite la quantité de 1 et créée une nouvelle zonerépétée via la fonction ZoneRépétéeAjoute.

Là ou je sèche complètement :
* Quand j'arrive sur cet écran, j'aimerais que le focus soit déjà positionné sur le champ SAI_Code_Barres de ma ZoneRépétée.
* A chaque instanciation d'une nouvelle ZoneRépétée, j'aimerais que le focus soit positionné dans le champ Code_Barres de ma ZoneRépétée.

Dans le code "Affiche d'une ligne de la Zone Répétée" j'ai testé sans succès les codes suivants :
DonneFocus(ZR_SansNom1.SAI_Code_Barres)
RepriseSaisie(ZR_SansNom1.SAI_Code_Barres)
EcranPremier(ZR_SansNom1.SAI_Code_Barres)

Mon problème :
* Dans l'émulateur ça fonctionne très bien (!)
* En test sur le mobile Android ça ne fonctionne pas, ça ne fonctionne pas non plus sur mon lecteur de code barres tournant sous Android => je ne vois pas le curseur et suis obligé de cliquer manuellement dans les champs, ce qui n'est pas le comportement que j'attends.

Pouvez-vous m'orienter:
* Soit je m'y prends mal pour positionner ce focus? Mais pourquoi celà fonctionne sur pc et pas mobile?
* Est-ce que cela peut venir d'un problème de version android?
* Autre chose?

D'avance merci pour vos lectures et réponses
Posté le 12 octobre 2018 - 09:56
Bonjour,

Je me permets de préciser mon précédent post;
Dans le code d'"affichage d'une ligne" de ma zone répétée, pour positionner le focus dans le champ désiré j'effectue auparavant une affectation : ZR_SansNom1 = Indice
Ensuite je teste de donner le focus à mon champ avec l'une des trois fonctions ci-dessous mais cela ne fonctionne que sur l'émulateur et pas en réel :
DonneFocus(ZR_SansNom1.SAI_Code_Barres)
RepriseSaisie(ZR_SansNom1.SAI_Code_Barres)
EcranPremier(ZR_SansNom1.SAI_Code_Barres)

Si à ce moment j'essaie d'afficher la position du curseur (nValeurCurseur est un entier = SAI_Code_Barres..Curseur) la valeur indiquée est 1 donc à priori le curseur serait bien dans mon champ, mais (sauf dans l'émulateur) je ne vois aucune barre clignotante dans mon champ et si j'essaie de saisir des données je ne suis pas dans mon champ...

D'avance merci et bonne journée
Posté le 12 octobre 2018 - 10:23
Tu peux imposer l'ordre des champ
Regarde cette page
https://doc.pcsoft.fr/?2026006
Membre enregistré
6 messages
Posté le 12 octobre 2018 - 12:48
Bonjour Popoy, merci beaucoup pour ta réponse et l'information je ne connaissais pas encore.
J'avais effectivement mon deuxième champ de saisie qui était initialisé d'abord.

Ca améliore ma situation mais ne résout que partiellement mon problème :
- sur la première occurrence de ma ZoneRépétée je ne parviens pas à avoir le focus dans mon bon champ, comment faire? (il y a aussi une notion d'intialisation des champs dans le même menu mais seul le premier libellé de ma zone apparait).
- l'appli est compilée pour tourner sur Android 7.1.
Je la teste sur deux terminaux (un en 7.1.1 et l'autre en version 8)
=> sur celui en version 8 le focus est bien dans mon champ à chacune des nouvelles occurrences de la zonerépétée, mais pas sur celui en 7.1.

Merci à vous
Membre enregistré
6 messages
Posté le 12 octobre 2018 - 18:47
Je pense en fait avoir d'abord un problème de navigation, la fenêtre contenant ma zonerépétée est en fait appelée depuis un écran FEN_ACCUEIL contenant un bouton qui ouvre un autre écran.

En mettant des traces sur tous les évènements de tous les objets de mon projet, je m'aperçois qu'en fait même si à l'écran c'est ma fenêtre contenant la zonerépétée qui est affichée, en fait le focus est sur ma FEN_ACCUEIL.
Ca explique déjà mon problème: "sur la première occurrence de ma ZoneRépétée je ne parviens pas à avoir le focus dans mon bon champ".

J'ouvrais ma fenêtre avec le traitement prédéfini dans la description du clic sur le bouton et je l'ai remplacé par la fonction Utilise qui est censé fermer ma FEN_ACCUEIL pendant qu'il ouvre la deuxième contenant ma zonerépétée. Mais ma trace affiche toujours FEN_ACCUEIL comme ayant le focus je ne comprends pas...
Membre enregistré
6 messages
Posté le 16 octobre 2018 - 10:20
Bonjour,

Mon écran contenant ma zonerépétée est appelé depuis un écran principal avec une touche de raccourci.
J’essaie de donner le focus depuis les initialisations de mes différents objets (initialisation de la fenêtre contenant la zonerépétée, initialisation de la zonerépétée elle-même, initialisation de mon champ devant prendre le focus, ainsi que juste après l’ouverture de ma fenêtre dans le code du bouton appelant ma fenêtre) : Le curseur n’est jamais dans le champ désiré et n’est pas visible à l’écran sur le smartphone ou terminal Android (sauf en mode émulateur ou cela fonctionne très bien).

Le code positionné est celui-ci :
Indice = ZoneRépétéeAjouteLigne(ZR_SansNom1)
ZR_SansNom1 = Indice
ZR_SansNom1[Indice].ATT_LibCB..Valeur = "Code Barres"
ZR_SansNom1[Indice].ATT_LibQte..Valeur = "Quantité"
DonneFocus(FEN_Liste_V2.ZR_SansNom1.SAI_Code_Barres)

J'ai également essayé d'ouvrir ma fenêtre fille contenant la zonerépétée avec différentes méthodes (Ouvre, OuvreFille, OuvreSoeur, Utilise) mais cela ne fonctionne dans aucun cas, le focus n'est jamais dans mon champ.

Y a-t-il autre chose pour positionner automatiquement le focus dans le même champ d'une ZR, lors de la première occurrence de la zone et des suivantes?

Merci à vous
Membre enregistré
1 647 messages
Posté le 16 octobre 2018 - 17:21
Bonjour,

As-tu essayé avec Reprisesaisie() ? rajoute un bouton sous ta ZR dans lequel tu lances un trace sur ChampPrecedent() pour savoir où est le champ en cour de saisie.

--
Cordialement,

Philippe SAINT-BERTIN
Membre enregistré
6 messages
Posté le 17 octobre 2018 - 19:33
Bonsoir Philippe,
Merci pour ta réponse et pour l'idée de la touche affichant la valeur de Champprécédent.

La touche me renvoie :
- rien (toastaffiche avec contenu vide) lorsque j'arrive sur l'écran contenant ma Zonerépétée (pour rappel j'arrive depuis un écran précédent vaec une touche ouvrant ma fenêtre).
- le bon nom de mon champ (alors que je ne suis pas dedans!), si je clique sur un autre champ de ma zone après son initialisation.

J'ai testé d'ajouter un autre champ "Force focus" à l'extérieur de ma zone avec le code suivant :
Indice est une chaîne = ZR_SansNom1..Occurrence
ZR_SansNom1 = Indice
ZR_SansNom1.ATT_LibCB="Force focus"
RepriseSaisie(FEN_Liste_V3.ZR_SansNom1.SAI_Quantite)

Ce code :
- modifie bien mon libellé ATT_LibCB en "Force Focus"
- mais ne me positionne pas en RepriseSaisie dans le champ désiré (testé en: RepriseSaisie/DonneFocus, avec ou sans les noms de ma fenêtre/nom de ma zone) => j'ai donc bien un problème de positionnement dans ma zone, mais ne voit pas comment entrer automatiquement dans mon champ?

Cordialement
Posté le 25 octobre 2018 - 09:25
Après mûre réflexion, mizar a écrit :
Bonsoir Philippe,
Merci pour ta réponse et pour l'idée de la touche affichant la valeur de
Champprécédent.

La touche me renvoie :
- rien (toastaffiche avec contenu vide) lorsque j'arrive sur l'écran
contenant ma Zonerépétée (pour rappel j'arrive depuis un écran précédent vaec
une touche ouvrant ma fenêtre).
- le bon nom de mon champ (alors que je ne suis pas dedans!), si je clique
sur un autre champ de ma zone après son initialisation.

J'ai testé d'ajouter un autre champ "Force focus" à l'extérieur de ma zone
avec le code suivant :
Indice est une chaîne = ZR_SansNom1..Occurrence
ZR_SansNom1 = Indice
ZR_SansNom1.ATT_LibCB="Force focus"
RepriseSaisie(FEN_Liste_V3.ZR_SansNom1.SAI_Quantite)

Ce code :
- modifie bien mon libellé ATT_LibCB en "Force Focus"
- mais ne me positionne pas en RepriseSaisie dans le champ désiré (testé en:
RepriseSaisie/DonneFocus, avec ou sans les noms de ma fenêtre/nom de ma
zone) => j'ai donc bien un problème de positionnement dans ma zone, mais ne
voit pas comment entrer automatiquement dans mon champ?

Cordialement

---
Cet email a fait l'objet d'une analyse antivirus par AVG.
http://www.avg.com


bonjour
globalement je trouve que les saisies avec des tables ou des ZR sont
souvent pas aisées.
Je parle surtout d'une expérience avec Webdev, mais aussi avec Windev
Je trouve que pour l'utilisateur ce n'est pas une saisie pratique. Et
odnc je pars plutôt vers un affichage liste, et un mode de saisie fiche

Du coup as-tu essayé d'orienter vers une popup de saisie dès que l'on
rentre sur une ligne de la ZR ?
la gestion des focus serait peut-être plus facile.

C'est une solution que je te propose car c'est ce que j'ai trop souvent
fait à chaque fois que j'ai voulu implémenter des saisies dans des
tables ou ZR. Non satisfait je suis souvent revenu à un modèle
liste/fiche.

--
Roumegou Eric
Membre enregistré
1 647 messages
Posté le 25 octobre 2018 - 19:45
Je suis plutôt d'accord avec Eric, je trouver que la saisie par une ZR est très compliqué. et pas très pratique ou User friendly.

--
Cordialement,

Philippe SAINT-BERTIN
Membre enregistré
6 messages
Posté le 26 octobre 2018 - 12:17
Merci pour vos réponses et vos avis, en fait je n'ai pas trop le choix: l'idée est de scanner à la chaîne depuis un terminal dédié qui tourne sous Android.
Le terminal possède une touche scan qui capte la valeur de code-barres, et l'utilisateur doit pouvoir scanner sans regarder l'interface n'y faire d'action dessus.Pour le coup la solution de la ZR m'a semblé être l'objet qui convient le mieux à ce besoin