abracadabraPDF › Forums › PDF – Général › Remplir zones de texte à partir de la ligne sélectionnée dans une zone de liste
- Ce sujet est vide.
-
CréateurSujet
-
14 novembre 2020 à 16:41 #46453
yalec38
MembreBonjour,
Je cherche à remplir deux zones de texte en fonction de la valeur d’une ligne d’une zone de liste sélectionnée par un clic. Le zone de liste contient pour chaque ligne le code PCS-ESE (ex : 333A) et le libellé du code (ex : MAGISTRAT) séparé par une tabulation.
Je voudrais que la première zone de texte contienne le code PCS-ESE et la deuxième le libellé correspondant au code.Ma zone de liste est remplie par code (récupéré ici) depuis une pièce jointe en .txt
J’ai eu beau chercher sur le forum, je ne vois pas comment récupérer la valeur de la ligne sélectionnée dans la zone de liste.
Merci d’avance si une âme charitable pouvait m’indiquer un début de solution.
-
CréateurSujet
-
AuteurRéponses
-
14 novembre 2020 à 18:01 #68311
bebarth
Maître des clésbonjour,
Ce serait plus pratique de partager un fichier avec la pièce jointe… même si il n’est pas complet pour voir exactement comment est ton fichier .txt.
Une zone de liste permet une sélection multiple. Ne serait-ce pas plutôt un menu déroulant ?
@+
:bonjour:15 novembre 2020 à 08:28 #68312yalec38
MembreIl s’agit bien d’une zone de liste (l’option “sélection multiple” n’a pas été activée). J’importe donc lors de l’activation de la première zone de texte les données de la pièce jointe dans la zone de liste avec le code suivant :
this.getField(“LISTE-PCS”).clearItems();
var PJOINTE = this.getDataObject(this.dataObjects[0].name)
var fi = this.getDataObjectContents(PJOINTE.name)
var fit = util.stringFromStream(fi)
var LIGNES = fit.split(“n”);
var COLONNES = new Array();
for (var i = 0 ; i < LIGNES.length ; i++) {COLONNES = LIGNES.split(“;”)}
var TABLEAU = new Array() ;
for (var j = 0 ; j < COLONNES.length ; j++) { TABLEAU[j] = [COLONNES[j][0], j] ;}
this.getField(“LISTE-PCS”).setItems(TABLEAU); // champ liste déroulante
[this.getField(“LISTE-PCS”).setFocus();Je voudrais que lorsque l’utilisateur sélectionne une ligne dans la zone de liste (par clic), que son contenu soit scindé en deux parties et s’inscrive dans deux zones de texte.
Chaque ligne du fichier .txt est constituée d’une chaine de 4 caractères (3 chiffres et 1 lettre) suivie d’une tabulation puis d’une chaine de caractères de longueur variable et terminée par un “;”.
Je ne sais pas comment récupérer dans une variable la valeur de la ligne sélectionnée dans la zone de liste pour pouvoir la scinder en deux et inscrire chaque partie dans la zone de texte correspondante.
En VB.net j’aurai ajouté sur une procédure “OnClick” de la zone de liste le code suivant :
Dim Code as String = SubString(LISTE-PCS.SelectedValue, 0, 3)
Dim Libelle as String = SubString(LISTE-PCS.SelectedValue, 5, LISTE-PCS.SelectedValue.Lenght – 5)
CODE-PCS.Value = Code
LIB-PCS.Value = LibelleAvec LISTE-PCS le nom de la zone de liste, CODE-PCS le nom de la première zone de texte et LIB-PCS le nom de la deuxième.
Malheureusement, je ne maitrise pas du tout le JavaScript. :Smiley02:
15 novembre 2020 à 13:48 #68313Merlin
Maître des clésLe script de base :
cTexte = this.getField(“ZoneDeListe“).valueAsString;
// exemple de valeur attendue : “621A CHEF D’EQUIPE DU GROS OEUVRE ET DES TRAVAUX PUBLICS”
aTexte = cTexte.split(“t”); // découpage de la chaine de caractères sur la TAB
this.getField(“code“).value = aTexte.shift(); // premier élément de l’array
this.getField(“libelle“).value = aTexte.pop(); // dernier élément de l’arrayQu’on peut utiliser ainsi en action “champ désactivé” dans la zone de liste :
cTexte = event.target.valueAsString;
// exemple de valeur attendue : “621A CHEF D’EQUIPE DU GROS OEUVRE ET DES TRAVAUX PUBLICS”
aTexte = cTexte.split(“t”); // découpage de la chaine de caractères sur la TAB
this.getField(“code“).value = aTexte.shift(); // premier élément de l’array
this.getField(“libelle“).value = aTexte.pop(); // dernier élément de l’arrayNe pas oublier d’ajuster les noms des champs (en orange).
15 novembre 2020 à 16:21 #68314yalec38
MembreMerci Merlin.
J’avais mis ça dans l’onglet “Changement de sélection” :
this.getField(“CODE-PCS1”).value = event.value.substring(0,4)
this.getField(“LIB-PCS1”).value = event.value.substring(5)Et ça fonctionne pour remplir les zones de texte mais je voudrai que la validation soit faite par un double click sur la ligne sélectionnée de la zone de liste.
Cependant le fonctionnement des zones de liste sous Acrobat ne me convient pas (l’ascenseur n’est pas visible systématiquement et le défilement est trop lent). Il va falloir que je fasse une usine à gaz avec des zones de texte et deux boutons de déplacement.
15 novembre 2020 à 18:07 #68315Merlin
Maître des clésCependant le fonctionnement des zones de liste sous Acrobat ne me convient pas (l’ascenseur n’est pas visible systématiquement et le défilement est trop lent). Il va falloir que je fasse une usine à gaz avec des zones de texte et deux boutons de déplacement.
Tu devrais peut-être utiliser des listes déroulantes…
15 novembre 2020 à 20:09 #68316bebarth
Maître des clésbonjour,
…je voudrai que la validation soit faite par un double click sur la ligne sélectionnée de la zone de liste.
J’ai déjà fait ça, mais il faut que je retrouve et que je me remémore le fonctionnement, car de ce que je me souviens ce n’était pas évident.
@+
:bonjour:16 novembre 2020 à 17:24 #68317bebarth
Maître des clésbonjour,
Voici le résultat en simple et double-clic !
@+
:bonjour:16 novembre 2020 à 18:14 #68318yalec38
MembreMerci bebarth
Il va falloir que je décortique ton code avec autre chose que l’éditeur d’Acrobat X. En tous cas sur ton fichier joint ça à l’air de fonctionner parfaitement et de correspondre à ce que je voulais.
La prochaine étape va être de pouvoir filtrer la liste en fonction du premier chiffre du code PCS (1, 2, 3, 4, 5 ou 6) et éventuellement de pouvoir faire une recherche par mot clé.
Est-ce que l’équivalent de string.StartsWith(“1”) existe en javascript ?
Et est-ce que l’équivalent de string.Contains(“chaine”) existe aussi ?
Merci en tous cas pour vos réponses qui vont m’aider à avancer sur ce projet.
16 novembre 2020 à 18:25 #68319bebarth
Maître des clésEst-ce que l’équivalent de string.StartsWith(“1”) existe en javascript ?
Et est-ce que l’équivalent de string.Contains(“chaine”) existe aussi ?Ces fonctions existent mais je sais qu’elles ne fonctionnent pas correctement sur tous les OS. Je n’ai jamais eu de problèmes avec des utilisateurs Mac, mais j’en ai eu avec des utilisateurs PC.
https://www.w3schools.com/jsref/jsref_startswith.asp
https://www.w3schools.com/jsref/jsref_includes.asp
Ce n’est pas grave, il y a moyen d’utiliser d’autres fonctions…
@+
:bonjour:16 novembre 2020 à 19:35 #68320Merlin
Maître des clésLa prochaine étape va être de pouvoir filtrer la liste en fonction du premier chiffre du code PCS (1, 2, 3, 4, 5 ou 6)
C’est une fonctionnalité native dans Acrobat (Reader, Pro, Standard).
Quand on saisit un caractère au clavier la liste déroulante se positionne automatiquement sur le premier item correspondant dans la liste.Sur MacOS je n’en jurerais pas, mais sur Windows ça fonctionne très bien.
19 novembre 2020 à 17:21 #68321yalec38
MembreBebarth,
J’ai essayé d’adapter le code dans le script “init” du formulaire que tu as créé pour ne pas avoir de pièce jointe au formulaire en me servant d’un champs “zone de texte” dans lequel j’ai copié les données du fichier PCS-ESE.txt.
Je n’ai rien qui s’affiche dans le champs LISTE-PCS :Ooops:Voici le code modifié :
this.getField(“LISTE-PCS”).clearItems();
var DONNEES=this.getField(“DONNEES”).value;
var DONNEES=DONNEES.replace(/;/g, “”);
var LIGNES=DONNEES.split(“r”);
var COLONNES=new Array();
for (var i=0; i.split(“t”));
var TABLEAU=new Array() ;
for (var j=0 ; jthis.getField(“LISTE-PCS”).setItems(TABLEAU); // champ liste déroulante
this.getField(“LISTE-PCS”).setFocus();
this.getField(“CODE-PCS1”).value=this.getField(“LISTE-PCS”).getItemAt(0,false);
this.getField(“LIB-PCS1”).value=this.getField(“LISTE-PCS”).getItemAt(0,true);
this.getField(“CODE-PCS2″).value=””;
this.getField(“LIB-PCS2″).value=””;Y’a t’il un moyen de déboguer le code en pas-à-pas (de façon à voir le contenu des variables et si oui, comment faire ?
A quoi correspond la commande .push ?
Comment afficher dans le champs “LISTE-PCS” le code PCS et le libellé séparés d’une tabulation ?Je suis désolé de revenir sur le sujet mais je suis vraiment une quiche en javascript alors que je me débrouille en peu mieux en VB.Net
19 novembre 2020 à 20:09 #68322bebarth
Maître des clésbonsoir,
Si tu fais un copier/coller de ton fichier txt dans un champ, le souci est que tes tabulations ne seront pas reconnues. Elles seront interprétées comme un espace !
Si tous tes codes ont le même nombre de caractères, on peut s’en sortir sinon ça sera entre plus compliqué et impossible…
Mais il semble qu’ils ont tous 4 caractères, correct ?Pour afficher une valeur dans la console tu écris :
console.println(“Variable DONNEES : “+DONNEES);
@+
:bonjour:20 novembre 2020 à 08:29 #68323yalec38
MembreEffectivement, tous les codes font le même nombre de caractères : 3 chiffres suivi d’une lettre.
20 novembre 2020 à 11:14 #68324bebarth
Maître des clésbonjour,
Voilà ce que ça donne.
Si tu n’as pas spécialement besoin du champ “DONNEES”, tu peux coller ton fichier txt en variable du script d’ouverture :Code:var donnees=”Tu colles ici le texte de ton fichier txt”;et bien sûr, tu retires la lignes :
Code:var donnees=this.getField(“DONNEES”).value;@+
:bonjour:20 novembre 2020 à 11:34 #68325yalec38
MembreBebarth,
Je me suis permis de t’envoyer un message privé. En fait j’ai besoin du champ Zone de texte pour importer les données car l’utilisateur final doit pouvoir modifier ces données indirectement. Je t’explique cela de manière plus claire dans mon MP.
Merci de ta patience :Ooops:
-
AuteurRéponses
- Vous devez être connecté pour répondre à ce sujet.