Toutes mes réponses sur les forums
-
AuteurRéponses
-
bebarthMaître des clés
bonjour,
J’ai beaucoup mieux compris avec ta vidéo, et du coup je me suis aperçu qu’il y avait une erreur dans mon script (pour les menus déroulants et les listes).
Il faut supprimer une ligne de script :
...
if (leType=="combobox" || leType=="listbox") {
var liste=new Array();
for (var k=0; k<g.numItems; k++) {
var valeur = g.getItemAt(k,false);
var valeurExport = g.getItemAt(k,true);
// <----- Suppimer cette ligne
var element=[valeur,valeurExport];
liste.push(element);
}
f.setItems(liste);
f.currentValueIndices=g.currentValueIndices;
}
...
Je ne me souviens pas pourquoi je l’avais mise !!! Peut-être pour une application spécifique.
En tout cas cela fonctionne beaucoup mieux maintenant…@+
😎Attachments:
You must be logged in to view attached files.bebarthMaître des clésJe vais faire une petite vidéo si c’est trop confus…
Je veux bien car je ne suis pas certain de comprendre !
@+
😎bebarthMaître des clésbonjour,
Je viens de relire ta demande, et en fait (si j’ai bien compris) tu pouvais n’utiliser que la partie “bouton” du fichier que je t’ai envoyé !
Voici un exemple fait avec la méthode “popUpMenuEx” de l’api reference.//######################
// * b2Tools * #
// 12/24 #
// ----------- #
// PersoTool Example #
// Exemple Outil Perso #
//######################
if (typeof app.formsVersion!="undefined" && app.formsVersion>9 && app.viewerVariation!="Reader") {
// Traductions
if (app.language=="FRA") {
var txtBoutonPersoTool="Outil Perso"; // Texte bouton
var txtInfoPersoTool="Infobulle"; // Infobulle bouton
}
else {
var txtBoutonPersoTool="Personal Tool"; // Button text
var txtInfoPersoTool="Tooltip"; // Button tooltip
}
// Exécution du script
var executePersoTool=app.trustedFunction(function(){
// Traductions
if (app.language=="FRA") {
var b2txt00="\u00C9l\u00E9ment 1";
var b2txt01="\u00C9l\u00E9ment 2";
var b2txt02="\u00C9l\u00E9ment 2, Sous-menu 1";
var b2txt03="\u00C9l\u00E9ment 2, Sous-menu 2";
var b2txt04="\u00C9l\u00E9ment 2, Sous-menu 2, Sous-sous-menu 1";
var b2txt05="0";
var b2txt06="\u00C9l\u00E9ment 3";
var b2txt07="\u00C9l\u00E9ment 4";
var b2txt08="1";
var b2txt09="Vous avez choisi l'\u00E9l\u00E9ment menu \"";
var b2txt10="\"";
}
else {
var b2txt00="Item 1";
var b2txt01="Item 2";
var b2txt02="Item 2, Submenu 1";
var b2txt03="Item 2, Submenu 2";
var b2txt04="Item 2, Submenu 2, Subsubmenu 1";
var b2txt05="0";
var b2txt06="Item 3";
var b2txt07="Item 4";
var b2txt08="1";
var b2txt09="You chose the \"";
var b2txt10="\" menu item";
}
//
var cChoice=app.popUpMenuEx(
{
cName: b2txt00,
bMarked:true,
bEnabled:false
},{
cName: "-"
},{
cName: b2txt01,
oSubMenu: [
{
cName: b2txt02
},{
cName: b2txt03,
oSubMenu: {
cName:b2txt04,
cReturn: b2txt05
}
}
]
},{
cName: b2txt06
},{
cName: b2txt07,
bMarked: true,
cReturn: b2txt08
}
)
app.alert(b2txt09+cChoice+"\" menu item");
//
});
// Icône PersoTool
var dataIconePersoTool="ffffffffff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ffffffffff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3fffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aeff00ada3ff00ada3ff00ada3ff00ada3fffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aeff00ada3ff00ada3ff00ada3ff00ada3fffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aeff00ada3ff00ada3ff00ada3ff00ada3fffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aeff00ada3ff00ada3ff00ada3ff00ada3fffff7aefffff7aefffff7aefffff7aeffcb0000ffcb0000ffcb0000ffcb0000fffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aeff00ada3ff00ada3ff00ada3ff00ada3fffff7aefffff7aefffff7aefffff7aeffcb0000fffff7aefffff7aefffff7aeffcb0000fffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aeff00ada3ff00ada3ff00ada3ff00ada3fffff7aefffff7aefffff7aefffff7aeffcb0000fffff7aefffff7aeff21221fffcb0000ff21221fff21221fff21221ffffff7aefffff7aefffff7aefffff7aeff00ada3ff00ada3ff00ada3ff00ada3fffff7aefffff7aefffff7aefffff7aeffcb0000ffcb0000ffcb0000ffcb0000fffff7aeff21221ffffff7aefffff7aefffff7aefffff7aefffff7aefffff7aeff00ada3ff00ada3ff00ada3ff00ada3fffff7aefffff7aefffff7aefffff7aeffcb0000fffff7aefffff7aefffff7aefffff7aeff21221ffffff7aefffff7aefffff7aefffff7aefffff7aefffff7aeff00ada3ff00ada3ff00ada3ff00ada3fffff7aefffff7aefffff7aefffff7aeffcb0000fffff7aefffff7aefffff7aefffff7aeff21221ffffff7aefffff7aefffff7aefffff7aefffff7aefffff7aeff00ada3ff00ada3ff00ada3ff00ada3fffff7aefffff7aefffff7aefffff7aeffcb0000fffff7aefffff7aefffff7aefffff7aeff21221ffffff7aefffff7aefffff7aefffff7aefffff7aefffff7aeff00ada3ff00ada3ff00ada3ff00ada3fffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aeff21221ffffff7aefffff7aefffff7aefffff7aefffff7aefffff7aeff00ada3ff00ada3ff00ada3ff00ada3fffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aeff21221ffffff7aefffff7aefffff7aefffff7aefffff7aefffff7aeff00ada3ff00ada3ff00ada3ff00ada3fffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aeff00ada3ff00ada3ff00ada3ff00ada3fffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aeff00ada3ff00ada3ff00ada3ff00ada3fffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aeff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ffffffffff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ffffffff";
var IconePersoTool={
count: 0,
width: 20,
height: 20,
read: function(nBytes){return dataIconePersoTool.slice(this.count,this.count+=nBytes);}
};
// Bouton PersoTool
var objetBoutonPersoTool={
cName: "nomBoutonPersoTool",
cExec: "executePersoTool(event.target);",
cEnable: "event.rc=(app.doc!=null)",
cMarked: "event.rc=false",
cTooltext: txtInfoPersoTool,
oIcon: IconePersoTool,
cLabel: txtBoutonPersoTool
};
//
try {
app.removeToolButton("nomBoutonPersoTool");
} catch(e){}
try {
app.addToolButton(objetBoutonPersoTool);
} catch(e){}
}
//########################
// That's all folks! #
// et pis c'est tout ! #
// @+ #
// bebarth #
//########################
@+
😎Attachments:
You must be logged in to view attached files.bebarthMaître des clésbonjour,
…et pareil que Merlin : félicitations pour ce que tu fais !Je n’ai pas bien suivi ces derniers jours, du coup tu en es où dans tes demandes ?
Si tu peux me repréciser ! Merci.@+
😎bebarthMaître des clés…je ne pense pas l’avoir déjà fait alors !
@+
😎bebarthMaître des clésbonjour,
Je t’ai envoyé mon fichier modèle que j’utilise lorsque je crée des utilitaires.
Je ne le partage pas ici car c’est un peu compliqué et ça a été un peu de boulot à faire, mais je peux le partager sur demande.@+
😎Attachments:
You must be logged in to view attached files.bebarthMaître des clésbonjour Jean-Claude,
Envoie-moi une adresse mail en MP à “bebarth arrobase sfr point fr” où je peux te faire parvenir un exemple.@+
😎bebarthMaître des clésbonjour,
Voici les lignes pour pouvoir supprimer les anciens champs avec ton script :function Renommer_c() {
var anciensChamps=[];
for (var i=0; i<this.numFields; i++) {
var nomChamp=this.getNthFieldName(i);
var Menu = this.getField("Menu").value;
var CaR = this.getField("nom_champ").value;
var an = this.getField("AN").value;
var P1new = this.getField("NN").value;
var P2new = this.getField("NN").value;
var b = nomChamp.split(".");
var P1 = (b[0]);
var P2 = (b[1]);
var P3 = (b[2]);
if (Menu == 1 && an == P1) {
try{
var ts=this.getField(P1+"."+P2+"."+P3).textSize;
var tf=this.getField(P1+"."+P2+"."+P3).textFont;
var rct=this.getField(P1+"."+P2+"."+P3).rect;
var pg=this.getField(P1+"."+P2+"."+P3).page;
var f=this.addField(P1new+"."+P2+"."+P3,"text",pg,rct);
anciensChamps.push(P1+"."+P2+"."+P3);
f.textSize=ts;
f.textFont=tf;
}catch(e){break}
//this.removeField(P1+"."+P2+"."+P3)
}
if (Menu == 2 && an == P2 && CaR == P1) {
try{
var ts=this.getField(P1+"."+P2+"."+P3).textSize;
var tf=this.getField(P1+"."+P2+"."+P3).textFont;
var rct=this.getField(P1+"."+P2+"."+P3).rect;
var pg=this.getField(P1+"."+P2+"."+P3).page;
var f=this.addField(P1+"."+P2new+"."+P3,"text",pg,rct);
anciensChamps.push(P1+"."+P2+"."+P3);
f.textSize=ts;
f.textFont=tf;
}catch(e){break}
//this.removeField(P1+"."+P2+"."+P3)
//app.alert("Champ retiré : "+P1+"."+P2+"."+P3);
}
}
for (var j=0; j<anciensChamps.length; j++) this.removeField(anciensChamps[j]);
}
Ton script fonctionne correctement, par contre il ne duplique pas toutes les propriétés. Tu devrais plutôt t’inspirer du miens…
Pour ce qui est de ton autre problème ce n’est pas très compliqué, il suffit de créer le nouveau champ juste au dessus de l’ancien et de ne pas l’insérer dans la table des champs à supprimer si son nom est “Q”. J’essayerai de te faire ça demain !
@+
😎Attachments:
You must be logged in to view attached files.bebarthMaître des clés…en gros lorsque tu ajoutes un nouveau champ et que tu effaces l’ancien immédiatement cela modifie la numérotation des champs c’est pourquoi ils ne sont pas tous remplacés.
Alors que si tu rajoutes des champs sans supprimer les anciens immédiatement, la numérotation reste identique avec de nouveaux numéros à la fin. il faut donc créer tous les nouveaux avant de supprimer tous les anciens !Ai-je été compréhensible ???
@+
😎bebarthMaître des clésbonjour,
J’ai mixé ton script avec le mien répondre rapidement à ton problème.function Renommer_c() {
var anciensChamps=[];
//récuperer les noms de tous les champs
for (var i=0; i<this.numFields; i++) {
var nomChamp=this.getNthFieldName(i);
//déclarer les variables
var aN = this.getField("Name.3.1").value;
var nN = this.getField("Name.3.2").value
var CaR = this.getField("nom_champ").value;
var Menu = this.getField("Menu").value;
//décomposer les noms de champs en 3 parties séparées par les points : P1 ; P2 et P3
var b = nomChamp.split(".");
var P1 = (b[0]);
var P2 = (b[1]);
var P3 = (b[2]);
//Si l'on désire modifier la partie 1 et que la partie 1 correspond à l'entrée saisie dans le champ Name.3.1
if (Menu == 1 && aN == P1) {
//déclarer la variable P1new (nouveau nom pour la partie 1)
var P1new = nN;
anciensChamps.push(P1+"."+P2+"."+P3);
renommerChamp (P1+"."+P2+"."+P3,P1new+"."+P2+"."+P3);
}
//Si l'on désire modifier la partie 2 et que la partie 2 correspond à l'entrée saisie dans le champ Name.3.1 et que la partie 1 correspond à la variable CaR
if (Menu == 2 && aN == P2 && CaR == P1) {
//déclarer la variable P2new (nouveau nom pour la partie 2)
var P2new = nN;
anciensChamps.push(P1+"."+P2+"."+P3);
renommerChamp (P1+"."+P2+"."+P3,P1+"."+P2new+"."+P3);
}
}
for (var j=0; j<anciensChamps.length; j++) this.removeField(anciensChamps[j]);
}
function renommerChamp (leNom,nouveauNom) {
try {
g = this.getField(leNom);
var leType=g.type;
var laPage=String(g.page);
var lesPages=laPage.split(",");
for (var p=0; p<lesPages.length; p++) {
var cettePage=Number(lesPages[p]);
if (lesPages.length>1) {
var nomChamp=leNom+"."+p;
} else {
var nomChamp=leNom;
}
g=this.getField(nomChamp);
var lesCoord=g.rect;
var f = this.addField(nouveauNom, leType, cettePage, lesCoord);
f = this.getField(nouveauNom);
for (var j in g) {
try {
if (typeof g[j] != "function" && j != "name" && j != "type" && j != "page" && j != "rect") {
f[j]=g[j];
}
} catch(e) {}
}
if (leType=="combobox" || leType=="listbox") {
var liste=new Array();
for (var k=0; k<g.numItems; k++) {
var valeur = g.getItemAt(k,false);
var valeurExport = g.getItemAt(k,true);
if (valeur==valeurExport) valeurExport="";
var element=[valeur,valeurExport];
liste.push(element);
}
f.setItems(liste);
f.currentValueIndices=g.currentValueIndices;
}
if (leType=="button") {
f.buttonSetIcon(g.buttonGetIcon());
f.buttonSetCaption(g.buttonGetCaption());
}
}
} catch(e) {app.alert("\nLe champ \""+leNom+"\"\rn'existe pas dans ce document.")}
}
@+
😎Attachments:
You must be logged in to view attached files.bebarthMaître des clésJe n’avais pas pensé à essayer avec mon émulateur… Du coup ça fonctionne bien sur PC.
je me demande si tu ne devrais pas plutôt utiliser l’action souris relâchée
J’avais pensé à la souris appuyée vu que sur un piano la note se joue lorsqu’on appuie sur la touche et non lorsqu’on la relâche.
@+
😎bebarthMaître des clésbonjour Merlin,
Il me semble que c’est un vieux bug de la version Mac
…comme ça j’aurai plus vite terminé ce que je voulais faire !
@+
😎PS : J’ai pas mis toutes les notes sinon le fichier ne passait pas;
Attachments:
You must be logged in to view attached files.bebarthMaître des clésbonjour,
En fait, tout se passe à la création de ton champ image qui te propose un nom avec le suffixe “_af_image”.
Si tu gardes ce nom et que tu le modifies ensuite le suffixe est caché mais bien présent pour une recherche en JavaScript.
Si lors de la création tu modifies le nom en retirant le suffixe, il ne comporte définitivement pas ce suffixe, même en recherche via JavaScript.
C’est peut-être (voir certainement) ce qui t’arrives, et si c’est le cas je ne vois pas comment différencier un bouton d’un champ image en JavaScript !!!@+
😎Attachments:
You must be logged in to view attached files.bebarthMaître des clésbonjour,
Voici une solution possible. Ici on ne peut écrire que sous le code sous format désiré (2 chiffres, 1 point, 2 chiffres et 1 lettre) et le nombre d’éléments possibles est indiqué si il est multiple ou nul. S’il n’y en a qu’un, l’élément est directement affiché.
On pourrait également modifier le script pour ne permettre de taper que les codes disponibles… Tu me dis !// script de document
this.getField("codeInput").value="";
this.getField("filteredOptions").clearItems();
var p=this.getDataObject(this.dataObjects[0].name);
var fichier=this.getDataObjectContents(p.name);
var donnees=util.stringFromStream(fichier);
var rangees=donnees.split("\n");
var colonnes=new Array();
for (var i=0; i<rangees.length; i++) colonnes=rangees.split(";");
var cellule=new Array();
for (var j=0; j<colonnes.length; j++) cellule[j]=[colonnes[j][1].replace(/\s$/,""),colonnes[j][0]];
cellule[0][0]="- "+(cellule.length-1)+" éléments -";
this.getField("filteredOptions").setItems(cellule);
// Script de touches personnalisé
if (!event.willCommit) {
event.change=event.change.toUpperCase();
var aTester=event.value.split("");
aTester.splice(event.selStart,event.selEnd-event.selStart,event.change);
var testeChaine=aTester.join("");
if (testeChaine.length<6) testOK=/^(\d{1,2}([.](\d{1,2})?)?)?$/.test(testeChaine);
else testOK=/^\d{2}[.]\d{2}[a-zA-Z]$/.test(testeChaine);
event.rc=testOK;
if (testOK) {
var lesElements=[];
for (var i=1; i<cellule.length; i++) {
if (cellule[1].indexOf(testeChaine)==0) lesElements.push([cellule[0],cellule[1]]);
}
var nb=lesElements.length;
if (nb!=1) lesElements.unshift("- "+nb+" élément(s) -");
this.getField("filteredOptions").setItems(lesElements);
}
} else {
if (event.value.length<6) testOK=/^(\d{1,2}([.](\d{1,2})?)?)?$/.test(event.value);
else testOK=/^\d{2}[.]\d{2}[a-zA-Z]$/.test(event.value);
event.rc=testOK;
}
@+
😎Attachments:
You must be logged in to view attached files.bebarthMaître des clésbonjour,
Le type de champ “image” n’existe pas en JavaScript.
https://opensource.adobe.com/dc-acrobat-sdk-docs/library/jsapiref/JS_API_AcroJS.html#id619
Un champ image est un champ de type bouton auquel on ajoute une action permettant d’ajouter ou modifier l’image et dont le nom “réel” est modifié en rajoutant un suffixe “_af_image” (cf. copie d’écran jointe).
On pourrait donc écrire :
if (nomChamp.indexOf("Question")==0 && nomChamp.indexOf("_af_image")>0) this.getField(nomChamp).readonly=true;
@+
😎Attachments:
You must be logged in to view attached files.bebarthMaître des clésPeux-tu partager un fichier Excel (au format csv ou txt) ou une partie de ce fichier et m’indiquer les cellules utiles.
@+
😎bebarthMaître des clésbonjour,
Si les données sont extraites d’un fichier Excel, pourquoi ne pas attacher un fichier au pdf ?@+
😎bebarthMaître des clésbonjour,
Tu peux retirer les icônes de l’obet icon avec la méthode “removeIcon” : https://opensource.adobe.com/dc-acrobat-sdk-docs/library/jsapiref/doc.html#removeicon
Ci-joint un fichier exemple.@+
😎Attachments:
You must be logged in to view attached files.8 novembre 2024 à 08:57 en réponse à : Identifier la couleur des champs en exportant les données #75140bebarthMaître des clésbonjour,
Si je peux donner mon avis, l’extraction de toutes les données que propose Acrobat n’est pas toujours la meilleur solution car on récolte les valeurs de tous les champs, même de ceux qu’on n’a pas besoin (cases à cocher, boutons radio,…).
Personnellement j’opterais pour un script qui n’extrait que les valeurs souhaitées et dans ce cas on pourrait extraire directement la couleur des champs que l’on aurait par exemple indiquée en info-bulle lors du changement de couleur. cela permettrait d’avoir un document affiché uniquement avec les désignations (sans le nom de la couleur), puis un fichier texte extrait et récupérable directement sans avoir à le retoucher.@+
😎6 novembre 2024 à 21:19 en réponse à : Identifier la couleur des champs en exportant les données #75130bebarthMaître des clésbonjour
Je peux ajouter une maquette si c’est plus facile à visualiser.
Une maquette serait effectivement la bienvenue.
@+
😎bebarthMaî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.
bebarthMaître des clésbonjour,
Personnellement j’utilise Illustrator mais j’imagine que tu ne peux pas…
Lorsqu’on cherche ses équivalents gratuits pour PC on trouve Inkscape en numéro 1. Je ne le connais pas mais si il fonctionne bien il faut continuer à l’utiliser !
https://mailchimp.com/fr/resources/adobe-illustrator-free-alternative/@+
😎bebarthMaître des clésbonjour,
Comment dire… ?
Sans vouloir douter de tes compétences, c’est TRÈS TRÈS compliqué à faire !
Lorsque je me suis penché sur le problème, j’ai posé quelques question sur le forum Acrobat et je n’ai jamais eu de réponse ! Pas une seule, même de Thom Parker qui apparemment est l’un des seul à s’y connaitre. J’ai d’ailleurs su qu’on pouvait dessiner grâce à son fichier :
https://www.windjack.com/DownLoads/MatrixOperations.pdfComme je n’ai jamais eu réponse j’ai donc creusé ce fichier (pendant plus d’un an) pour essayer de trouver comment ça marche. Le résultat avec Acrobat est un peu décevant par rapport à ce qu’on peut faire en html. Toutes les commandes ne fonctionnent pas avec Acrobat.
De plus, c’est un peu comme avec les expressions régulières, il faut en faire souvent pour ne pas oublier comment ça fonctionne.
Si tu es bon en trigonométrie et que tu t’y connais un peu en courbes de Bezier voici 2 liens qui pourront t’aider :
https://www.w3schools.com/graphics/svg_intro.asp
https://www.w3schools.com/graphics/svg_path.aspJe te joins également 2 fichiers que j’ai fait lors de mon apprentissage. Tu pourras les étudier !!!
En tout cas c’est un sujet qui m’intéresse et à l’occasion je regarderai si je peux faire quelque chose (mais ce ne sera pas tout de suite).
@+
😎Attachments:
You must be logged in to view attached files.bebarthMaître des clésJ’ai également écris un petit utilitaire !
@+
😎Attachments:
You must be logged in to view attached files.bebarthMaître des clésC’est également ce que je fait !
@+
😎bebarthMaî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);
@+
😎bebarthMaî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 !"
@+
😎bebarthMaître des clésbebarthMaî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;
@+
😎bebarthMaître des clésAvec la méthode “bouton”, le champ devient bien cliquable, mais il ouvre une fenêtre de navigateur en remplissant 2 fois l’url à la suite, comme s’il prenait en compte le bouton + le champ placé dessous… du coup on arrive sur une 400.
En es-tu certain ?
Avec l’exemple joint ça fonctionne bien chez moi… Dis-moi si il fonctionne chez toi !@+
😎Attachments:
You must be logged in to view attached files.bebarthMaître des clésA ce moment là il ne faut pas que le champ soit en lecture seule…
@+
😎bebarthMaî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.
@+
😎bebarthMaître des clésbonjour,
Je pense que le plus simple est de superposer à ton champ un bouton avec un script d’action souris relâchée :
if (this.getField("contactchoix").value!="" && this.getField("contactchoix").value!="undefined") app.launchURL("http://www."+this.getField("contactchoix").value,true);
Après,
@+
😎Attachments:
You must be logged in to view attached files.bebarthMaître des clésbonjour,
Vous êtes gentils… Je doute qu’outre Atlantique on me considère comme sorti des Mille et une nuits !Je ne suis pas certain d’avoir été très clair la dernière fois, mais généralement lorsque j’ai quelque chose dans la tête je ne l’ai pas au… tre part !
Lorsque on veut sélectionner plusieurs éléments dans une liste, on doit appuyer sur la touche ctrl sur PC et opt ou cmd sur Mac. Donc si on appuie pas sur une de ces touches, cela signifie que l’on désélectionne tous les éléments précédents !
Je viens de me rappeler que event.modifier contrôle justement si on appuyait sur la touche. J’ai donc pu terminer cette première version.
On a donc un script champ activé :
var indices=event.target.currentValueIndices;
if (indices==-1) {
var liste=[];
} else {
if (typeof indices=="number") var liste=[event.target.getItemAt(indices, false)];
else {
var liste=[];
for (var i=0; i<indices.length; i++) liste.push(event.target.getItemAt(indices, false))
}
}
Puis un script “Changement de sélection” :
if (!event.willCommit) {
if (!event.modifier) {
if (event.value==event.changeEx) {
this.getField("choix2").value="";
this.getField("pop2").clearItems();
var liste=[];
} else {
this.getField("choix2").value=event.changeEx;
this.getField("pop2").setItems([event.changeEx]);
var liste=[event.changeEx];
}
} else {
liste.push(event.changeEx);
for (var i=0; i<liste.length-1; i++) {
if (liste==event.changeEx) {
liste.splice(i,1);
liste.pop();
break;
}
}
liste.sort(function(a, b){return a.localeCompare(b)});
this.getField("choix2").value=liste.toString().replace(/,/g,"\r");
this.getField("pop2").setItems(liste);
}
}
Sauf que l’api reference indique “The modifier key on the Microsoft Windows platform is Control and on the Mac OS platform is Option or Command” et apparemment la touche option fonctionne sur Mac. Je suis donc obligé d’appuyer simultanément sur option et commande pour que ça fonctionne.
Pourriez-vous me dire si ça marche sur PC avec la touche ctrl !@+
😎Attachments:
You must be logged in to view attached files.bebarthMaître des clésbonjour,
J’y était presque… mais je n’avais pas d’ordinateur hier soir pour vérifier. En fait c’est :
var RegExTest=new RegExp("^"+rep[k].replace(/([(){}\[\]])/g,"\\$1")+"$");
Un double antislash pour indiquer qu’on veut le caractère \ et $1 pour récupérer le caractère capturé dans l’expression entre parenthèses (un des caractères entre crochets où les crochets sont eux-mêmes échappés pour indiquer qu’on parle des caractères…). C’est simple, non ?@+
😎- Cette réponse a été modifiée le il y a 2 mois et 2 semaines par bebarth.
Attachments:
You must be logged in to view attached files.bebarthMaître des clésC’est ce que devrait faire la ligne que j’ai modifiée.
@+
😎bebarthMaître des clésbonjour,
Essaye :
…
var RegExTest=new RegExp("^"+rep[k].replace(/[(){}\[\]]/g,"\$")+"$");
…
Je ne peux pas vérifier ce soir… Tu me dis !
@+
😎bebarthMaître des clésbonjour Jean-Claude,
J’ai à peu près le même process que toi.
Au début, comme je te l’avais dis, j’étais parti pour exécuter un uniquement script à partir du champ liste, mais ça ne fonctionnait qu’à moitié. Lorsqu’on ajoutait ou supprimait un élément à la fois ça marchait mais si on avait déjà sélectionné plusieurs éléments et que d’un seul coup on n’en sélectionnait plus qu’un seul, ça ne marchait plus. En fait, event.value ne change pas lorsque change de focus, mais si on revient au champ liste et comme event.changeEx est le nouvel élément sélectionné, ça ne marchait pas !!!
Tout ça pour dire que j’en suis revenu également à 2 scripts.
Le script déclencheur en “Changement de sélection” uniquement pour changer de focus et donc lancer le cacul :
if (!event.willCommit) this.getField("choix2").setFocus();
Et un script de calcul :
var indices=this.getField("zone2").currentValueIndices;
if (indices==-1) {
event.value="";
this.getField("pop2").clearItems();
} else {
if (typeof indices=="number") {
event.value=this.getField("zone2").getItemAt(indices, false);
this.getField("pop2").setItems([this.getField("zone2").getItemAt(indices, false)]);
} else {
var liste=[];
for (var i=0; i<indices.length; i++) liste.push(this.getField("zone2").getItemAt(indices, false));
event.value=liste.toString().replace(/,/g,"\r");
this.getField("pop2").setItems(liste);
}
}
@+
😎Attachments:
You must be logged in to view attached files.bebarthMaître des clésbonjour,
Je n’ai pas d’erreur lorsque je clique sur “Vérifier” de ton document !@+
😎Attachments:
You must be logged in to view attached files.bebarthMaître des clésJe suis complètement débordé avec tout le TAF urgent à terminé!
Ne m’en parle pas !!! Tu verras quand tu seras à la retraite :-)… même pas le temps de procrastiner un peu !
@+
😎bebarthMaître des clésbonjour,
Si tu veux que ça fonctionne dynamiquement, il faut utiliser “event.changeEx” en script de “Changement de sélection”. Je pense qu’il faut également utiliser un “calculateNow()” car il n’est pas possible de “Valider la valeur sélectionnée immédiatement” avec une “Sélection multiple”.
J’ai une petite idée mais je ne peux l’essayer en ce moment. Je regarderai ce weekend si tu n’y arrives pas…@+
😎bebarthMaître des clésbonjour,
Il faut bien retirer le *100 mais il faut aussi modifier le format du champ en “pourcentage”.@+
😎Attachments:
You must be logged in to view attached files.bebarthMaître des clésbonjour,
Il est vrai qu’il n’est pas utile de pivoter les pages avant de les imprimer, mais pour toute autre raison il est quand même possible de le faire via un script.
Pour une page au format paysage d’un document (et idem pour les pages au format portrait), il y a 2 possibilités : soit elle a été créée dans ce format, ou elle a été créée au format portrait puis pivotée en format paysage. D’où la nécessité de regarder “getPageRotation”. Si ce résultat est 0 c’est que la page a été créée au format paysage, sinon elle a déjà été pivoté. L’instruction “setPageRotations” pivote la page par rapport à la position originale.
Voici donc un script pour pivoter les pages du format paysage au format portrait :
for (var p=0; p<this.numPages; p++) {
var dimPage=this.getPageBox("Crop",p);
if ((dimPage[2]-dimPage[0])>(dimPage[1]-dimPage[3])) {
if (this.getPageRotation(p)!=0) this.setPageRotations(p,p,0);
else this.setPageRotations(p,p,90);
}
}
Par contre, on ne peut vérifier si la position originale est à l’envers (haut en bas)…
@+
😎bebarthMaître des clés… après on peut aussi ajouter un répertoire sur le bureau !
@+
😎bebarthMaître des clésbonjour,
Si le pdf original est sur le même disque on peut en déduire le chemin du bureau
On peut par exemple utiliser ce script pour enregistrer sur le bureau utilisateur :
var ceChemin=this.path.split("/");
var cheminSurBureau="";
for (var j=1; j<=3; j++) cheminSurBureau+="/"+ceChemin[j];
cheminSurBureau+="/Desktop/"+ceChemin[ceChemin.length-1];
this.saveAs({
cPath: cheminSurBureau,
bPromptToOverwrite: true // au cas où !!!
})
Ça devrait fonctionner sur Mac et PC, sous unix je ne connais pas la syntaxe des chemins !
@+
😎- Cette réponse a été modifiée le il y a 2 mois et 3 semaines par bebarth.
bebarthMaître des clésSi le pdf original est sur le même disque on peut en déduire le chemin du bureau, mais attention ils sont différents selon l’OS !
@+
😎bebarthMaître des clésExact !
bebarthMaître des clésbonjour,
On ne peut pas afficher la fenêtre de l’interface utilisateur, mais avant enregistrement on pourrait indiquer le chemin dans un champ ou une boite de dialogue !
Par contre il y aura une erreur si le chemin n’est pas indiqué correctement.@+
😎bebarthMaître des clésAs-tu essayé mon fichier ???
Essaye de mettre un try… catch !@+
😎bebarthMaître des clésbonjour,
Une seule fonction en script de document :
function random (indice) {
function getRandomIntInclusive(min,max,dec) {
return Math.round((Math.random()*(max-min)+min)*Math.pow(10,dec))/Math.pow(10,dec);
}
if (this.getField("Var."+indice+".0").value !="" || this.getField("Var."+indice+".1").value !="" || this.getField("Var."+indice+".2").value !="") {
this.getField("Var."+indice+".3").value=getRandomIntInclusive(this.getField("Var."+indice+".1").value,this.getField("Var."+indice+".2").value,this.getField("Dec."+i).value);
}
eval(this.getField("Var."+indice+".0").value+"="+this.getField("Var."+indice+".3").value);
}
…et un script pour appeler cette fonction :
for (var i=1; i<=30; i++) {
try {
random (i);
} catch(e) {
this.getField("Var."+i+".3").value="";
}
}
@+
😎Attachments:
You must be logged in to view attached files.bebarthMaître des clésTu écris :
function variables () {
eval("var "+this.getField("Var.2.0").value+"="+this.getField("Var.2.3").value);
eval("var "+this.getField("Var.1.0").value+"="+this.getField("Var.1.3").value);
app.alert("Valeur de la variable E : "+E+" ; Valeur de la variable F : "+F);
}
@+
😎Attachments:
You must be logged in to view attached files.bebarthMaître des clésbonjour,
Oui, il faut utiliser la méthode “eval”.
Pour un chiffre :
eval("var "+this.getField("nomChamp").value+"=5;");
ou chaîne de caractères :
eval("var "+this.getField("nomChamp").value+"=\"la chaîne de caractères\";");
Mais attention, il faut respecter la règle de nomination des variables… donc pas de caractères spéciaux et ne pas commencer par un chiffre !@+
😎bebarthMaître des clésbonjour,
Il faut écrire :
event.value=(this.getField("Texte36").value-this.getField("Texte37").value)/this.getField("Texte37").value*100;
Mais il faut modifier le format des champs en “Nombre” avec indicateur de la monnaie.@+
😎Attachments:
You must be logged in to view attached files.bebarthMaître des clésbonjour,
J’ai réussi à solutionner mon problème.
Si d’autres ont le même problème ils se débrouilleront ???
@+
😎bebarthMaître des clésbonjour,
J’ai modifié un peu le script car certaines fois le chiffre était inférieur au mini…
function getRandomIntInclusive(min,max,dec) {
return Math.round((Math.random()*(max-min)+min)*Math.pow(10,dec))/Math.pow(10,dec);
}
for (var i=1; i<=4; i++) {
this.getField("Var."+i+".3").value=getRandomIntInclusive(this.getField("Var."+i+".1").value,this.getField("Var."+i+".2").value,this.getField("Dec."+i).value);
}
@+
😎Attachments:
You must be logged in to view attached files.bebarthMaître des clésL’avantage de mettre une fonction en script de document c’est de pouvoir l’appeler à partir de plusieurs autres scripts.
Si elle n’est utilisée qu’avec un script, autant l’intégrer, et pas forcément depuis un bouton…
@+
😎bebarthMaître des clésbonjour,
Donc le event.rc = false; n’est pas nécessaire également?
Si, quand même ! Il faut bien pouvoir invalider la réponse, et donc conserver l’ancienne valeur. Tu doit par exemple entrer une valeur supérieure à 5. Admettons que l’ancienne valeur était 10, donc correcte et que tu entres un 3.
Si tu écris ce scrpt :
if (event.value>5) {
app.alert("Valeur correcte",3);
} else {
app.alert("Valeur incorrect",3);
}
Tu auras le message “Valeur incorrecte”, mais la valeur indiquée dans ton champ sera 3, alors que si tu écris :
if (event.value>5) {
app.alert("Valeur correcte",3);
} else {
event.rc=false;
app.alert("Valeur incorrect",3);
}
Tu auras le même message “Valeur incorrecte”, mais la valeur restera la précédente (donc 10).@+
😎bebarthMaître des clésbonjour,
event.rc = true;
Juste pour info, ce n’est pas la peine d’indiquer
event.rc = true;
car c’est l’état par défaut de la validation si on indique pasevent.rc = false;
.
Ça fait une ligne de moins…@+
😎bebarthMaître des clésPartage ton fichier si cela t’est possible.
@+
😎bebarthMaître des clésLa syntaxe est différente, mais le principe est le même !
@+
😎bebarthMaître des clésbonjour,
J’avais déjà répondu à une demande similaire :
Voici donc une adaptation :
function getRandomIntInclusive(min,max) {
return (Math.random()*(max-min+1)+min-1).toFixed(this.getField("Dec."+i).value);
}
for (var i=1; i<=4; i++) {
this.getField("Var."+i+".3").value=getRandomIntInclusive(this.getField("Var."+i+".1").value,this.getField("Var."+i+".2").value);
}
@+
😎Attachments:
You must be logged in to view attached files.bebarthMaître des clésQu’est-ce qui ne fonctionne pas ?
Y a-t-il un message dans la console ?
Si tu ne veux pas ces informations, il faut retirer des lignes du script, ce qui donne :
var jour=["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"]
if (event.value!="") {
var d=util.scand("dd/mm/yyyy",event.value); // valeur donnée à minuit pile
var laDate=d.getTime()+24*3600*1000;
var aujourdhui=util.scand("dd/mm/yyyy", new Date()).getTime();
if (laDate<aujourdhui) {
app.alert("Veuillez indiquer une date postérieure ou égale à celle d'aujourd'hui.\rou\rVeuillez indiquer une date qui n'est pas antérieure à celle d'aujourd'hui.",3);
event.rc=false;
} else {
var jCommande=jour[d.getDay()];
if (d.getDay()==1) var nbJours=4;
else if (d.getDay()==2) var nbJours=6;
else var nbJours=5;
var dateLivraison=laDate+((nbJours-1)*24*3600*1000); // ...comme on a modifié "laDate"
this.getField("DateLimite").value=new Date(dateLivraison);
var jLivraison=jour[new Date(dateLivraison).getDay()];
}
} else {
this.getField("DateLimite").value="";
}
@+
😎bebarthMaître des clésbonjour,
chacun propose son idée et ensuite il faut faire la part des choses.
Voici donc ma version avec écriture directe lors de la frappe des chiffres (uniquement si >5).
@+
😎Attachments:
You must be logged in to view attached files.bebarthMaître des clésbonjour,
Oups, j’avais mal lu…Donc, < et non pas >
Ça ne suffit pas dans ce sens là ! Sans indications supplémentaires la valeur de “laDate” est indiquée à minuit pile. Alors que la valeur de “aujourdhui” est indiquée à ‘instant “t”. À moins que l’on remplisse le champ à 0:00 au millième de seconde près, ce qui est peu probable… si “aujourdhui” est aujourd’hui, la valeur “laDate” est toujours inférieure à la valeur “aujourdhui”. 🙂
Le script est donc à modifier comme suit :
var jour=["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"]
if (event.value!="") {
var d=util.scand("dd/mm/yyyy",event.value); // valeur donnée à minuit pile
var laDate=d.getTime()+24*3600*1000;
var aujourdhui=util.scand("dd/mm/yyyy", new Date()).getTime();
if (laDate<aujourdhui) {
app.alert("Veuillez indiquer une date postérieure ou égale à celle d'aujourd'hui.\rou\rVeuillez indiquer une date qui n'est pas antérieure à celle d'aujourd'hui.",3);
event.rc=false;
} else {
var jCommande=jour[d.getDay()];
this.getField("jourCommande").value=jCommande;
if (d.getDay()==1) var nbJours=4;
else if (d.getDay()==2) var nbJours=6;
else var nbJours=5;
var dateLivraison=laDate+((nbJours-1)*24*3600*1000); // ...comme on a modifié "laDate"
this.getField("DateLimite").value=new Date(dateLivraison);
var jLivraison=jour[new Date(dateLivraison).getDay()];
this.getField("jourLivraison").value=jLivraison;
}
} else {
this.getField("jourCommande").value="";
this.getField("DateLimite").value="";
this.getField("jourLivraison").value="";
}
@+
😎Attachments:
You must be logged in to view attached files.bebarthMaître des clésbonjour,
En scripr de validation de ton champ date :
var jour=["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"]
if (event.value!="") {
var d=util.scand("dd/mm/yyyy",event.value);
var laDate=d.getTime();
var aujourdhui=util.scand("dd/mm/yyyy", new Date()).getTime();
if (laDate>aujourdhui) {
app.alert("Veuillez indiquer une date antérieure à aujourd'hui.",3);
event.rc=false;
} else {
var jCommande=jour[d.getDay()];
this.getField("jourCommande").value=jCommande;
if (d.getDay()==1) var nbJours=4;
else if (d.getDay()==2) var nbJours=6;
else var nbJours=5;
var dateLivraison=laDate+(nbJours*24*3600*1000);
this.getField("DateLimite").value=new Date(dateLivraison);
var jLivraison=jour[new Date(dateLivraison).getDay()];
this.getField("jourLivraison").value=jLivraison;
}
}
@+
😎Attachments:
You must be logged in to view attached files.bebarthMaître des clés18 septembre 2024 à 18:14 en réponse à : Formulaire Devis – Afficher un tarif selon choix liste déroulante #74876bebarthMaître des clésbonjour,
Des listes mères/filles supposent qu’il y a plusieurs menus déroulants dans un fichier alors que dans le tien je n’en voit qu’un…
Je suppose que tu a extrais ton script du fichier ci-joint.
Regarde en script de document, l’objet “elementsListes” définit les différentes valeurs suivant le choix du premier menu déroulant.
Il faut que tu fasses la même chose pour ton document.@+
😎Attachments:
You must be logged in to view attached files.bebarthMaître des clésbonjour,
Seconde difficulté : la conversion des chiffres en lettres fonctionne très bien, mais y’a-t-il un moyen pour que, dès que le champ « montant en chiffres » est rempli, le champ « montant en lettres » se remplisse simultanément, sans avoir à cliquer dans le champ « montant en chiffres » ? J’ai inséré le script en « champ activé », en vain…
Le sujet a déjà été traité dans un autre post : https://www.abracadabrapdf.net/forums/topic/remplacer-valeur-numerique-en-lettre/#post-72771
Voici un fichier qui reprend le script principal, et ci-dessous les scripts que j’ai ajouté :
// Script de touches personnalisé champ nombre
if (!event.willCommit) {
if (event.selStart==0 && event.change==",") event.change="0,";
if (event.selStart==0 && event.change=="0") event.change="0,";
var aTester=event.value.split("");
aTester.splice(event.selStart,event.selEnd-event.selStart,event.change);
var testeChaine=aTester.join("");
if (/^([1-9]\d*(\,\d{0,2})?)?$/.test(testeChaine)) this.getField("SaisieSomme").value=Number(testeChaine.replace(/,/,"."))*1000;
else event.rc=false;
} else {
if (event.value=="" || /^([1-9]\d*(\,\d{0,2})?)$/.test(event.value)) this.getField("SaisieSomme").value=Number(event.value.replace(/,/,"."))*1000;
else event.rc=false;
}
// Script de calcul champ SaisieSomme
if (event.value>5000) {
ecriture(event.value);
this.getField("droit2").value=this.getField("SaisieSomme").value*Number(this.getField("tauxpersonnalise").value.replace(",","."))/100;
this.getField("totalperso").value=this.getField("SaisieSomme").value+this.getField("droit2").value;
} else {
this.getField("TexteSomme").value="";
this.getField("droit2").value="";
this.getField("totalperso").value="";
}
// Script de format personnalisé champ SaisieSomme
if (event.value<=5000) event.value="";
else event.value=event.value+" €";
Je te laisse retirer les étoiles si tu ne les veux pas…
@+
😎Attachments:
You must be logged in to view attached files.bebarthMaître des clésbonjour,
je ne sais pas s’il y a eu d’autres versions depuis.
Il y a une version Suisse & Belgique…
@+
😎Attachments:
You must be logged in to view attached files.bebarthMaître des clésbonjour,
J’ai essayer en ajout ceci suggérer par Thom Parker mais cela ne fonctionne pas. var strPrefix = event.targetName.split(“.”).splice(0,2).join(“.”); this.resetForm(strPrefix);
Ça fonctionne si ce script est sur la page des champs à réinitialiser, mais pour ton exemple, le bouton ne l’est pas.
Vu que la syntaxe des préfixes est toujours la même et que tu ajoutes la page dupliquée en fin de document, tu peux écrire :
this.getTemplate("page").spawn(this.numPages, true, false);
var t=this.templates;
var strPrefix="P"+(this.numPages-1)+"."+t[0].name;
// ou directement var strPrefix="P"+(this.numPages-1)+".page";
this.resetForm(strPrefix);
this.removeField(strPrefix+"."+event.target.name);
Ici j’ai supprimé le bouton sur la page dupliquée.
@+
😎P.S. : Dans le script de Thom, “event.targetName” est mal écrit. Ça devrait être “event.target.name” !
- Cette réponse a été modifiée le il y a 3 mois et 1 semaine par bebarth.
Attachments:
You must be logged in to view attached files.bebarthMaître des clésAprès avoir cherché un certain temps, je me suis aperçu que :
Lorsque l’on crée une case à cocher sur Acrobat, sa valeur par défaut est “Off” (décochée).
Apparemment, avec ton logiciel, sa valeur par défaut lors de sa création est “undefined” (décochée), et lorsqu’on la coche puis décoche sa valeur est “Off”.Pour que ça fonctionne sans modifier le script, il faut donc cocher/décocher toutes les cases à cocher avant de les utiliser (idem pour les boutons radio je suppose), ou lancer ce script :
for (var i=0; i<this.numFields; i++) {
var nomChamp=this.getNthFieldName(i);
if ((this.getField(nomChamp).type=="checkbox" || this.getField(nomChamp).type=="radiobutton") && this.getField(nomChamp).value=="undefined") this.getField(nomChamp).value="Off";
}
Pour info, ça ne fonctionnait pas non plus dans le premier fichier que tu as partagé…
@+
😎Attachments:
You must be logged in to view attached files.bebarthMaître des clésbonjour,
Il faut vérifier toutes les réponses possibles séparées par “|” :
...
this.getField("Q."+n+"."+a).readonly=true;
// BB
var rep=this.getField("R."+n+"."+a).valueAsString.split("|");
var OK=0;
for (var k=0; k<rep.length; k++) {
var RegExTest=new RegExp("^"+rep[k]+"$");
if (RegExTest.test(this.getField("Q."+n+"."+a).value)) OK++;
}
if (OK) {this.getField("Q."+n+"."+a).fillColor=eval("color."+colorOk);}
else {this.getField("Q."+n+"."+a).fillColor=eval("color."+colorErr);erreurs++;this.getField("Erreurs").value++;}
// BB
if (!erreurs) {
...
@+
😎Attachments:
You must be logged in to view attached files.6 septembre 2024 à 17:31 en réponse à : Remplir les champs d’une 2e liste déroulante dynamiquement #74820bebarthMaître des clésbonjour,
Ce sont des listes mères-filles… le plus simple est de chercher “mère fille” sur le forum et tu devrais trouver des réponses.
https://www.abracadabrapdf.net/forums/search/m%C3%A8re+fille/@+
😎bebarthMaître des clésje n’avais jamais vu le point d’exclamation placé avant…
Si, certainement… “==” signifie “est égale à” alors que “!=” signifie “est différent de“. Le point d’exclamation (!) exprime l’inverse.
Doncif (!this.getField("meca"))
signifie s’il n’y a pas de champ nommé “meca”.À noter que “==” est le signe d’égalité faible qui ne tient compte que de la valeur (donc
0=="0"
, le chiffre 0 est égal au caractère “0” et idem pour0==null
) alors que “===” est le signe d’égalité stricte qui tient compte que de la valeur et du type, d’où0!=="0"
et0!==null
.@+
😎bebarthMaître des clésbonjour,
…ouif (!this.getField("meca")) {...
, ça fonctionne aussi !@+
😎3 septembre 2024 à 12:43 en réponse à : Mr ou Mme qui s’inscrit avec bouton radio ou case à cocher #74803bebarthMaître des clésbonjour,
Tu peux écrire :
if (event.target.value!="Off") this.getField("Texte1").value=event.target.value+" "+this.getField("Texte1").value.replace(/^(M.\s)|(Mᵐᵉ\s)/,"");
else this.getField("Texte1").value=this.getField("Texte1").value.replace(/^(M.\s)|(Mᵐᵉ\s)/,"");
@+
😎Attachments:
You must be logged in to view attached files.bebarthMaître des clésbonjour,
Toujours le même problème d’affichage d’un “i” entre crochets sur le forum… On peut le remplacer l’indice par un “j” et ça devrait beaucoup mieux marcher :
var aTousLesModeles=this.templates;
for (j=0; j<aTousLesModeles.length; j++) {
aTousLesModeles[j].hidden=false; // true ou false
var leNom=aTousLesModeles[j].name;
var ind=leNom.substr(leNom.length-1);
var nm=leNom.substr(0,leNom.length-1);
this.setPageLabels(this.numPages-1, ["D",leNom.substr(0,leNom.length-1),ind-1]);
}
P.S. : Je ne me souviens pas ce qu’elle fait là, mais la variable nm en ligne 6 ne sert à rien ici…
@+
😎- Cette réponse a été modifiée le il y a 3 mois et 3 semaines par bebarth.
bebarthMaître des clésbonjour,
Si ce calcul est correct, il faudra le multiplier par 180/π pour l’avoir en degrés…
Mais il n’est pas correct, et le calcul n’est pas une notation simplifiée du champ “tangresultatab”.
Pour trouver la tangente, il faut écrire en script de calcul :
event.value=Math.tan(this.getField("Resultab").value*Math.PI/180);
On utilise “Math.tan2” pour trouver la tangente lorsque l’on a les coordonnées d’un point et non un angle !
@+
😎Attachments:
You must be logged in to view attached files.bebarthMaître des clésbonjour,
event.value=Math.atan2(this.getField(“Resultab”).value);
Attention, les calculs trigonométriques utilisent le radian comme unité. Si ce calcul est correct, il faudra le multiplier par 180/π pour l’avoir en degrés…
@+
😎bebarthMaître des clésbonjour,
Je pense avoir réussi. Il y avait sûrement plus simple avec une autre numérotation des champs mais je ne voulais pas me refaire tous les calculs… Le script est long mais ça a l’air de marcher. Enfin ça fonctionne si il y a 10 caissons….Il va falloir que je trouve un truc s’il y a moins de 10 caissons…
Si je peux me permettre, j’aurais quelques recommandations à te donner avant de te lancer dans des calculs, surtout lorsqu’il y a autant de champs… et malheureusement, lorsqu’on “commence” à programmer (durant quelques années), on doit souvent recommencer la nomination des champs, même si c’est un travail fastidieux…
Je croyais avoir compris que les quantités de formats identiques s’ajoutaient ! Ça n’a pas l’air d’être le cas dans ton tableau.
@+
😎bebarthMaître des clésbonsoir,
Je ne comprends pas bien ce qu’il faut indiquer dans les colonnes 1 et 2…
Ce qui va compliquer c’est qu’il n’y a pas de logique de numérotation pour les champs “essence” et “Ep” ! Il aurait été plus simple qu’il y en ait une en fonction de l’indice des champs…@+
😎bebarthMaître des clésbonjour,
Tu pourrais placer en script de format de tous les champs “Caiss” et “Tiroir” :
if (/(××)|(0×)|(NaN)/.test(event.value)) event.value="–";
Pour éviter de modifier tous ces champs manuellement, tu peux lancer ce script :
for (var i=0; i<this.numFields; i++) {
if (/^(Tiroir)|(Caiss)[.]\d[.]\d$/.test(this.getNthFieldName(i))) {
this.getField(this.getNthFieldName(i)).setAction("Format","if (/(××)|(0×)|(NaN)/.test(event.value)) event.value=\"–\";");
}
}
@+
😎- Cette réponse a été modifiée le il y a 4 mois par bebarth.
Attachments:
You must be logged in to view attached files.bebarthMaître des clésbonjour,
Après une première lecture rapide je remarque qu’il y a 2 fois la fonction “Calc()” en lignes 1 et 71.
Je n’ai pas vérifié si elles sont exactement identiques, mais peut-être que la seconde qui annule la première ne permet pas l’exécution de certains calculs…@+
😎bebarthMaître des clésbonjour,
Si on veut gagner quelques lignes de script on peut écrire :
var OK=true;
for (var i=1; i<=7; i++) var OK=OK && this.getField("Groupe "+i).value!="Off";
if (OK) {
// script
} else event.value="";
Mais là, j’avoue,je chipote…
@+
😎bebarthMaître des clésbonjour,
Si ça t’intéresse, bebarth m’avait écrit un script qui “démasque” les modèles masqués en conservant leurs noms de modèle dans le panneau des pages, au lieu d’avoir page 1, page 2, etc. C’est très pratique quand il y en a beaucoup. Avec son autorisation (dont je doute pas) je pourrais te l’envoyer, ou le poster céans.
@Merlin : Tu peux partager car de tête je ne me souviens pas et je ne serai de retour qu’à la fin du mois pour le plonger dans mes archives…@+
😎bebarthMaître des clésDésolé je suis dans le cap corse sans pratiquement aucun réseau…
@+
Attachments:
You must be logged in to view attached files.bebarthMaître des clésbonjour,
Si tu regardes la 3e colonne de la Quick bar, le S indique les niveaux de privilèges où tu peux exécuter cette méthode et on ne trouve pas le niveau Sript de document.
Par contre, si tu étends les privilèges tu devrais pouvoir te créer un menu qui te permette d’exécuter ce script.
Essaye et dis-moi/nous.
@+
bebarthMaître des clésAh, l’Ardèche, ses gorges et jardins suspendus…
😎
bebarthMaître des clésbonjour,
Bonjour, est-ce que vous avez remarqué dernièrement que les caractères avec accents ne sont plus interprétés correctement même si on utilise leurs valeurs Unicode ? Ex: \u00E9 pour «é».
Est-ce que cela signifie que ça a déjà fonctionné un jour ???
A ce que je me souvienne, depuis que j’ai commencé à écrire des utilitaires exécutables depuis un menu ça na jamais fonctionné…
Pour mon premier utilitaire j’avais même abrégé “Proppriétés” par “Prop.”, mais maintenant j’essaie de trouver des mots sans caractères accentués ou je mets des “e” à la places des “é” !@+
😎Attachments:
You must be logged in to view attached files.bebarthMaître des clésbonjour,
Je n’avais pas vu la vidéo ! Si on la regarde, on peut comprendre que l’opération effectuée n’est pas celle indiquée sur la copie d’écran, mais : coef = déport ÷ sin(22,5) ÷ déport
Et là on remarque vite que déport ÷ déport = 1… donc coef = 1/sin(angle) quel que soit le cet angle qui est fonction du déport.
On peut donc écrire :
event.value=1/Math.sin(this.getField("angle").value*Math.PI/180);
Ici on transforme les angles en “radian” qui est l’unité trigonométrique utilisée en JavaScript.@+
😎PS : les vacances sont pour la fin de semaine, mais j’ai (encore) des soucis avec mes e-mails et je ne reçois pas les notifications ni de ce forum, ni de celui d’adobe…
- Cette réponse a été modifiée le il y a 5 mois par bebarth.
Attachments:
You must be logged in to view attached files.bebarthMaître des clésbonjour,
Comment un sinus compris entre -1 et +1 divisé par 500 peut-il être égale à 2,613 ???
De plus, 541,196/500 ne fait jamais 2,6 mais 1 et des brouettes…
Il doit y avoir une erreur de formule !@+
😎bebarthMaître des clésIl faudrait demander à Thom Parker, ou chercher sur son site, si quelqu’un connaît la réponse c’est lui.
Tu nous donneras sa réponse…
@+
😎bebarthMaître des clésbonjour,
Non ce n’est pas possible !
@+
😎bebarthMaître des clésbonjour,
Oups ! Je suppose que tout le monde aura rectifié de lui-même ce dysfonctionnement… on ne peut pas penser à tout. 😉
Pour ma part, j’ai donc modifié les expressions régulières en ligne 124 qui servent à supprimer/rectifier certains caractères inutiles (pour éviter d’avoir des lignes vierges ou des espaces multiples par exemple). Dans la théorie, on a pas besoin de ça si l’on fait attention à ce qu’on frappe…
La nouvelle ligne est :
lesElements=oRslt["elem"].replace(/[ ]{2,}/g," ").replace(/^\s+|\s+$/g,"").replace(/[^\S ]+/g,"\r").replace(/\s{3,}/g,"\r");
Explications sur demande…
J’espère avoir pensé à tout ce coup ci !@+
😎Attachments:
You must be logged in to view attached files.bebarthMaître des clésbonjour,
En script de format personnalisé tu peux écrire :
if (event.value==1) event.value="Growth";
else if (event.value==2) event.value="Diversified";
else if (event.value==3) event.value="Growth or Diversified";
// etc.
else event.value="";
@+
😎Attachments:
You must be logged in to view attached files.bebarthMaître des clésEn fait, dans ton fichier précédent, les champs à double indices n’étaient que des menus déroulants alors que dans celui-ci il y a tous types de champs.
J’ai donc modifié le script pour qu’il ne tienne compte que des menus déroulants (2 fois : en lignes 9 et 88) :
if (OK && this.getField(nomChamp).type=="combobox") {
Ce qui entraine une modification en ligne 195 que je n’écris pas ici car elle comporte un “i” entre crochets, mais je fais une copie d’écran !@+
😎Attachments:
You must be logged in to view attached files.bebarthMaître des clésbonjour,
Je partage (pratiquement) toujours un fichier lorsque je fournis un script et il vaut mieux utiliser le script du fichier plutôt que celui affiché sur le post.
J’avais remarqué qu’il y a un problème d’affichage lorsqu’on indique un “i” entre crochets (disparait à l’affichage, doit être interprété comme une balise).
En tout cas, j’utilise souvent ce” i” entre crochets lorsque j’écris un script et des fois je pense à le modifier avant de partager ce script et d’autres fois je n’y pense pas…
Dans ce script, il y a effectivement plusieurs fois ce “i” entre crochets et si tu as utilisé celui affiché sur le post de réponse, je pense que l’erreur doit venir de là !!!
Essaye donc avec celui fourni dans le fichier et (normalement) ça devrait beaucoup mieux fonctionner…@+
😎- Cette réponse a été modifiée le il y a 5 mois et 3 semaines par bebarth.
Attachments:
You must be logged in to view attached files.bebarthMaître des clésbonjour,
Fonctionne correctement avec PDF-XChange pour moi alors que j’ai un message d’erreur avec ton dernier fichier !@+
😎Attachments:
You must be logged in to view attached files.bebarthMaître des clésbonjour,
Il n’y avait pas d’erreur chez moi, et par contre ton fichier ne fonctionne pas (chez moi également) !@+
😎 -
AuteurRéponses