Donnez vie à vos documents numériques !
 

Exécution de fonction par bouton

abracadabraPDF Forums PDF – Général Exécution de fonction par bouton

  • Créateur
    Sujet
  • #74174
    michel 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.
Affichage de 53 réponses de 1 à 53 (sur un total de 53)
  • Auteur
    Réponses
  • #74176
    Merlin
    Maî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.
    #74179
    michel c.
    Participant

    Bonjour, 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.
    #74183
    bebarth
    Maître des clés

    bonjour,
    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…

    @+
    😎

    #74191
    michel c.
    Participant

    Bonjour 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.
    #74194
    Merlin
    Maî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. 😉

    #74195
    bebarth
    Maître des clés

    bonjour,
    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.asp

    Si 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();

    @+
    😎

    #74197
    michel c.
    Participant

    Merci, 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.
    #74200
    bebarth
    Maître des clés

    que 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 !

    @+
    😎

    #74202
    michel c.
    Participant

    Bonjour, ç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.
    #74204
    bebarth
    Maître des clés

    bonjour,
    J’ai peut-être pas bien compris, mais ça a l’air de fonctionner…

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    #74207
    michel c.
    Participant

    Effectivement, 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…

    Erreur

    • Cette réponse a été modifiée le il y a 7 mois et 3 semaines par michel c..
    #74210
    bebarth
    Maître des clés

    Peut-être une commande JavaScript qui ne fonctionne pas avec PDF XChange editor !
    Il faut les tester une à une…

    @+
    😎

    #74211
    bebarth
    Maître des clés

    Meni.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.
    #74214
    michel c.
    Participant

    Bonjour, 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

     

    #74215
    bebarth
    Maître des clés

    Pour 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);

    @+
    😎

    #74216
    michel c.
    Participant

    J’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.
    #74218
    michel c.
    Participant

    Je viens de trouver ! Certains champs contenaient encore le code Default(); en action de validation et/ou calcul.

    #74219
    michel c.
    Participant

    Une 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

     

    #74220
    bebarth
    Maître des clés

    bonjour,
    “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.

    @+
    😎

    #74223
    Merlin
    Maître des clés

    Pour 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];}

    #74224
    michel c.
    Participant

    Merci beaucoup, je pense toucher au but !

    Je cherche d’éventuels bugs que je n’aurai pas vu mais ça commence à prendre forme.

     

    • 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.
    #74228
    michel c.
    Participant

    Bonjour 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

    #74229
    Merlin
    Maître des clés

    Bonjour

     

    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");

    #74230
    bebarth
    Maître des clés

    Bonjour,
    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.
    #74232
    michel c.
    Participant

    Merci 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.
    #74240
    michel c.
    Participant

    J’ai trouvé !

    #74245
    Merlin
    Maître des clés

    Je 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.

    😉

    #74247
    bebarth
    Maître des clés

    J’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 !

    @+
    😎

    #74248
    michel c.
    Participant

    J’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.
    #74252
    Merlin
    Maître des clés

    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.

    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… 😉

    #74253
    michel c.
    Participant

    J’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.
    #74256
    michel c.
    Participant

    J’avais oublié un champ… Aide.1.1 c’est résolu !

    #74258
    bebarth
    Maître des clés

    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.

    Oups !!! J’ai modifié le post.

    @+
    😎

    #74259
    bebarth
    Maître des clés

    J’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 écrit if (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 avec this.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.
    #74261
    michel c.
    Participant

    Bonsoir. 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.
    #74263
    michel c.
    Participant

    Et 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.
    #74269
    Merlin
    Maître des clés

    Tu 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
    #74270
    bebarth
    Maître des clés

    bonjour,
    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 !

    @+
    😎

    #74280
    Merlin
    Maître des clés

    OTAN 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.

    #74282
    bebarth
    Maître des clés

    OTAN 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 !

    @+
    😎

    #74284
    michel c.
    Participant

    Bon, en tout cas j’ai un formulaire qui fonctionne en grande partie grâce à vous. Merci beaucoup

    #74285
    Merlin
    Maître des clés

    🙂

    #74294
    michel c.
    Participant

    Bonjour, 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

    #74295
    bebarth
    Maître des clés

    bonjour,
    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))...

    @+
    😎

    #74296
    michel c.
    Participant

    Merci ! ça marche. C’est top

    • Cette réponse a été modifiée le il y a 7 mois par michel c..
    • Cette réponse a été modifiée le il y a 7 mois par michel c..
    • Cette réponse a été modifiée le il y a 7 mois par michel c..
    Attachments:
    You must be logged in to view attached files.
    #74301
    michel c.
    Participant

    J’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…

    #74302
    michel c.
    Participant

    Ca sera mieux avec le fichier :

     

    Lien

    #74303
    Merlin
    Maître des clés

    Bonjour

     

    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

    #74304
    bebarth
    Maître des clés

    bonjour,
    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.
    #74306
    michel c.
    Participant

    Ca 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

     

    Lien

    • Cette réponse a été modifiée le il y a 7 mois par michel c..
    #74308
    bebarth
    Maître des clés

    C’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 !

    @+
    😎

    #74342
    michel c.
    Participant

    Ca 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 Lien

     

    Bonjour, 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.
    #74344
    bebarth
    Maître des clés

    Il 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 !

    @+
    😎

    • Cette réponse a été modifiée le il y a 6 mois et 3 semaines par bebarth.
    • Cette réponse a été modifiée le il y a 6 mois et 3 semaines par bebarth.
Affichage de 53 réponses de 1 à 53 (sur un total de 53)
  • Vous devez être connecté pour répondre à ce sujet.