abracadabraPDF › Forums › PDF – Général › Exécution de fonction par bouton
- Ce sujet contient 53 réponses, 3 participants et a été mis à jour pour la dernière fois par bebarth, le il y a 6 mois et 3 semaines.
-
CréateurSujet
-
6 mai 2024 à 08:00 #74174michel c.Participant
Bonjour, j’ai un document qui me sert de base pour créer des exercices interactifs.
Il y a 2 scripts de documents (EditReps et Default) qui s’executent en action de frappe (Default) et Calcul de valeur (EditReps)
J’aimerais que chacun le script Default s’exécute en cliquant sur un bouton.
Pour le script default : lors du clic sur le bouton tous les champs (sauf les champs dont le nom commence par “Q.” doivent prendre comme valeur par défault la valeur inscrite dans le champ. Les champs dont le nom commence par “Q.” doivent prendre la valeur “” comme valeur par défault pour les champs texte et la 1ère position pour les listes déroulantes
Pour le script EditReps ; lorsque la case Menu.5 est cochée, j’aimerais que tous les champs soient en readonly false sauf les champs dont le nom commence par “Q.” et lorsque la case Menu.5 est décochée, tous les champs soient en readonly true mais sans que l’ai besoin de mettre un script en action de calcul.
La raison c’est que lorsque je crée de nouveaux champs, j’ai parfois des bugs, les actions de frappe ou de calculs ne s’exécutent pas forcément. Je suis obligé de modifier le champs parfois plusieurs fois pour que cela fonctionne.
Merci
Attachments:
You must be logged in to view attached files. -
CréateurSujet
-
AuteurRéponses
-
6 mai 2024 à 10:16 #74176MerlinMaître des clés
Bonjour
Souvent la bonne réponse vient de l’abandon de la mauvaise question.
Tes scripts tiennent la route, je crois que ce sont les déclencheurs qui posent problème :
- Les champs R.1.n et R.2.n déclenchent deux fois la fonction “Defaut”, en script de format et en script de touche. À mon avis c’est une fois de trop.
Et si je comprend bien cette fonction je la verrais mieux en script de Validation.
- L’évènement “Calcul” se déclenche pour tous les champs à chaque fois qu’un seul champ est désactivé, donc la fonction “EditReps ” est déclenchée par tous les champs à chaque fois qu’un seul d’entre eux est utilisé. Par ailleurs ça oblige à gérer l’ordre de calcul (qui ne me parait pas logique dans ce document).
Donc je crois que cette fonction serait mieux placée si elle était en script de Validation, ainsi elle ne serait déclenchée que par le champ actif, et donc une seule fois.
Tu peux utiliser des scripts pour déplacer l’appel des fonctions dans les champs, tu n’es pas obligé de tous les reprendre à la main un par un.
Par exemple pour les 18 champs Question.1.n :
for (var i = 0; i < 19; i++) {
// suppression du script de calcul
this.getField("Question.1."+i).setAction("Calculate", "");
// ajout en script de validation
this.getField("Question.1."+i).setAction("Validate", "EditReps();");
}
Attachments:
You must be logged in to view attached files.6 mai 2024 à 12:59 #74179michel c.ParticipantBonjour, je viens d’essayer mais ça ne fonctionne pas. Je n’ai aucune erreur à la console mais les scripts font rien…
Attachments:
You must be logged in to view attached files.6 mai 2024 à 17:42 #74183bebarthMaître des clésbonjour,
Pour “default”, essaye ça :
for (var i=0; i<this.numFields; i++) {
var nomChamp=this.getNthFieldName(i);
if (nomChamp.indexOf("Q.")==0) {
if (this.getField(nomChamp).type=="text") this.getField(nomChamp).defaultValue="";
else this.getField(nomChamp).value=this.getField(nomChamp).getItemAt(0,false);
}
}
et pour “EditReps” :
for (var i=0; i<this.numFields; i++) {
var nomChamp=this.getNthFieldName(i);
if (this.getField("Menu.5").value!="Off") {
if (nomChamp.indexOf("Q.")!=0) this.getField(nomChamp).readonly=false;
} else {
this.getField(nomChamp).readonly=true;
}
}
Mais là, même ton bouton sera en lecture seule !!! Il faudra l’exclure si tu ne veux pas.
Tu me dis…@+
😎7 mai 2024 à 07:07 #74191michel c.ParticipantBonjour et merci, ça fonctionne. Pour exclure certains boutons et champs de la fonction EditReps j’ai modifié le script comme ceci :
for (var i=0; i<this.numFields; i++) { var nomChamp=this.getNthFieldName(i); if (this.getField("Menu.5").value!="Off") { this.getField("R.").display=display.visible; if (nomChamp.indexOf("Q.")!=0) {this.getField(nomChamp).readonly=false;} } else { this.getField(nomChamp).readonly=true; if (nomChamp.substring(0, 4)=="Menu") {this.getField("Menu.").readonly=false;} if (nomChamp.substring(0, 1)=="Q") {this.getField("Q.").readonly=false;} if (nomChamp.substring(0, 1)=="R") {this.getField("R.").display=display.hidden;} } }}
Je ne sais pas si c’est la meilleure méthode mais ça marche.
Sinon je me rend compte que j’ai un souci en cliquant sur Raz : s’il n’y a aucune annotation sur le document, la console renvoie l’erreur :
Doc:Open:6: TypeError: annots is null
Ce que je ne comprend pas d’ailleurs car dans la fonction EffAnnots il y a cette ligne :
if (this.getAnnots != null)
qui devrait éviter ce message d’erreur.- Cette réponse a été modifiée le il y a 7 mois et 3 semaines par michel c..
Attachments:
You must be logged in to view attached files.7 mai 2024 à 08:29 #74194MerlinMaître des clés“j’ai un souci en cliquant sur Raz : s’il n’y a aucune annotation sur le document, la console renvoie l’erreur :”
Dis toi que ça n’a aucune importance et que c’est juste une confirmation. 😉
7 mai 2024 à 09:59 #74195bebarthMaître des clésbonjour,
Pour vérifier qu’une chaine de caractères commence par une autre chaine de caractères, personnellement j’utilise indexOf==0 :
if (nomChamp.indexOf("Menu")==0)...
Avant j’utilisais startsWith() mais il me semble me rappeler avoir eu des soucis (existe aussi avec endsWith()) :
if (nomChamp.startsWith("Menu")...
https://www.w3schools.com/jsref/jsref_startswith.aspSi tu souhaites supprimer tous les commentaires, ce n’est pas la peine de vérifier tous les types.
Tu peux simplement écrire :
var annots=this.getAnnots();
if (annots) for (var j=0; j<annots.length; j++) annots[j].destroy();
@+
😎7 mai 2024 à 16:28 #74197michel c.ParticipantMerci, je viens de faire ces modifications. Maintenant j’ai un souci avec ma fonction Raz.
En gros, je souhaite
• que tous les champs “R.” soient cachés
• que tous les autres champs et boutons dont le 1er indice est supérieur à 1 soient cachés aussi
• que la couleur de fond de tous les champs “Q.” soit transparent
Voici mon script :
function Raz() {
for (var i=0; i<this.numFields; i++) {
var nomChamp=this.getNthFieldName(i);
this.getField("Erreurs").value = 0;
this.getField("Menu.5").value = 0;
if (nomChamp.indexOf("TQ.")==0) {this.getField("TQ.").display=display.hidden;}
if (nomChamp.indexOf("Question.")==0) {this.getField("Question.").display=display.hidden;
this.getField("Question").fillColor=color.transparent;}
if (nomChamp.indexOf("Aide.")==0) {this.getField("Aide.").display=display.hidden;}
if (nomChamp.indexOf("Verifier.")==0) {this.getField("Verifier.").display=display.hidden;}
if (nomChamp.indexOf("Recommencer.")==0) {this.getField("Recommencer.").display=display.hidden;}
if (nomChamp.indexOf("R.")==0) {this.getField("R.").display=display.hidden;}
if (nomChamp.indexOf("TQ.1")==0) {this.getField("TQ.1").display=display.visible;}
if (nomChamp.indexOf("Question.1")==0) {this.getField("Question.1").display=display.visible;}
if (nomChamp.indexOf("Aide.1")==0) {this.getField("Aide.1").display=display.visible;}
if (nomChamp.indexOf("Verifier.1")==0) {this.getField("Verifier.1").display=display.visible;}
if (nomChamp.indexOf("Recommencer.1")==0) {this.getField("Recommencer.1").display=display.visible;}
}
}
Je ne comprend pas trop pourquoi ça ne fonctionne pas…
- Cette réponse a été modifiée le il y a 7 mois et 3 semaines par michel c..
Attachments:
You must be logged in to view attached files.7 mai 2024 à 18:12 #74200bebarthMaître des clésque tous les champs “R.” soient cachés
if (nomChamp.indexOf("R.")==0) {this.getField(nomChamp).display=display.hidden;}
que la couleur de fond de tous les champs “Q.” soit transparent
if (nomChamp.indexOf("Q.")==0) {this.getField(nomChamp).fillColor=color.transparent;}
que tous les autres champs et boutons dont le 1er indice est supérieur à 1 soient cachés aussi
Il faut capturer le nombre entre le premier et deuxième point avec indexOf et si c’est un chiffre ou nombre supérieur à 1,
var n1=nomChamp.indexOf(".");
var n2=nomChamp.lastIndexOf(".");
if (Number(nomChamp.substring(n1+1,n2))>1) {this.getField(nomChamp).display=display.hidden;}
Essaye ça et tu mes dis !
@+
😎7 mai 2024 à 21:55 #74202michel c.ParticipantBonjour, ça ne fonctionne pas. Aucun message d’erreur sur la console mais rien ne se passe.
Attachments:
You must be logged in to view attached files.8 mai 2024 à 09:08 #74204bebarthMaître des clésbonjour,
J’ai peut-être pas bien compris, mais ça a l’air de fonctionner…@+
😎Attachments:
You must be logged in to view attached files.8 mai 2024 à 09:55 #74207michel c.ParticipantEffectivement, je viens de vérifier avec adobe Acrobat DC et ça fonctionne.
ça ne fonctionne pas avec PDF XChange editor (logiciel pour lequel nous avons la licence…)
Je vais essayer de voir s’il existe un autre moyen d’arriver à mes fins…
- Cette réponse a été modifiée le il y a 7 mois et 3 semaines par michel c..
8 mai 2024 à 13:15 #74210bebarthMaître des clésPeut-être une commande JavaScript qui ne fonctionne pas avec PDF XChange editor !
Il faut les tester une à une…@+
😎8 mai 2024 à 19:09 #74211bebarthMaître des clésMeni.5 est une case à cocher, if faut donc la mettre = “Off” et non =0.
… et ça fonctionne avec PDF XChange editor !Tu peux sortir l’initialisation des champs “Erreurs” et “Menu.5” de la boucle. Ça ne sert pas à grand chose que ces champs soient initialisés X fois…
@+
😎- Cette réponse a été modifiée le il y a 7 mois et 3 semaines par bebarth.
Attachments:
You must be logged in to view attached files.9 mai 2024 à 17:05 #74214michel c.ParticipantBonjour, j’ai peut être une idée mais j’ai besoin d’un bout de code.
J’ai des champs qui se nomment par exemple “Question.a.b” pour lesquels les nombres a et b sont compris entre 1 et un nombre qui varient en fonction du document.
Le nombre a détermine le nombre de question dans le document et le nombre b le nombre de “sous-question” pour chacune d’entre elles.
Comment faire pour extraire ces nombres dans 2 variables.
Par exemple si
- à la question 1 j’ai 2 champs qui se nomment”Question.1.0″ et “Question.1.1”
- à la 2ème j’ai 3 champs qui se nomment”Question.2.0″ ; “Question.2.1” et “Question.2.2”
- à la 3ème j’ai 3 champs qui se nomment”Question.3.0″ ; “Question.3.1” et “Question.3.2”
il faudrait que je puisse faire
- une boucle for pour la question 1 ou la variable b est comprise entre 0 et 1
- une boucle for pour la question 2 ou la variable b est comprise entre 0 et 2
- une boucle for pour la question 3 ou la variable b est comprise entre 0 et 2
Le nombre de boucles dépendra de la variable a qui détermine le nombre de questions
Merci
9 mai 2024 à 18:03 #74215bebarthMaître des clésPour récupérer a & b tu fais comme précédemment !
var nomChamp="Question.12.25";
var n1=nomChamp.indexOf(".");
var n2=nomChamp.lastIndexOf(".");
var a=Number(nomChamp.substring(n1+1,n2));
var b=Number(nomChamp.substring(n2+1));
console.println("a : "+a);
console.println("b : "+b);
@+
😎13 mai 2024 à 10:23 #74216michel c.ParticipantJ’ai réussi grâce à vous à corriger certains bugs (j’avais mal lu la réponse de BB du 8 mai 2024 à 19:09)
J’ai un autre souci (j’espère que c’est le dernier) : mes menus déroulants se remettent sur le 1er item tout le temps (alors que je voudrais que ce soit le cas uniquement si je clique sur Raz ou sur Default).
J’ai passé mes scripts en revue et je ne vois pas trop ou ça cloche. J’ai désactivé pour voir le code
this.getField(nomChamp).value=this.getField(nomChamp).getItemAt(0,false);
à la ligne 8 du script Default pour voir mais le problème n’est pas là…Attachments:
You must be logged in to view attached files.13 mai 2024 à 10:27 #74218michel c.ParticipantJe viens de trouver ! Certains champs contenaient encore le code Default(); en action de validation et/ou calcul.
13 mai 2024 à 10:53 #74219michel c.ParticipantUne question : j’aimerais proposer 3 choix de couleurs par liste déroulante (les valeurs d’export seront red, blue et green)
Dans mon script, pour l’affichage des mauvaises réponses en couleur j’ai mis ces lignes :
var colorErr = this.getField(“Menu.11”).value;
this.getField(“Q.”+n+”.”+a).fillColor=color.colorErr;
Mais ça n’a pas l’air de fonctionner.
Merci
13 mai 2024 à 11:52 #74220bebarthMaître des clésbonjour,
“color” est un objet, donc il faut écrire :
...
this.getField("Q."+n+"."+a).fillColor=eval("color."+colorErr);
...
pour que la valeur d’exportation du menu déroulant associée à “color” soit interprétée correctement.
@+
😎13 mai 2024 à 13:28 #74223MerlinMaître des clésPour détecter la couleur attribuée il faut utiliser “equal”.
Exemple :
if (color.equal(event.target.fillColor, color.red)) {event.target.fillColor = color.green;}
// ou
if (color.equal(event.target.textColor, ["RGB", 255/255, 0/255, 0/255])) {event.target.textColor = ["RGB", 0/255, 255/255, 0/255];}
13 mai 2024 à 14:46 #74224michel c.Participant14 mai 2024 à 06:57 #74228michel c.ParticipantBonjour afin d’apporter une enième modif, j’ai un petit bout de code qui me manque :
J’ai n boutons qui se nomment Verifier.1 ; verifier.2……verifier.n le nombre n peuf varier en fonction du type d’exercice que je mettrais en place.
J’aimerais lancer une fonction (qui s’appele VerifFinale) pour la valeur de n maximale (le dernier bouton verifier de mon document).
Quel code me permettrait de lancer cette fonction?
Merci
14 mai 2024 à 10:16 #74229MerlinMaître des clésBonjour
Ce script permet de compter le nombre de champs “Verifier.n” dans le document, ensuite tu récupères la variable “nCompt” pour ta fonction.
var nCompt = 0;
for (var i = 0 ; i < this.numFields ; i++) {
var oChamp = this.getField(this.getNthFieldName(i));
if ((oChamp.type == "button") && (/Verifier/.test(oChamp.name))) {nCompt = nCompt + 1;}
}
app.alert("Il y a " + nCompt + " boutons Vérifier dans ce document");
14 mai 2024 à 13:16 #74230bebarthMaître des clésBonjour,
Je dirais même plus …/Verifier\./.test(oChamp.name)… avec le point (échappé à l’aide d’une barre oblique inversée ou backslash) pour être certain que le nom n’est que “Verifier” !Lorsqu’on veut vérifier les indices et que l’on compte le nombre de champs il faut être certain qu’ils sont tous consécutif.
Je dis ça car je me suis déjà fait avoir plusieurs fois pensant qu’ils l’étaient et qu’au final ils ne l’étaient pas.
Dans ce cas il faut mettre tous les indices dans une table puis les trier car ils ne sont pas forcément ajoutés dans la table dans le bon ordre…@+
😎- Cette réponse a été modifiée le il y a 7 mois et 2 semaines par bebarth.
14 mai 2024 à 15:05 #74232michel c.ParticipantMerci beaucoup.
Il y a un bug que je ne comprend pas :
Quand je répond aux questions, pour l’avant dernière bien que mettant la bonne réponse, je dois m’y prendre en 2 fois pour que cette réponse soit validée.
Au 1er essai, le menu déroulant se remet en position 1 lorsque je clique sur valider.
Je n’ai pas ce problème pour les autres questions
Voici les bonnes réponses pour tester :
- question 1.1 → Rep 3
- question 1.2 → B
- question 2.1 → Rep 1
- question 2.2 → 45
Merci
- Cette réponse a été modifiée le il y a 7 mois et 2 semaines par michel c..
Attachments:
You must be logged in to view attached files.14 mai 2024 à 15:20 #74240michel c.ParticipantJ’ai trouvé !
14 mai 2024 à 16:00 #74245MerlinMaître des clésJe dirais même plus …/Verifier./.test(oChamp.name)… avec le point pour être certain que le nom n’est que “Verifier” !
Lorsqu’on veut vérifier les indices et que l’on compte le nombre de champs il faut être certain qu’ils sont tous consécutif.
En GREP le point tout seul signifie “n’importe quel caractère”, il faut donc l’échapper avec un antislash si on veut détecter le point.
Je n’ai pas mis le point dans mon script pour simplifier et parce-qu’il ne s’agissait que de compter le nombre de boutons, sans se soucier de leur ordre.
😉
14 mai 2024 à 16:22 #74247bebarthMaître des clésJ’avais compris qu’il fallait trouver l’indice n maxi qui n’est pas forcément le nombre d’indices… ni 1 le numéro mini d’ailleurs !
@+
😎14 mai 2024 à 20:30 #74248michel c.ParticipantJ’utilise la fonction verifier pour qu’à chaque question, l’élève puisse savoir s’il a fait tout juste et passer à la question suivante ou s’il a fait des erreurs et dans ce cas, il doit modifier ses réponses.
Auparavant j’avais une vérification spécifique pour la dernière question ou en plus de cela, une boite de dialogue s’ouvrait pour signaler à l’élève s’il a fait ou non trop d’erreurs par rapport aux objectifs définis par le prof. (pour éviter que l’élève teste toutes les réponses une à une bêtement).
Grâce à votre aide, j’ai une seule fonction verifier pour toutes les questions. Je compare l’indice du bouton verifier avec le nombre de boutons verifier (qui correspond à l’indice le plus élevé car les indices commencent à 1 et sont tous consécutifs).
var nCompt = 0;
for (var i = 0 ; i < this.numFields ; i++) {
var oChamp = this.getField(this.getNthFieldName(i));
if ((oChamp.type == "button") && (/Verifier./.test(oChamp.name))) {nCompt = nCompt + 1;}
}
var DerVer = nCompt-1;
......................
...................
if (n == DerVer) {
var errMax = this.getField("Menu.7").value;
var ErrCom = this.getField("Erreurs").value;
if (errMax<=ErrCom) {app.alert({cMsg:"Vous avez fait " + ErrCom + " erreur(s). Il fallait faire moins de " + errMax + " erreur(s)."
+"\r"+ " Recommencez le questionnaire", nIcon:2});}
if (errMax>ErrCom) {app.alert({cMsg:"Bravo, vous avez réussi en faisant moins de " + errMax + " erreur(s).", nIcon:2});}
ça fonctionne à merveille
Je dois encore vérifier les éventuels bugs que je n’aurais pas vus…
Il y en a un qui me donne du fil à retordre : à la fermeture du document les champs “Q.” (et qui sont des listes déroulantes) se mettent en position 1 et je ne comprend pas pourquoi.
C’est regrettable car un élève qui n’a pas le temps de terminer en classe devra recommencer depuis le début l’exercice.
J’avais essayé de pallier à ce problème en ajoutant cette ligne :
this.getField("Q.").readonly=true;
en script avant la fermeture et avant la sauvegarde du document mais ça ne fonctionne pas…
- Cette réponse a été modifiée le il y a 7 mois et 2 semaines par michel c..
- Cette réponse a été modifiée le il y a 7 mois et 2 semaines par michel c..
Attachments:
You must be logged in to view attached files.14 mai 2024 à 23:49 #74252MerlinMaître des clésIl y en a un qui me donne du fil à retordre : à la fermeture du document les champs “Q.” (et qui sont des listes déroulantes) se mettent en position 1 et je ne comprend pas pourquoi.
readonly ça n’empêche que les interactions avec l’utilisateur, pas avec les scripts.
J’ai testé en désactivant JavaScript : ce n’est pas à la fermeture du document, c’est lors de son ouverture que les listes déroulantes sont modifiées.
J’ai testé en ouvrant/fermant l’éditeur des scripts de document (qui se déclenchent à l’ouverture) pour forcer leur déclenchement : ça ne vient pas là.
Il est tard, et le mystère reste entier… 😉
15 mai 2024 à 09:44 #74253michel c.ParticipantJ’ai trouvé quel script est en cause : c’est le script Default : lorsque je le supprime, les listes déroulantes ne sont plus initialisées à l’ouverture.
Reste à savoir pourquoi il s’exécute à l’ouverture.
Certains champs avaient encore la ligne de code Default(); en action de format. J’ai veillé à supprimer cette action sur les champs concernés…. Il y a un truc qui m’échappe
- Cette réponse a été modifiée le il y a 7 mois et 2 semaines par michel c..
Attachments:
You must be logged in to view attached files.15 mai 2024 à 10:02 #74256michel c.ParticipantJ’avais oublié un champ… Aide.1.1 c’est résolu !
15 mai 2024 à 18:00 #74258bebarthMaître des clésEn GREP le point tout seul signifie “n’importe quel caractère”, il faut donc l’échapper avec un antislash si on veut détecter le point.
Oups !!! J’ai modifié le post.
@+
😎15 mai 2024 à 18:16 #74259bebarthMaître des clésJ’ai lu en diagonale vite fait les scripts, et il y a quelque chose qui m’interpelle et que je ne comprends d’ailleurs pas pourquoi il n’y a pas d’erreur retournée.
Lorsque tu écris :
...
if (nomChamp.indexOf("Q.")==0) {
this.getField("Q.").readonly=false;
...
La première ligne signifie “si le nom du champ commence par Q.” (Q suivi d’un point quel que soit un indice à la suite). Si on avait voulu uniquement “Q.” on aurait écritif (nomChamp=="Q.")
et on n’aurait pas eu besoin de mettre cette ligne dans une boucle.La deuxième ligne devrait être
this.getField(nomChamp).readonly=false;
car il n’y a pas de champ qui se nomme uniquement “Q.” !
Ça peut également fonctionner avecthis.getField("Q").readonly=false;
(sans le point) pour exécuter le script sur l’ensemble des champs “Q” avec un indice.Et ce, plusieurs fois dans tous les scripts, et idem pour les champs qui commencent par “R.”
@+
😎Attachments:
You must be logged in to view attached files.15 mai 2024 à 20:44 #74261michel c.ParticipantBonsoir. Je pense avoir compris ce que tu dit et effectivement ça me parait logique.
Par contre j’ai modifié le script Defaut comme ceci :
function Default() {
for (var i=0; i<this.numFields; i++) {var nomChamp=this.getNthFieldName(i);}
if (nomChamp=="Q.") {this.getField(nomChamp).readonly=false;
if (this.getField(nomChamp).type=="text") {this.getField(nomChamp).defaultValue="";}
else {this.getField(nomChamp).value=this.getField(nomChamp).getItemAt(0,false);}
}
if (nomChamp=="R.") {this.getField(nomChamp).defaultValue=this.getField(nomChamp).value;}
}
Et là ça ne fonctionne plus. Lorsque je modifie par exemple le champ R.1.1 et que je clique sur le bouton pour appliquer les valeurs par défaut, la valeur par défaut de ce champ reste inchangée.
Attachments:
You must be logged in to view attached files.15 mai 2024 à 21:07 #74263michel c.ParticipantEt curieusement avec cette erreur ça fonctionne (je viens d’ailleurs de m’apercevoir que j’avais oublié certains champs pour les valeurs par défaut)
Je sais que parfois je me complique la vie dans certains scripts. C’est du à une mauvaise maitrise du langage : souvent grâce à vous j’implémente des bouts de scripts voire des scripts complets dans mes documents. J’essaye parfois de modifier certains d’entre eux pour arriver à mes fins en me faisant une idée fausse de la signification du code.
Voici l’interprétation que je me fais du script Default :
//boucle entre la variable i=0 et i<nombre de champs
for (var i=0; i<this.numFields; i++) {
//déclaration de la variable nomchamp qui prend pour valeur le nom de chaque champs du formulaire
var nomChamp=this.getNthFieldName(i);
//si la première occurence d'un champ est "Q."
if (nomChamp.indexOf("Q.")==0) {
//alors les champs dont les noms commencent par "Q." ne seront pas en lecture seule
this.getField("Q.").readonly=false;
//de plus, si ces champs sont de type texte alors leur valeur par défaut ser ""
if (this.getField(nomChamp).type=="text") {this.getField(nomChamp).defaultValue="";}
// sinon l'item 0 mettre l'item 0 comme valeur pour les champs qui ne sont pas de type texte
else {this.getField(nomChamp).value=this.getField(nomChamp).getItemAt(0,false);}
}
//si la première occurence d'un champ est "R." alors la valeurs de chacun de ces champs deviendra la valeur par défaut
if (nomChamp.indexOf("R.")==0) {this.getField(nomChamp).defaultValue=this.getField(nomChamp).value;}
- Cette réponse a été modifiée le il y a 7 mois et 2 semaines par michel c..
- Cette réponse a été modifiée le il y a 7 mois et 2 semaines par michel c..
- Cette réponse a été modifiée le il y a 7 mois et 2 semaines par michel c..
- Cette réponse a été modifiée le il y a 7 mois et 2 semaines par michel c..
Attachments:
You must be logged in to view attached files.16 mai 2024 à 00:40 #74269MerlinMaître des clésTu peux simplifier le script ci-dessus ainsi :
// les champs dont les noms commencent par "Q." ne seront pas en lecture seule
this.getField("Q").readonly=false;
//de plus, si ces champs sont de type texte alors leur valeur par défaut sera ""
// sinon l'item 0 mettre l'item 0 comme valeur pour les champs qui ne sont pas de type texte
// si la valeur par défaut des champ texte est "" et que la valeur
// par défaut des listes est le premier item il suffit d'écrire :
this.getField("Q").value=this.getField("Q").defaultValue;//si la première occurrence d'un champ est "R." alors la valeur de chacun de ces champs deviendra la valeur par défaut
this.getField("R").defaultValue=this.getField("R").value;- Cette réponse a été modifiée le il y a 7 mois et 2 semaines par Merlin. Raison: Rectification
16 mai 2024 à 08:31 #74270bebarthMaître des clésbonjour,
Effectivement si tu veux traiter tous les champs il n’y a pas besoin de mettre de condition sur la recherche du nom de champ !@+
😎16 mai 2024 à 10:36 #74280MerlinMaître des clésOTAN pour moi, je viens de vérifier et j’ai barré ce qui ne fonctionne pas ci-dessus. D’où l’intérêt de toujours vérifier avant de poster 😉
Les propriétés “value” et “defaultValue” ne peuvent pas être modifiée depuis le champ (virtuel) parent, ce qui a du sens car ce sont des propriétés individuelles et particulières à chaque champ, contrairement aux propriétés d’aspect, de verrouillage, etc.
Dans ce cas il faut effectivement utiliser une boucle.
16 mai 2024 à 12:55 #74282bebarthMaître des clésOTAN pour moi, je viens de vérifier et j’ai barré ce qui ne fonctionne pas ci-dessus. D’où l’intérêt de toujours vérifier avant de poster
…et de vérifier correctement !!! La dernière fois avec l’exemple en GREP, j’avais bien testé avec un point, mais comme un point signifie n’importe quel caractère ça fonctionnait forcément !
@+
😎16 mai 2024 à 20:33 #74284michel c.ParticipantBon, en tout cas j’ai un formulaire qui fonctionne en grande partie grâce à vous. Merci beaucoup
16 mai 2024 à 21:02 #74285MerlinMaître des clés🙂
21 mai 2024 à 22:47 #74294michel c.ParticipantBonjour, je ne sais pas si j’aurais du ouvrir un autre fil pour cette question vu que ce document fonctionne bien maintenant.
Je pensais à améliorer un bout de code dans ce document :
Pour vérifier qu’une réponse est bonne, la ligne de code est la suivante :
if (this.getField("Q."+n+"."+a).value == this.getField("R."+n+"."+a).value)
Ici la valeur saisie dans le champ Q.n.a doit être identique à celle du champ R.n.a
Imaginons que je souhaite que plusieurs réponses soient acceptées. serait il possible que dans le champ R.n.a toutes les réponses acceptables soient séparées par exemple par ### (exemple si on demande la saisie du mot clé ; comme celui-ci a 2 orthographes : clé ou clef), j’aimerais qu’en mettant
clé###clef
dans le champ R.n.a, si l’utilisateur saisit clé ou clef dans le champ Q.n.a sa réponse soit considérée comme bonne (dans l’exemple, il y a 2 réponses acceptables mais dans mon idée il pourrait aussi y en avoir plus.Comment modifier cette ligne :
if (this.getField("Q."+n+"."+a).value == this.getField("R."+n+"."+a).value)
pour faire cela ?Si c’est faisable bien sur.
Merci
22 mai 2024 à 09:06 #74295bebarthMaître des clésbonjour,
Il faut écrire une expression régulière :
var lesMots=this.getField("R."+n+"."+a).value.replace(/###/g,"|");
var RegExTest=new RegExp("^"+lesMots+"$");
if (RegExTest.test(this.getField("Q."+n+"."+a).value))...
Et si tu sépares tes mots par une barre verticale “|” (clé|clef) tu peux directement écrire :
var RegExTest=new RegExp("^"+this.getField("R."+n+"."+a).value+"$");
if (RegExTest.test(this.getField("Q."+n+"."+a).value))...
@+
😎23 mai 2024 à 22:37 #74296michel c.Participant24 mai 2024 à 06:49 #74301michel c.ParticipantJ’ai parlé un peu vite, j’ai fait un quiz pour tester un peu ça et je ne comprend pas pourquoi j’ai 6 erreurs à la page 4… Aucune erreur à la console pourtant…
24 mai 2024 à 12:12 #7430224 mai 2024 à 14:30 #74303MerlinMaître des clésBonjour
J’aurais aimé t’aider mais sur la page 4 je ne comprend même pas les questions 😉
Par-contre il y a une faute en bas à droite : “Surface shérique”, je suppose qu’il manque un “p”.
Et j’ai une question : comment fais tu pour centrer les items des menus déroulants de la page 2 (géographie) ?
Merci
24 mai 2024 à 16:04 #74304bebarthMaître des clésbonjour,
Après avoir jeté un coup d’œil sur le script, je ne trouvais pas !!!
Puis, je me suis aperçu que si on mettait des valeurs simples dans les champs ça fonctionnait et que tous les champs qui ne fonctionnaient pas contenaient des parenthèses… Eurêka !!!Lorsqu’on crée l’expression régulière, il faut échapper certains caractères pour qu’ils soient interprétés correctement, donc :
var RegExTest=new RegExp("^"+this.getField("R."+n+"."+a).value.replace(/[.*+?^${}()|/\[\]\\]/g,"\\$&")+"$");
@+
😎PS : Le fichier ne passe pas, je te laisse donc faire la modification…
- Cette réponse a été modifiée le il y a 7 mois par bebarth.
25 mai 2024 à 15:03 #74306michel c.ParticipantCa fonctionne . J’ai du modifier la ligne de code proposée pour cela.
var RegExTest=new RegExp("^"+this.getField("R."+n+"."+a).value.replace(/[.*+?^${}()/\[\]\\]/g,"\\$&")+"$");
Le caractère | ne doit pas être échappé pour que cela marche.
Merci beaucoup
- Cette réponse a été modifiée le il y a 7 mois par michel c..
25 mai 2024 à 16:47 #74308bebarthMaître des clésC’est étrange car le caractère | (ou) est utilisé dans les expressions régulières, et ça fonctionne chez moi…
Remarque, si tu es certain de ne pas utiliser ce caractère dans tes réponses il ne sera pas nécessaire !
@+
😎5 juin 2024 à 19:32 #74342michel c.ParticipantCa fonctionne . J’ai du modifier la ligne de code proposée pour cela.
var RegExTest=new RegExp("^"+this.getField("R."+n+"."+a).value.replace(/[.*+?^${}()/\[\]\\]/g,"\\$&")+"$");
Le caractère | ne doit pas être échappé pour que cela marche. Merci beaucoup LienBonjour, j’ai parlé trop vite, cette ligne de code génère une erreur si la réponse attendue est un nombre ; voici le message d’erreur :
Doc:Open:22: TypeError: this.getField(...).value.replace is not a function
Dans l’exemple la réponse attendue à la question 2.2 est 123. Dans ce cas si je clique sur vérifier j’ai ce message d’erreur.
Par contre s’il y a 2 réponses acceptables (si je saisis 123|124 dans le champ R.2.2) alors lorsque je clique sur vérifier je n’ai aucun message d’erreur…
Attachments:
You must be logged in to view attached files.5 juin 2024 à 20:49 #74344bebarthMaître des clésIl faut utiliser « valueAsString » au lieu de « value ». « replace » fonctionne avec une chaîne de caractères mais pas avec un nombre.
123 est un nombre alors que 123|124 est une chaîne de caractères. « valueAsString » transforme le nombre en chaîne de caractères !
@+
😎 - Les champs R.1.n et R.2.n déclenchent deux fois la fonction “Defaut”, en script de format et en script de touche. À mon avis c’est une fois de trop.
-
AuteurRéponses
- Vous devez être connecté pour répondre à ce sujet.