abracadabraPDF › Forums › PDF – Général › Problème de lancement d’un script
- Ce sujet contient 26 réponses, 3 participants et a été mis à jour pour la dernière fois par Merlin, le il y a 2 mois.
-
CréateurSujet
-
10 octobre 2024 à 13:46 #75042michel 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 2 mois et 1 semaine par michel c..
- Ce sujet a été modifié le il y a 2 mois et 1 semaine par michel c..
- Ce sujet a été modifié le il y a 2 mois et 1 semaine par michel c..
Attachments:
You must be logged in to view attached files. -
CréateurSujet
-
AuteurRéponses
-
10 octobre 2024 à 17:56 #75048MerlinMaî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).
11 octobre 2024 à 09:42 #75049michel c.ParticipantBonjour, 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.11 octobre 2024 à 13:55 #75061bebarthMaître des clésbonjour,
Pour trouver l’erreur :- Tu lances tes fonctions une à une.
- 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="";}
- 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.
- Il faut donc vérifier le type de champ.
@+
😎14 octobre 2024 à 09:20 #75071michel c.ParticipantJ’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.14 octobre 2024 à 14:15 #75074MerlinMaître des clésBonjour
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.
14 octobre 2024 à 14:38 #75075bebarthMaître des clésbonjour,
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;
@+
😎14 octobre 2024 à 17:50 #75076michel c.ParticipantMerci pour les réponses.
@BB : J’ai modifié mon script Default ainsifunction 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.14 octobre 2024 à 23:55 #75079MerlinMaître des clésJ’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.15 octobre 2024 à 00:48 #75081MerlinMaître des clésConcernant 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;}
}
}}
15 octobre 2024 à 07:39 #75082michel c.ParticipantMerci, je ne savais pas pour else if
15 octobre 2024 à 08:54 #75083michel c.ParticipantPour 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 2 mois et 1 semaine par michel c..
Attachments:
You must be logged in to view attached files.15 octobre 2024 à 09:24 #75086MerlinMaître des clésvar 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();}
15 octobre 2024 à 09:34 #75087michel c.ParticipantMerci !
15 octobre 2024 à 14:31 #75088michel c.ParticipantUne 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.
15 octobre 2024 à 14:52 #75089bebarthMaître des clés15 octobre 2024 à 16:21 #75090bebarthMaî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 !"
@+
😎16 octobre 2024 à 12:59 #75091michel c.ParticipantBonjour, 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
16 octobre 2024 à 19:52 #75092bebarthMaître des clésbonjour,
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);
@+
😎16 octobre 2024 à 22:53 #75093MerlinMaître des clésEffectivement 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
16 octobre 2024 à 23:28 #75094bebarthMaître des clésC’est également ce que je fait !
@+
😎17 octobre 2024 à 10:25 #75095michel c.ParticipantMerci, 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.17 octobre 2024 à 12:34 #75100MerlinMaître des clés🙂
17 octobre 2024 à 18:39 #75106bebarthMaître des clésJ’ai également écris un petit utilitaire !
@+
😎Attachments:
You must be logged in to view attached files.18 octobre 2024 à 18:33 #75115bebarthMaî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 2 mois par bebarth.
19 octobre 2024 à 14:59 #75117MerlinMaître des clésJ’ai également écris un petit utilitaire !
Excellent !
19 octobre 2024 à 15:02 #75118MerlinMaître des clésAlors pourquoi ça fonctionne en ne recherchant que 4 chiffres ???
Soit parce-que tu as eu la chance de ne pas l’avoir fait fonctionner sur des codes utilisant des lettres, soit parce-que ECMAScript n’est pas très rigoureux dans le respect des métacaractères GREP (comme j’ai déjà pu le constater).
À mon avis c’est la 2e supposition qui est la plus probable.
😉
-
AuteurRéponses
- Vous devez être connecté pour répondre à ce sujet.