Donnez vie à vos documents numériques !
 

Problème de lancement d’un script

abracadabraPDF Forums PDF – Général Problème de lancement d’un script

  • Créateur
    Sujet
  • #75042
    michel c.
    Participant

    Bonjour, j’utilise dans un document un script (random) que vous m’avez aidé à faire.

    Celui-ci est lancé par un bouton (Demarrer) auquel est associé un script :

    for (var i=1; i<=30; i++) {
    try {
    random (i);
    } catch(e) {
    this.getField("Var."+i+".3").value="";
    }
    }

    J’aimerais que ce script (qui génère des valeurs aléatoires et les affecte à des variables) ne soit pas lancé par un bouton mais via une condition dans un script.

    En l’occurrence via le script vérifier si la condition (errMax<=ErrCom) est respectée (ligne 75)

    Je n’ai aucune erreur mais je n’ai pas de nouvelles valeurs pour les variables angle et AB…

     

    Merci

    • Ce sujet a été modifié le il y a 1 semaine et 1 jour par michel c..
    • Ce sujet a été modifié le il y a 1 semaine et 1 jour par michel c..
    • Ce sujet a été modifié le il y a 1 semaine et 1 jour par michel c..
    Attachments:
    You must be logged in to view attached files.
Affichage de 24 réponses de 1 à 24 (sur un total de 24)
  • Auteur
    Réponses
  • #75048
    Merlin
    Maître des clés

    Bonjour

     

    Dans ton document il y a 25 scripts de document, donc je n’ai pas cherché la ligne 75… 😉

    Sinon, met ton script en fonction dans un script de document :

    function aleatoir() {
    for (var i=1; i<=30; i++) {
    try {
    random (i);
    } catch(e) {
    this.getField("Var."+i+".3").value="";
    }
    }
    }

    Et appelle cette fonction via la condition (if else).

    #75049
    michel c.
    Participant

    Bonjour, je viens de tester en ajoutant le script aleatoir en script de document et en appelant ce script à la 3ème ligne de mon script Raz.

    Lorsque je clique sur le bouton Raz (en bas à gauche) je n’ai aucune erreur à la console mais les variables angle et AB ne sont pas affectées par de nouvelles valeurs.

    Alors que lorsque je clique sur le bouton demarrer, auquel j’ai affecté la fonction random, de nouvelles valeurs pour les variables sont générées.

    Merci

    Attachments:
    You must be logged in to view attached files.
    #75061
    bebarth
    Maître des clés

    bonjour,
    Pour trouver l’erreur :

    1. Tu lances tes fonctions une à une.
    2. Tu t’aperçois que dès la première fonction Default() ça se plante… en ligne 17
      if (nomChamp.indexOf("Menu.")==0) {this.getField(nomChamp).defaultValue="";}
    3. Il y a des champs “Menu.” qui sont des champs texte et d’autre des menus déroulants dont la valeur par défaut n’est pas vide. C’est pour cela que ça plante.
    4. Il faut donc vérifier le type de champ.

    @+
    😎

    #75071
    michel c.
    Participant

    J’ai corrigé mon script Default mais ça ne fonctionne toujours pas.

    J’ai crée un un bouton qui appele simplement la fonction aleatoir et ça ne fonctionne pas non plus.

    Lorsque le code :

    for (var i=1; i<=30; i++) {
    try {
    random (i);
    } catch(e) {
    this.getField("Var."+i+".3").value="";
    }
    }

    est affecté au bouton, ça fonctionne (Bouton Demarrer) mais lorsque ce même code est en action de document, et que j’appele cette fonction ça ne marche plus (bouton aleatoir)

    Merci

    Attachments:
    You must be logged in to view attached files.
    #75074
    Merlin
    Maître des clés

    Bonjour

     

    Il existe une fonction nommée “random” dans tes scripts, et il est fort possible que “random” fasse partie des mots réservés. Il faudrait donc commencer par changer ce nom.

    #75075
    bebarth
    Maître des clés

    bonjour,
    Pour connaitre l’erreur, il faut dans un premier temps savoir d’où elle vient.
    Vu que tous tes scripts sont des fonctions lancées depuis un bouton, le plus simple est de les tester une par une, et on s’aperçoit que ça plante dès la première fonction “Default()”.
    Ensuite, il faut savoir quelle ligne n’est pas correcte, et vu que toutes les lignes font référence à des propriétés de champs, c’est certainement qu’une de ces propriétés n’est pas adaptée au champ concerné.
    J’ai donc rajouté une ligne en début de boucle qui permet de voir sur quel champ ça cloche :
    for (var i=0; i<this.numFields; i++) {
    var nomChamp=this.getNthFieldName(i);
    console.println(i+" - nomChamp : "+nomChamp+" - "+(this.getField(nomChamp).page+1)+" - "+this.getField(nomChamp).type);
    ...

    Et on s’aperçoit que c’est sur un champ liste (combobox)…
    Effectivement, si tu as une liste où aucun élément n’est sélectionné à l’origine, il n’a pas de valeur par défaut. Ici tu as donc 2 solutions : soit tu sélectionnes le point d’interrogation qui devient ta valeur par défaut ou en dernière ligne tu exclus que ce soit un champ de type “combobox” :
    if (this.getField(nomChamp).type!="combobox") this.getField(nomChamp).defaultValue=this.getField(nomChamp).value;

    @+
    😎

    #75076
    michel c.
    Participant

    Merci pour les réponses.


    @BB
    : J’ai modifié mon script Default ainsi

    function Default() {

    for (var i=0; i<this.numFields; i++) {
    var nomChamp=this.getNthFieldName(i);
    //console.println(i+" - nomChamp : "+nomChamp+" - "+(this.getField(nomChamp).page+1)+" - "+this.getField(nomChamp).type);

    if (nomChamp.indexOf("R.")==0) {
    if (this.getField(nomChamp).type=="text") this.getField(nomChamp).defaultValue=this.getField(nomChamp).value;
    if ((this.getField(nomChamp).type=="checkbox" || this.getField(nomChamp).type=="radiobutton")) this.getField(nomChamp).defaultValue=this.getField(nomChamp).value;
    }

    if (nomChamp.indexOf("Q.")==0) {
    if (this.getField(nomChamp).type=="text") {this.getField(nomChamp).value="";}
    if ((this.getField(nomChamp).type=="checkbox" || this.getField(nomChamp).type=="radiobutton")) this.getField(nomChamp).value="Off";
    if (this.getField(nomChamp).type=="combobox") {this.getField(nomChamp).value=this.getField(nomChamp).getItemAt(0,false);}
    }

    if (nomChamp.indexOf("Titre.")==0) {this.getField(nomChamp).defaultValue=this.getField(nomChamp).value;}
    if (nomChamp.indexOf("TQ.")==0) {this.getField(nomChamp).defaultValue=this.getField(nomChamp).value;}
    if (nomChamp.indexOf("Question.")==0) {this.getField(nomChamp).defaultValue=this.getField(nomChamp).value;}
    if (nomChamp.indexOf("Aide." && this.getField(nomChamp).type=="text")==0) {this.getField(nomChamp).defaultValue=this.getField(nomChamp).value;}

    if (nomChamp.indexOf("TL.")==0 && this.getField(nomChamp).type=="text") {this.getField(nomChamp).defaultValue="";}

    if (nomChamp.indexOf("Menu.")==0) {
    this.getField("Menu.3").fillColor=color.green;
    this.getField("Menu.4").fillColor=color.green;
    if (this.getField(nomChamp).type=="text") this.getField(nomChamp).defaultValue=this.getField(nomChamp).value;
    if ((this.getField(nomChamp).type=="checkbox" || this.getField(nomChamp).type=="radiobutton")) this.getField(nomChamp).value="Off";
    }

    }}

    Dans la 1ère condition (ligne 7 à 10) et pour la dernière (ligne 25 à 30) je ne sais pas comment écrire : si le champ est de type combobox alors la valeur par defaut sera la valeur sélectionnée dans la combobox.

    Pour le reste, je crois avoir compris ce qui pose problème, je pense que ça fonctionne. Le fichier est en pj

    @ Merlin :

    J’ai renomé la fonction random → hasard

    J’ai crée un formulaire avec uniquement ces 2 scripts pour que ce ne soit pas pollué par d’autres scripts de mon pdf qui en contient énormément et j’ai toujours le même problème :

    cela fonctionne quand j’appele la fonction via le script du bouton  démarrer

    mais ça ne fonctionne plus quand j’apelle la fonction par la commande aleatoir(); (bouton Aleatoir)

    Fichier (aleatoir) en piece jointe

     

    Attachments:
    You must be logged in to view attached files.
    #75079
    Merlin
    Maître des clés

    J’ai l’habitude de mettre toutes mes fonctions ensembles dans un seul fichier texte et ensuite de tout copier-coller dans un seul script de document.

    Après avoir cherché l’erreur en vain pendant de longues minutes c’est quand j’ai fait ça avec tes deux fonctions, car je trouve ça plus pratique, que l’évidence m’a sauté aux yeux :

    dans la fonction “aleatoir” l’indice “i” est déclaré avec “var”, donc il est enfermé dans cette fonction et ne peut pas communiquer avec une autre fonction. Ce qui condamne la fonction “hasard/random” à l’échec systématique.

    Quand elle est appelée directement depuis le bouton ça fonctionne car dans ce cas l’indice “var i” n’est pas enfermé dans une fonction.

    Donc dans la fonction “aleatoir” il faut juste supprimer “var” en deuxième ligne pour que ça fonctionne :

    function aleatoir() {
    for (i=1; i<=30; i++) {
    // etc

    Ci-joint.

     

     

    Attachments:
    You must be logged in to view attached files.
    #75081
    Merlin
    Maître des clés

    Concernant la fonction “defaut”, je n’ai pas bien compris pourquoi mais pour les combobox l’égalité “defaultValue = value” ne fonctionne pas directement, il passer par une variable.

    Par-contre ce qui est certain car c’est précisé dans la doc c’est qu’il faut cocher l’option “Autoriser l’utilisateur à saisir un texte personnalisé” pour chaque combobox concerné sinon ça ne peut pas fonctionner.

    Fait attention à une chose : quand tu testes des conditions avec trois “if” qui se suivent tu obliges le script à tester tous les champs trois fois, alors qu’avec “else if” la deuxième condition n’est testée que si la première n’est pas remplie, et la troisième n’est testée que si la première et la deuxième ne sont pas remplies.

    “else if” est donc un gain de temps qui permet d’accélérer l’exécution des scripts.

     

    function Default() {

    var sText;

    for (var i=0; i<this.numFields; i++) {
    var nomChamp=this.getNthFieldName(i);
    //console.println(i+" - nomChamp : "+nomChamp+" - "+(this.getField(nomChamp).page+1)+" - "+this.getField(nomChamp).type);

    if (nomChamp.indexOf("R.")==0) {
    if (this.getField(nomChamp).type=="text") this.getField(nomChamp).defaultValue=this.getField(nomChamp).value;
    else if ((this.getField(nomChamp).type=="checkbox" || this.getField(nomChamp).type=="radiobutton")) this.getField(nomChamp).defaultValue=this.getField(nomChamp).value;
    else if (this.getField(nomChamp).type=="combobox") {sText = this.getField(nomChamp).value; this.getField(nomChamp).defaultValue = sText;}
    }

    if (nomChamp.indexOf("Q.")==0) {
    if (this.getField(nomChamp).type=="text") {this.getField(nomChamp).value="";}
    else if ((this.getField(nomChamp).type=="checkbox" || this.getField(nomChamp).type=="radiobutton")) this.getField(nomChamp).value="Off";
    else if (this.getField(nomChamp).type=="combobox") {this.getField(nomChamp).value=this.getField(nomChamp).getItemAt(0,false);}
    }

    if (nomChamp.indexOf("Titre.")==0) {this.getField(nomChamp).defaultValue=this.getField(nomChamp).value;}
    if (nomChamp.indexOf("TQ.")==0) {this.getField(nomChamp).defaultValue=this.getField(nomChamp).value;}
    if (nomChamp.indexOf("Question.")==0) {this.getField(nomChamp).defaultValue=this.getField(nomChamp).value;}
    if (nomChamp.indexOf("Aide." && this.getField(nomChamp).type=="text")==0) {this.getField(nomChamp).defaultValue=this.getField(nomChamp).value;}

    if (nomChamp.indexOf("TL.")==0 && this.getField(nomChamp).type=="text") {this.getField(nomChamp).defaultValue="";}

    if (nomChamp.indexOf("Menu.")==0) {
    this.getField("Menu.3").fillColor=color.green;
    this.getField("Menu.4").fillColor=color.green;
    if (this.getField(nomChamp).type=="text") this.getField(nomChamp).defaultValue=this.getField(nomChamp).value;
    else if ((this.getField(nomChamp).type=="checkbox" || this.getField(nomChamp).type=="radiobutton")) this.getField(nomChamp).value="Off";
    else if (this.getField(nomChamp).type=="combobox") {sText = this.getField(nomChamp).value; this.getField(nomChamp).defaultValue = sText;}
    }

    }}

    #75082
    michel c.
    Participant

    Merci, je ne savais pas pour else if

    #75083
    michel c.
    Participant

    Pour mon 2ème souci, j’ai trouvé une façon détournée de résoudre ce problème.

    Obliger l’utilisateur à cliquer sur démarrer pour faire apparaître la première partie :

    Tant que l’utilisateur ne clique pas sur le bouton, Aucune question ne s’affiche…

    S’il clique sur le bouton, une réinitialisation s’opère avec de nouvelles variables.

    Par contre j’ai un autre souci, en cliquant sur ce bouton la boite de dialogue s’affiche pour demander confirmation.

    J’aimerais que si l’utilisateur répond Non, l’exécution du script s’arrête

    if (cResponse != "Oui") {app.alert("Opération annulée.");

    <strong>commande pour stopper l'exécution du script</strong>

    }

    Merci

    • Cette réponse a été modifiée le il y a 3 jours et 12 heures par michel c..
    Attachments:
    You must be logged in to view attached files.
    #75086
    Merlin
    Maître des clés

    var strAlertRaz = "Voulez vous vraiment supprimer le contenu de tous les champs de donn\u00E9es et revenir \u00E0 l'\u00E9tat initial du document ?\n\nCette action ne pourra pas \u00EAtre annul\u00E9e.\nSi besoin utilisez : menu Fichier : R\u00E9tablir";
    var strTitr = "TITRE";

    // si réponse = 3 = non
    if (app.alert({cMsg: strAlertRaz, cTitle: strTitr, nIcon: 2, nType: 2}) == 3) {
    app.alert("Opération annulée.");
    }
    else {this.resetForm();}

    #75087
    michel c.
    Participant

    Merci !

    #75088
    michel c.
    Participant

    Une question en passant : pour coder cette phrase ainsi : "Voulez vous vraiment supprimer le contenu de tous les champs de
    donn\u00E9es et revenir \u00E0 l'\u00E9tat initial du document
    ?\n\nCette action ne pourra pas \u00EAtre annul\u00E9e.\nSi besoin
    utilisez : menu Fichier : R\u00E9tablir"

    tu as un outil ou un lien qui te permet de faire ça rapidement ou tu connais par coeur l’unicode pour les caractères é ê ; à … et tu glisse ces codes au milieu des mots?

    Jusqu’à présent je mettais toute la phrase en unicode mais c’est plus compréhensible comme ça en relisant la phrase.

    #75089
    bebarth
    Maître des clés

    bonjour,
    Merlin partage un utilitaire gratuit que tu peux trouver ici :

    Texte vers Unicode

    @+
    😎

    #75090
    bebarth
    Maître des clés

    …Je ne suis pas certain d’avoir totalement compris !!!
    Si en fait tu veux uniquement modifier les caractères accentués, tu peux utiliser ce script dans la console :
    var leTexte="Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d'exquis rôtis de bœuf au kir à l'aÿ d'âge mûr & cætera !";
    for (var i=leTexte.length-1; i>=0; i--) {
    if (leTexte.charCodeAt(i)>128) var leTexte=leTexte.substr(0,i)+"\\u"+("0000"+leTexte.charCodeAt(i).toString(16).toUpperCase()).slice(-4)+leTexte.substr(i+1);
    }
    console.println("leTexte : "+leTexte);
    // Résultat : "D\u00E8s No\u00EBl o\u00F9 un z\u00E9phyr ha\u00EF me v\u00EAt de gla\u00E7ons w\u00FCrmiens je d\u00EEne d'exquis r\u00F4tis de b\u0153uf au kir \u00E0 l'a\u00FF d'\u00E2ge m\u00FBr & c\u00E6tera !"

    …et à l’inverse, pour récupérer un texte :
    var leTexte="D\u00E8s No\u00EBl o\u00F9 un z\u00E9phyr ha\u00EF me v\u00EAt de gla\u00E7ons w\u00FCrmiens je d\u00EEne d'exquis r\u00F4tis de b\u0153uf au kir \u00E0 l'a\u00FF d'\u00E2ge m\u00FBr & c\u00E6tera !";
    leTexte.replace(/(\\u\d{4})/g,parseInt("$1",16));
    console.println("leTexte : "+leTexte);
    // Résultat : "Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d'exquis rôtis de bœuf au kir à l'aÿ d'âge mûr & cætera !"

    @+
    😎

    #75091
    michel c.
    Participant

    Bonjour, je veux uniquement modifier les caractères accentués.

    Je ne savais pas du tout que l’on pouvait faire ça via la console….

    Merci

    #75092
    bebarth
    Maître des clés

    bonjour,
    Il faut donc utiliser le premier script. Vu qu’on ne traite que les caractères ascii>128 on peut même réduire le script à :
    var leTexte="Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d'exquis rôtis de bœuf au kir à l'aÿ d'âge mûr & cætera !";
    for (var i=leTexte.length-1; i>=0; i--) {
    if (leTexte.charCodeAt(i)>128) var leTexte=leTexte.substr(0,i)+"\\u"+("00"+leTexte.charCodeAt(i).toString(16)).toUpperCase()+leTexte.substr(i+1);
    }
    console.println("leTexte : "+leTexte);

    @+
    😎

    #75093
    Merlin
    Maître des clés

    Effectivement j’utilise l’utilitaire cité ci-dessus.

    C’est un ancien script que je t’ai donné, maintenant je ne perd plus de temps à ne convertir que les caractères accentués je converti toute la chaîne de caractères, et je laisse l’originale juste au-dessus sous forme de commentaire.

    Ainsi l’originale disparaît lors de la minification/optimisation du script avec tous les autres commentaires, comme ça je suis le seul à comprendre ce que fait le script et je complique la tâche de ceux qui veulent piquer ou détourner mes scripts 😉

    Exemple :

    // var strTitre = "COUCOU";
    // var strMessage = "Merci de renseigner les champs Date et Nom avant d'enregistrer ce document.";
    var strTitre = "\u0043\u004F\u0055\u0043\u004F\u0055";
    var strMessage = "\u004D\u0065\u0072\u0063\u0069\u0020\u0064\u0065\u0020\u0072\u0065\u006E\u0073\u0065\u0069\u0067\u006E\u0065\u0072\u0020\u006C\u0065\u0073\u0020\u0063\u0068\u0061\u006D\u0070\u0073\u0020\u0044\u0061\u0074\u0065\u0020\u0065\u0074\u0020\u004E\u006F\u006D\u0020\u0061\u0076\u0061\u006E\u0074\u0020\u0064\u0027\u0065\u006E\u0072\u0065\u0067\u0069\u0073\u0074\u0072\u0065\u0072\u0020\u0063\u0065\u0020\u0064\u006F\u0063\u0075\u006D\u0065\u006E\u0074\u002E";

    // MESSAGE D'ALERTE
    app.alert({cMsg:strMessage, nIcon: 1, cTitle: strTitre});}

     

    Et je met toujours les commentaires en capitales pour mieux les détacher du code et les rendre plus visibles

     

     

    #75094
    bebarth
    Maître des clés

    C’est également ce que je fait !

    @+
    😎

    #75095
    michel c.
    Participant

    Merci, je me suis servi de ton code pour me faire un document qui me sera utile.

    Attachments:
    You must be logged in to view attached files.
    #75100
    Merlin
    Maître des clés

    🙂

    #75106
    bebarth
    Maître des clés

    J’ai également écris un petit utilitaire !

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    #75115
    bebarth
    Maître des clés

    …je viens de m’apercevoir que l’expression régulière dans la version unicode->texte ne devrait pas être /(\\u\d{4})/g (pour 4 chiffres), mais /(\\[Uu][0-9A-Fa-f]{4})/g vu qu’en numérotation hexadécimale on a également des lettres (A à F) !!!
    Alors pourquoi ça fonctionne en ne recherchant que 4 chiffres ???

    @+
    😎

    • Cette réponse a été modifiée le il y a 1 heure et 37 minutes par bebarth.
Affichage de 24 réponses de 1 à 24 (sur un total de 24)
  • Vous devez être connecté pour répondre à ce sujet.