Donnez vie à vos documents numériques !
 

bebarth

Toutes mes réponses sur les forums

Affichage de 99 réponses de 1 à 99 (sur un total de 3,356)
  • Auteur
    Réponses
  • en réponse à : `Liste déroulante à partir de données Excel #76093
    bebarth
    Maître des clés

    Bonjour,
    c’est effectivement possible d’extraire des données à partir d’un fichier csv ou txt pour alimenter le menu déroulant.
    Mais avec plus de 100 lignes, est-ce très pratique ?
    N’y a-t-il pas moyen de découper afin d’avoir des listes mère filles ?
    Pour ma part, je ne pourrai regarder qu’à partir de lundi.

    @+
    😎

    bebarth
    Maître des clés

    Hi,
    That was possible with the previous .xls file format but not since the .xlsx file format.

    @+
    😎

    en réponse à : Comment faire – + – = + #76043
    bebarth
    Maître des clés

    bonjour,
    Heu ! … Tu pourrais reformuler ta demande ?

    @+
    😎

    en réponse à : Boite de dialogue pour récupérer des valeurs #76021
    bebarth
    Maître des clés

    bonjour,
    Après avoir cherché un certain temps, j’avoue que je n’ai pas trouvé le pourquoi.
    Par contre, j’ai trouvé que ça fonctionne si tu remplis en premier ce champ :
    ...
    if(app.execDialog(bbDialogue)=="ok"){
    this.getField("montRed1").value=reduc;
    this.getField("Index1HP").value=HP;
    this.getField("Index1HC").value=HC;
    this.getField("i1cP").value=EJ;
    this.getField("i1c2").value=EA;
    this.getField("reduc1").value=motif;
    }
    ...

    J’en ai profité pour faire quelques modifications à ta boite de dialogue (si ça te convient)…

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    en réponse à : Boite de dialogue pour récupérer des valeurs #76013
    bebarth
    Maître des clés

    bonjour,
    voici un exemple avec quelques vérifications.
    Ici on vérifie que tous les champs de la boite de dialogue sont remplis, que HP est supérieur à HC (supposition) et que à par le champ « Motif » tous les autres champs sont des nombres.
    On peut bien sûr rajouter des vérifications…
    J’ai fait en sorte que le script pour la boite de dialogue soit le plus compréhensible possible. Ici on doit vérifier tous les champs avec la fonction validate ce n’est donc pas indispensable d’utiliser commit (qui valide sans vérification).

    var bbDialogue={
    loadDefaults: function(boiteDialogue) {
    boiteDialogue.load({
    HPtx: "987",
    HCtx: "123",
    redu: "0",
    moti: "Réduction du "+util.printd("dd mmm yyyy", new Date()),
    })
    },
    initialize: function(boiteDialogue) {
    this.loadDefaults(boiteDialogue);
    },
    validate: function(boiteDialogue) {
    var oRslt=boiteDialogue.store();
    HP=oRslt["HPtx"];
    HC=oRslt["HCtx"];
    EJ=oRslt["EJtx"];
    EA=oRslt["EAtx"];
    reduc=oRslt["redu"];
    motif=oRslt["moti"];
    var testOK0=true;
    if (!HP || !HC || !EJ || !EA || !reduc || !motif) var testOK0=false;
    var testOK1=true;
    if (isNaN(HP) || isNaN(HC) || isNaN(EJ) || isNaN(EA) || isNaN(reduc)) var testOK1=false;
    var testOK2=true;
    if (Number(HC)>=Number(HP)) var testOK2=false;
    if (!testOK0) app.alert("Veuillez remplir tous les champs.",3);
    else if (!testOK1) app.alert("A part le motif de réduction, la valeur des autres champs doit être un nombre.",3);
    else if (!testOK2) app.alert("Le montant HP doit être supérieur au montant HC.",3);
    var testOK=testOK0 && testOK1 && testOK2;
    return testOK;
    },
    description: {
    name: "b2Tools",
    elements: [
    {
    type: "view",
    alignment: "align_fill",
    elements: [
    {
    type: "static_text",
    alignment: "align_center",
    char_width: 20,
    char_height: 3,
    name: "Veuillez de remplir\rtous les champs".toUpperCase(),
    font: "dialog",
    bold: true,
    },
    {
    type: "static_text",
    name: "HP",
    font: "dialog",
    bold: true,
    },
    {
    type: "edit_text",
    item_id: "HPtx",
    width: 200,
    },
    {
    type: "static_text",
    name: "HC",
    font: "dialog",
    bold: true,
    },
    {
    type: "edit_text",
    item_id: "HCtx",
    alignment: "align_fill",
    },
    {
    type: "static_text",
    alignment: "align_center",
    char_width: 20,
    char_height: 3,
    name: "Attention,\rHP doit être > à HC",
    font: "dialog",
    italic: true,
    },
    {
    type: "static_text",
    name: "EJ",
    font: "dialog",
    bold: true,
    },
    {
    type: "edit_text",
    item_id: "EJtx",
    alignment: "align_fill",
    },
    {
    type: "static_text",
    name: "EA",
    font: "dialog",
    bold: true,
    },
    {
    type: "edit_text",
    item_id: "EAtx",
    alignment: "align_fill",
    },
    {
    type: "gap",
    height: 5,
    },
    {
    type: "cluster", //
    elements: [
    {
    type: "static_text",
    name: "Montant de la réduction",
    font: "dialog",
    bold: true,
    },
    {
    type: "edit_text",
    item_id: "redu",
    alignment: "align_fill",
    },
    {
    type: "static_text",
    name: "Motif de la réduction",
    font: "dialog",
    bold: true,
    },
    {
    type: "edit_text",
    item_id: "moti",
    multiline: true,
    alignment: "align_fill",
    height: 75,
    },
    ]
    },
    {
    type: "gap",
    height: 15,
    },
    {
    type: "ok_cancel",
    },
    ]
    },
    ]
    }
    };
    if(app.execDialog(bbDialogue)=="ok"){
    this.getField("HP").value=HP;
    this.getField("HC").value=HC;
    this.getField("EJ").value=EJ;
    this.getField("EA").value=EA;
    this.getField("reduc").value=reduc;
    this.getField("motif").value=motif;
    }

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    en réponse à : Boite de dialogue pour récupérer des valeurs #76009
    bebarth
    Maître des clés

    bonjour,
    … Après, il faut généralement faire quelques vérifications lorsqu’on appuie sur OK (comme tous les champs doivent être remplis et qu’ils correspondent à quelque chose), sinon généralement cela provoque ensuite des erreurs !

    @+
    😎

    bebarth
    Maître des clés

    …et pour info il existe également « insertSeparatorEntryInList » pour insérer un trait de séparation dans le menu déroulant.

    @+
    😎

    bebarth
    Maître des clés

    bonjour,

    Est-ce possible que la liste des options de ce menu déroulant ne soit pas triée alphabétiquement?

    C’est possible en utilisant « insertEntryInList » qui est une fonction non documentée…
    j’essaye de te faire ça ce soir, sinon rapidement…

    @+
    😎

    en réponse à : Bouton radio sur plusieurs lignes #75972
    bebarth
    Maître des clés

    bonjour,
    Tu peux utiliser ce script qui te génèrera des couples de boutons radio avec valeurs d’exportation « Oui ou « Non ».
    var groupes="groupe"; // base des noms de groupes
    var diam=11; // diamètre (pt)
    var delta=35; // entraxe (pt)
    var nb=0;
    var RegExTest=new RegExp("^"+groupes+"\\d+$");
    for (var i=0; i<this.numFields; i++) {
    if (RegExTest.test(this.getNthFieldName(i))) nb++;
    }
    var nomGroupe=groupes+(nb+1);
    var laPage=this.getPageBox();
    var x=laPage[2]/2-delta/2-diam/2;
    var y=laPage[1]/2+diam/2;
    var f=this.addField(nomGroupe,"radiobutton",this.pageNum,[x,y,x+diam,y-diam]);
    x+=delta;
    var f=this.addField(nomGroupe,"radiobutton",this.pageNum,[x,y,x+diam,y-diam]);
    f.fillColor=color.white;
    f.strokeColor=color.black;
    f.borderStyle=border.i;
    f.exportValues=["Oui","Non"];
    f.value="Off"; // ou "Oui" ou "Non"

    @+
    😎

    en réponse à : Script qui marche en partie #75936
    bebarth
    Maître des clés

    bonjour,
    Pourquoi revérifier tous les champs à chaque fois ???
    Tu peux utiliser cette fonction :
    function laCouleur(nomChamp) {
    if (!this.getField(nomChamp).isBoxChecked(0)) {
    this.getField(nomChamp.toUpperCase()).textColor=color.black;
    if (nomChamp.split(".")[0]=="a") this.getField(nomChamp.toUpperCase()).fillColor=color.red;
    else this.getField(nomChamp.toUpperCase()).fillColor=color.blue;
    } else {
    this.getField(nomChamp.toUpperCase()).fillColor=color.transparent;
    if (nomChamp.split(".")[0]=="a") this.getField(nomChamp.toUpperCase()).textColor=color.red;
    else this.getField(nomChamp.toUpperCase()).textColor=color.blue;
    }
    }
    Et l’appeler avec :
    laCouleur(event.target.name);

    Pour écrire cette ligne avec toutesles cases à cocher tu peux exécuter de la console :
    for (var i=0; i<this.numFields; i++) {
    var nomChamp=this.getNthFieldName(i);
    var f=this.getField(this.getNthFieldName(i));
    if (f.type=="checkbox" && (this.getNthFieldName(i).indexOf("a.")==0 || this.getNthFieldName(i).indexOf("b.")==0)) f.setAction("MouseUp","laCouleur(event.target.name);")
    }

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    en réponse à : GREP Indesign #75914
    bebarth
    Maître des clés

    bonjour,
    Ces nombres sont-ils toujours écrits avec un espaces ou y a-t-il possibilité qu’ils le soient sans espaces ???

    Si c’est le cas, essaye :
    var texte="12 345 678";
    var texte=texte.replace(/(\d{1,3}) (\d{3})/g, "$1\u00A0$2");
    console.println("texte : "+texte);

    Sinon, l’expression régulière sera différente (et un peu plus compliquée).

    @+
    😎

    en réponse à : Liste déroulante avec long texte #75906
    bebarth
    Maître des clés

    bonjour,
    A priori, le nom du champ « leChoix » avec un « l » minuscule.

    @+
    😎

    en réponse à : Liste déroulante avec long texte #75897
    bebarth
    Maître des clés

    bonjour,
    Moi je te propose une solution se ressemble un peu plus à une liste, et lorsqu’on passe la souris sur le choix cela affiche le texte qui est « validé » si on appuie sur ce choix (et on re-appuie pour le désélectionner).

    Voici les différents scripts :

    // Souris entrée
    entree(event.target.name.slice(-1));

    function entree(ind) {
    for (var i=0; i<4; i++) this.getField("choix."+i).textColor=color.ltGray;
    if (this.getField("leChoix").value!=="") {
    this.getField("choix."+this.getField("leChoix").value).textColor=color.gray;
    this.getField("choix."+this.getField("leChoix").value).strokeColor=color.red;
    }
    event.target.textColor=color.black;
    this.getField("leTexte").value=textes[ind];
    this.getField("leTexte").display=display.visible;
    }

    // Souris sortie
    sortie(event.target.name.slice(-1));

    function sortie(ind) {
    for (var i=0; i<4; i++) {
    this.getField("choix."+i).textColor=color.ltGray;
    this.getField("choix."+i).strokeColor=color.transparent;
    }
    if (this.getField("leChoix").value==="") this.getField("leTexte").display=display.hidden;
    else {
    this.getField("leTexte").value=textes[this.getField("leChoix").value];
    this.getField("choix."+this.getField("leChoix").value).textColor=color.black;
    }
    }

    // Souris relâchée
    relachee(event.target.name.slice(-1));

    function relachee(ind) {
    for (var i=0; i<4; i++) {
    this.getField("choix."+i).textColor=color.ltGray;
    this.getField("choix."+i).strokeColor=color.transparent;
    }
    if (this.getField("leChoix").value==ind) this.getField("leChoix").value="";
    else {
    this.getField("leChoix").value=ind;
    event.target.textColor=color.black;
    event.target.strokeColor=color.red;
    }
    }

    // init
    var textes=["LIT-201 – Introduction à la littérature musicale\rLe cours LIT-201 explore les grandes périodes et aborde les œuvres majeures qui ont marqué l’histoire de la musique en Occident, du Moyen Âge jusqu’à aujourd’hui. Des genres et des styles variés provenant du répertoire instrumental, vocal, profane et sacré sont étudiés. Ce cours vise à acquérir des connaissances et des compétences pour apprécier des œuvres représentatives de grandes périodes historiques, et pour les situer dans leur contexte. Il amènera aussi l’étudiante et l’étudiant à une meilleure compréhension du langage musical grâce à une initiation à l’analyse.","LIT-202 – Moyen Âge, Renaissance et baroque\rLe cours LIT-202 aborde les grandes œuvres et explore les différents courants qui ont marqué l’histoire de la musique en Occident, du Moyen Âge jusqu’au milieu du 18e siècle. Des genres et des styles variés provenant du répertoire instrumental, vocal, profane et sacré sont étudiés. Ce cours vise à acquérir des connaissances et des compétences pour apprécier des œuvres représentatives de l’époque médiévale, de la Renaissance et du baroque, et pour les situer dans leur contexte. Il amènera aussi l’étudiante et l’étudiant à une meilleure compréhension du langage musical grâce à une initiation à l’analyse.","LIT-203 – Classicisme et Romantisme\rLe cours LIT-203 aborde les grandes œuvres et explore les différents courants qui ont marqué l’histoire de la musique en Occident, du milieu du 18e siècle jusqu’à la fin du 19e siècle. Des genres et des styles variés provenant du répertoire instrumental, vocal, profane et sacré sont étudiés. Ce cours vise à acquérir des connaissances et des compétences pour apprécier des œuvres représentatives des périodes classique et romantique, et pour les situer dans leur contexte. Il amènera aussi l’étudiante et l’étudiant à une meilleure compréhension du langage musical grâce à une initiation à l’analyse.","LIT-204 – XXe siècle et musique contemporaine\rLe cours LIT-204 aborde les grandes œuvres et explore les différents courants qui ont marqué l’histoire de la musique en Occident, du début du 20e siècle jusqu’à aujourd’hui. Des genres et des styles variés provenant du répertoire tant instrumental que vocal sont étudiés, et la musique québécoise est abordée. Ce cours vise à acquérir des connaissances et des compétences pour apprécier des œuvres représentatives de cette période et pour les situer dans leur contexte. Il amènera aussi l’étudiante et l’étudiant à une meilleure compréhension du langage musical grâce à une initiation à l’analyse."];

    …et le fichier associé.

    En espérant que cet exemple te conviendra !

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    en réponse à : Action pour ouvrir une page web par script #75856
    bebarth
    Maître des clés

    Si je trouve, je te dirai pourquoi ça ne fonctionne pas en fonction, mais pour l’instant je ne sais pas !!!

    @+
    😎

    en réponse à : Action pour ouvrir une page web par script #75853
    bebarth
    Maître des clés

    …comme ça je ne comprends pas pourquoi cela ne fonctionne pas !
    Dans un premier temps tu peux mettre ce script sur tous tes boutons « AjouT ».

    var ind=event.target.name.substring(event.target.name.indexOf(".")+1);
    var nomBoutons=[];
    for (var k=0; k<10; k++) nomBoutons.push(this.getField("LinkT."+ind+"."+k).buttonGetCaption());
    for (var k=0; k<10; k++) {
    if (this.getField("LinkT."+ind+"."+k).buttonGetCaption()=="...") break;
    }
    if (k==10) app.alert("Tous les boutons renvoient à une URL.",3);
    lesElements=[0,1,2,3,4,5,6,7,8,9];
    var laListe="- Indices -";
    var listeElements="var listeElements \= \{\""+laListe+"\": "+(lesElements.length+1)+",";
    for (var i=0; i<lesElements.length; i++) {
    if (i!=k) var par=-1;
    else var par=1;
    listeElements+="\""+lesElements+"\": "+(par*(i+1)).toString()+",";
    }
    var listeElements=listeElements.substring(0, listeElements.length-1);
    listeElements+="\}";
    eval(listeElements);
    //
    var bDialogue={
    initialize: function(bDialogue) {
    this.cbInit=true;
    bDialogue.enable({url0: true});
    this.loadDefaults(bDialogue);
    },
    loadDefaults: function(bDialogue) {
    bDialogue.load({
    cb00: false,
    rd00: true,
    url0: "http://www.",
    menu: listeElements,
    });
    },
    cb00: function(bDialogue) {
    this.cbInit=!this.cbInit;
    bDialogue.enable({init: this.cbInit});
    },
    quelBtRd: function (oRslt) {
    for (var i=0; i<=1; i++) {
    if (oRslt["rd0"+i]) {
    switch (i) {
    case 0:
    resBtRd="Non";
    break;
    case 1:
    resBtRd="Oui";
    }
    }
    };
    return resBtRd;
    },
    validate: function(bDialogue) {
    var oRslt=bDialogue.store();
    var elements=bDialogue.store()["menu"];
    for (var i in elements) {
    if (elements>0) indice=i;
    }
    if (indice=="- Indices -") {
    app.alert("Veuillez sélectionner l'indice d'un champ;.",3);
    return false;
    } else {
    initialiser=oRslt["cb00"];
    if (initialiser) {
    texteBouton="...";
    texteURL="";
    return true;
    } else {
    texteBouton=oRslt["nmbt"];
    var testOK0=true;
    if (!/^(\w|\W)+( (\w|\W)+)*$/.test(texteBouton)) var testOK0=false;
    var testOK1=true;
    texteURL=oRslt["url0"];
    if (!/^(https?:\/\/)?([\w-]+(\.[\w-]+)+)(:\d+)?(\/[^\s]*)?$/i.test(texteURL)) var testOK1=false;
    cAc=this.quelBtRd(oRslt);
    if (nomBoutons[indice]!="...") {
    if (cAc=="Non") {
    app.alert("Le bouton \"LinkT."+ind+"."+indice+"\" est déjà renseigné.",3);
    return false;
    } else {
    var reponse=app.alert("Le bouton \"LinkT."+ind+"."+indice+"\" est déjà renseigné.\rSouhaitez-vous réellement le modifier ?",3,2);
    if (reponse==3) return false;
    }
    }
    if (!testOK0) app.alert("Veuillez indiquer un nom pour le bouton.",3);
    else if (!testOK1) app.alert("Veuillez renseigner une URL correcte.",3);
    var testOK=testOK0 && testOK1;
    return testOK;
    }
    }
    },
    description: {
    name: "Bouton vers URL",
    first_tab: "cb00",
    elements: [
    {
    type: "cluster", //
    elements: [
    {
    type: "static_text",
    name: "Indice du bouton",
    font: "dialog",
    bold: true,
    },
    {
    type: "popup",
    item_id: "menu",
    alignment: "align_fill",
    //width: 150,
    },
    {
    type: "check_box",
    alignment: "align_center",
    item_id: "cb00",
    name: " Réinitialiser le bouton",
    },
    {
    type: "gap",
    height: 5
    },
    {
    type: "cluster",
    item_id: "init",

    elements: [
    {
    type: "static_text",
    name: "Texte pour le bouton",
    font: "dialog",
    bold: true,
    },
    {
    type: "edit_text",
    item_id: "nmbt",
    alignment: "align_fill",
    },
    {
    type: "gap",
    height: 5
    },
    {
    type: "static_text",
    name: "URL à atteindre",
    font: "dialog",
    bold: true,
    },
    {
    type: "edit_text",
    item_id: "url0",
    alignment: "align_fill",
    },
    {
    type: "gap",
    height: 5
    },
    {
    type: "static_text",
    name: "Modifier le bouton si renseigné ?",
    font: "dialog",
    bold: true,
    },
    {
    type: "view",
    alignment: "align_center",
    align_children: "align_row",
    elements: [
    {
    type: "radio",
    group_id: "gr00",
    item_id: "rd00",
    name: " Non",
    },
    {
    type: "radio",
    group_id: "gr00",
    item_id: "rd01",
    name: " Oui",
    },
    ]
    },
    ]
    },
    {
    type: "gap",
    height: 5
    },
    {
    type: "ok_cancel",
    },
    ]
    },
    ]
    }
    };
    if("ok"==app.execDialog(bDialogue)){
    if (initialiser) {
    this.getField("LinkT."+ind+"."+indice).setAction("MouseUp","//");
    this.getField("LinkT."+ind+"."+indice).buttonSetCaption("...");
    this.getField("LinkT."+ind+"."+indice).fillColor=color.ltGray;
    } else {
    this.getField("LinkT."+ind+"."+indice).setAction("MouseUp","app.launchURL(\""+texteURL+"\");");
    this.getField("LinkT."+ind+"."+indice).buttonSetCaption(texteBouton);
    this.getField("LinkT."+ind+"."+indice).fillColor=color.green;
    }
    }

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    en réponse à : Action pour ouvrir une page web par script #75844
    bebarth
    Maître des clés

    J’ai fait une version qui fonctionne apparemment avec PDF Expert !
    A vérifier quand même…

    Il y avait une erreur que j’ai modifié (dans les 2 fichiers);

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    en réponse à : Action pour ouvrir une page web par script #75839
    bebarth
    Maître des clés

    PDF Expert gère nativement les boites de dialogue (AcroDialog).

    Je n’avais pas vérifié avec PDF Expert et effectivement :

    1. Il ne trouve pas le premier indice disponible
    2. Il ne comprend pas « insertSeparatorEntryInList »

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    en réponse à : Calcul filetages #75837
    bebarth
    Maître des clés

    Voici ton fichier corrigé.
    Normalement ça fonctionne !!!

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    en réponse à : Action pour ouvrir une page web par script #75833
    bebarth
    Maître des clés

    bonjour,

    c’est plus complexe que je ne le pensais

    C’est pas le plus simple dans le Javascript Acrobat… Il y a quelques exemples dans l’API Reference (https://opensource.adobe.com/dc-acrobat-sdk-docs/library/jsapiref/JS_API_AcroJS.html#execdialog) ou sur ce fichier de Thom Parker (page : https://www.pdfscripting.com/public/ACRODIALOGS-OVERVIEW.cfm, fichier : http://www.windjack.com/resources/Examples/DialogUses.pdf).
    Si cela t’intéresse de créer des boites de dialogue je peu de donner quelques exemples simples.

    Voilà ce que j’ai fait. Je pense l’avoir testé, mais dis-moi s’il y a des erreurs.
    J’en ai profité pour faire un peu de pub à ma fille !!!

    Voici le script :

    var nomBoutons=[];
    for (var k=0; k<10; k++) nomBoutons.push(this.getField("LinkT.1."+k).buttonGetCaption());
    for (var k=0; k<10; k++) {
    if (this.getField("LinkT.1."+k).buttonGetCaption()=="...") break;
    }
    if (k==10) app.alert("Tous les boutons renvoient à une URL.",3);
    //
    var bDialogue={
    initialize: function(bDialogue) {
    this.cbInit=true;
    bDialogue.enable({url0: true});
    this.loadDefaults(bDialogue);
    },
    loadDefaults: function(bDialogue) {
    bDialogue.load({
    cb00: false,
    rd00: true,
    url0: "http://www.",
    });
    bDialogue.insertEntryInList({"menu":{"- Indices -": 0}});
    bDialogue.insertSeparatorEntryInList("menu");
    for (var i=0; i<10; i++) {
    if (i!=k) var par=-1;
    else var par=1;
    eval("bDialogue.insertEntryInList({\"menu\":{\""+i+"\": "+(par*(i+1))+"}});");
    }
    },
    cb00: function(bDialogue) {
    this.cbInit=!this.cbInit;
    bDialogue.enable({init: this.cbInit});
    },
    quelBtRd: function (oRslt) {
    for (var i=0; i<=1; i++) { if (oRslt["rd0"+i]) { switch (i) { case 0: resBtRd="Non"; break; case 1: resBtRd="Oui"; } } }; return resBtRd; }, validate: function(bDialogue) { var oRslt=bDialogue.store(); var elements=bDialogue.store()["menu"]; for (var i in elements) { if (elements>0) indice=i;
    }
    if (indice=="- Indices -") {
    app.alert("Veuillez sélectionner l'indice d'un champ;.",3);
    return false;
    } else {
    initialiser=oRslt["cb00"];
    if (initialiser) {
    texteBouton="...";
    texteURL="";
    return true;
    } else {
    texteBouton=oRslt["nmbt"];
    var testOK0=true;
    if (!/^(\w|\W)+( (\w|\W)+)*$/.test(texteBouton)) var testOK0=false;
    if (!testOK0) app.alert("Veuillez indiquer un nom pour le bouton.",3);
    var testOK1=true;
    texteURL=oRslt["url0"];
    if (!/^(https?:\/\/)?([\w-]+(\.[\w-]+)+)(:\d+)?(\/[^\s]*)?$/i.test(texteURL)) var testOK1=false;
    if (!testOK1) app.alert("Veuillez renseigner une URL correcte.",3);
    cAc=this.quelBtRd(oRslt);
    if (nomBoutons[indice]!="...") {
    if (cAc=="Non") {
    app.alert("Le bouton d'indice \""+indice+"\" est déjà renseigné.",3);
    return false;
    } else {
    var reponse=app.alert("Le bouton d'indice \""+indice+"\" est déjà renseigné.\rSouhaitez-vous réellement le modifier ?",3,2);
    if (reponse==3) return false;
    }
    }
    var testOK=testOK0 && testOK1;
    return testOK;
    }
    }
    },
    description: {
    name: "Bouton vers URL",
    first_tab: "cb00",
    elements: [
    {
    type: "cluster", //
    elements: [
    {
    type: "static_text",
    name: "Indice du bouton",
    font: "dialog",
    bold: true,
    },
    {
    type: "popup",
    item_id: "menu",
    alignment: "align_fill",
    //width: 150,
    },
    {
    type: "check_box",
    alignment: "align_center",
    item_id: "cb00",
    name: " Réinitialiser le bouton",
    },
    {
    type: "gap",
    height: 5
    },
    {
    type: "cluster",
    item_id: "init",

    elements: [
    {
    type: "static_text",
    name: "Texte pour le bouton",
    font: "dialog",
    bold: true,
    },
    {
    type: "edit_text",
    item_id: "nmbt",
    alignment: "align_fill",
    },
    {
    type: "gap",
    height: 5
    },
    {
    type: "static_text",
    name: "URL à atteindre",
    font: "dialog",
    bold: true,
    },
    {
    type: "edit_text",
    item_id: "url0",
    alignment: "align_fill",
    },
    {
    type: "gap",
    height: 5
    },
    {
    type: "static_text",
    name: "Modifier le bouton si renseigné ?",
    font: "dialog",
    bold: true,
    },
    {
    type: "view",
    alignment: "align_center",
    align_children: "align_row",
    elements: [
    {
    type: "radio",
    group_id: "gr00",
    item_id: "rd00",
    name: " Non",
    },
    {
    type: "radio",
    group_id: "gr00",
    item_id: "rd01",
    name: " Oui",
    },
    ]
    },
    ]
    },
    {
    type: "gap",
    height: 5
    },
    {
    type: "ok_cancel",
    },
    ]
    },
    ]
    }
    };
    if("ok"==app.execDialog(bDialogue)){
    if (initialiser) {
    this.getField("LinkT.1."+indice).setAction("MouseUp","//");
    this.getField("LinkT.1."+indice).buttonSetCaption("...");
    this.getField("LinkT.1."+indice).fillColor=color.ltGray;
    } else {
    this.getField("LinkT.1."+indice).setAction("MouseUp","app.launchURL(\""+texteURL+"\");");
    this.getField("LinkT.1."+indice).buttonSetCaption(texteBouton);
    this.getField("LinkT.1."+indice).fillColor=color.green;
    }
    }

    …et le fichier où j’ai rajouté une ligne pour en avoir 10 (de 0 à 9).

    @+
    😎

    • Cette réponse a été modifiée le il y a 3 mois et 2 semaines par bebarth.
    Attachments:
    You must be logged in to view attached files.
    en réponse à : Calcul filetages #75830
    bebarth
    Maître des clés

    bonjour,
    Je regarde rapidement…

    @+
    😎

    en réponse à : Action pour ouvrir une page web par script #75829
    bebarth
    Maître des clés

    bonjour,

    D’ici là je vais chercher pour voir si j’y arrive.

    As-tu réussi à faire quelque chose ?
    Je m’y attelle dès ce soir. « Normalement » ça ne devrait pas être trop long. la boite de dialogue n’est pas très compliquée, mais lorsqu’on n’en fait pas depuis un certain temps il faut se remettre dans le bain.
    Je te tiens au courant…

    @+
    😎

    en réponse à : Calcul filetages #75824
    bebarth
    Maître des clés

    bonjour,
    L’expression régulière vérifie les chaines de caractères strictement !
    UNEF 1.11/16 – – 32 – Pas 1.720 n’est donc pas la même chose que UNEF 1 11/16 – 32 – Pas 1.720 (sans point et avec un simple tiret). La première chaine testée est donc fausse alors que la seconde est vraie.

    @+
    😎

    en réponse à : Calcul filetages #75817
    bebarth
    Maître des clés

    il y a 2 valeurs que je ne sais pas entrer ( 1.11/16-18 Pas 1,720 Perage 44,45 — 2″-18 Pas 1,971 Perçage 50.8)

    C’est compliqué de modifier toujours l’énoncé du problème. Il faut réadapter à chaque fois l’expression régulière… Maintenant elle en est à :
    var filetageRegEx=/^UNE?(C|F)[ ]*(\d{0,2}["]?[ ]*(\d+[/]\d+)?)[ ]*-[ ]*(\d{1,2})[ ]*-[ ]*\w*[ ]*(\d{1,2}[.,]\d{1,3})$/;

    Tu devrais maintenant pouvoir entrer tes nouvelles valeurs.

    @+
    😎

    • Cette réponse a été modifiée le il y a 3 mois et 2 semaines par bebarth.
    Attachments:
    You must be logged in to view attached files.
    en réponse à : Calcul filetages #75814
    bebarth
    Maître des clés

    Et sur une page que j’ai recréé “UNEF”

    Il ne faut pas écrire :
    var filetageRegEx=/^UN(C|EF)[ ]*(\d?["]?[ ]*(\d[/]\d+)?)[ ]*-[ ]*(\d{1,2})[ ]*-[ ]*\w*[ ]*(\d{1,2}[.,]\d{1,3})$/;
    mais
    var filetageRegEx=/^UNE?(C|F)[ ]*(\d?["]?[ ]*(\d[/]\d+)?)[ ]*-[ ]*(\d{1,2})[ ]*-[ ]*\w*[ ]*(\d{1,2}[.,]\d{1,3})$/;

    @+
    😎

    en réponse à : Calcul filetages #75812
    bebarth
    Maître des clés

    bonjour,

    la page PG Beug, pourquoi aucune idée §

    Tout le monde aura remarqué (lol) qu’avec cette expression régulière :
    var filetageRegEx=/^(W|(BSF)|(PG)|(NPT))[ ]*(\d?["]?[ ]*(\d[/]\d+)?)[ ]*-[ ]*\w*[ ]*(\d{1,2}[.,]\d{1,3})$/;
    il n’est possible d’indiquer qu’un seul chiffre pour le diamètre. pour qu’il soit possible d’en indiquer 2, il faut écrire :
    var filetageRegEx=/^(W|(BSF)|(PG)|(NPT))[ ]*(\d{1,2}["]?[ ]*(\d[/]\d+)?)[ ]*-[ ]*\w*[ ]*(\d{1,2}[.,]\d{1,3})$/;
    et comme je viens de m’apercevoir de la possibilité d’une décimale, l’expression régulière devient :
    var filetageRegEx=/^(W|(BSF)|(PG)|(NPT))[ ]*(\d{1,2}[.]?\d?["]?[ ]*(\d[/]\d+)?)[ ]*-[ ]*\w*[ ]*(\d{1,2}[.,]\d{1,3})$/;

    Dans mon fichier de retour j’ai mis en fonction une parie du script ce qui permet de ne l’écrire qu’une seule fois dans le fichier et juste d’appeler cette fonction avec le menu déroulant.
    // Script de document
    function filetages() {
    for (var i=0; i<event.target.numItems; i++) {
    if (event.changeEx==event.target.getItemAt(i,true)) break;
    }
    var lesValeurs=event.target.getItemAt(i,false);
    //
    var vis="";
    var pas="";
    var filetageRegEx=/^M[ ]*(\d{1,2})[ ]*-[ ]*\w*[ ]*(\d{1,2}[.,]\d{1,3})$/;
    if (filetageRegEx.test(lesValeurs)) {
    var visPas=lesValeurs.replace(filetageRegEx,"$1-$2".replace(/,/g,"."));
    var vis=visPas.split("-")[0];
    var pas=visPas.split("-")[1];
    } else {
    var filetageRegEx=/^(W|(BSF)|(PG)|(NPT))[ ]*(\d{1,2}[.]?\d?["]?[ ]*(\d[/]\d+)?)[ ]*-[ ]*\w*[ ]*(\d{1,2}[.,]\d{1,3})$/;
    if (filetageRegEx.test(lesValeurs)) {
    var visPas=lesValeurs.replace("\""," ").replace(/[ ]+/g," ").replace(filetageRegEx,"$5-$7".replace(/,/g,"."));
    var laVis=visPas.split("-")[0].split(/[ ]/);
    if (laVis.length==1) {
    var vis=(Number(laVis[0].split("/")[0])/Number(laVis[0].split("/")[1]))*25.4;
    } else {
    if (laVis[1]) var vis=(Number(laVis[0])+(Number(laVis[1].split("/")[0])/Number(laVis[1].split("/")[1])))*25.4;
    else var vis=Number(laVis[0])*25.4;
    }
    var pas=visPas.split("-")[1];
    } else {
    var filetageRegEx=/^UN(C|F)[ ]*(\d{1,2}["]?[ ]*(\d[/]\d+)?)[ ]*-[ ]*(\d{1,2})[ ]*-[ ]*\w*[ ]*(\d{1,2}[.,]\d{1,3})$/;
    if (filetageRegEx.test(lesValeurs)) {
    var visPas=lesValeurs.replace("\""," ").replace(/[ ]+/g," ").replace(filetageRegEx,"$2-$4-$5".replace(/,/g,"."));
    var laVis=visPas.split("-")[0].split(/[ ]/);
    if (Number(visPas.split("-")[1])>=28 && /[^"]/.test(lesValeurs) && Number(visPas.split("-")[0])<=12) {
    var UN=[1.524,1.854,2.184,2.515,2.845,3.175,3.505,"-",4.166,"-",4.826,"-",5,486];
    var vis=UN[Number(visPas.split("-")[0])];
    } else if (laVis.length==1) {
    var vis=(Number(laVis[0].split("/")[0])/Number(laVis[0].split("/")[1]))*25.4;
    } else {
    var vis=(Number(laVis[0])+(Number(laVis[1].split("/")[0])/Number(laVis[1].split("/")[1])))*25.4;
    }
    var pas=visPas.split("-")[2];
    } else {
    var filetageRegEx=/^G[ ]*(\d{1,2}["]?[ ]*(\d[/]\d+)?)[ ]*-[ ]*\w*[ ]*(\d{1,2}[.,]\d{1,3})$/;
    if (filetageRegEx.test(lesValeurs)) {
    var visPas=lesValeurs.replace("\""," ").replace(/[ ]+/g," ").replace(filetageRegEx,"$1-$3".replace(/,/g,"."));
    var laVis=visPas.split("-")[0].split(/[ ]/);
    var filetageGaz=[["1/16",7.723],["1/8",9.728],["1/4",13.157],["3/8",16.662],["1/2",20.955],["5/8",22.911],["3/4",26.441],["7/8",30.201],["1",33.249],["1 1/8",37.897],["1 1/4",41.91],["1 1/2",47.803],["1 3/4",53.746],["2",59.614],["2 1/4",65.71],["2 1/2",75.184],["2 3/4",81.534],["3",87.884],["3 1/2",100.33],["4",125.73],["4 1/2",125.73],["5",138.43],["5 1/2",151.13],["6",163,83]];
    if (laVis.length>1 && laVis[1]) var filetage=laVis[0]+" "+laVis[1];
    else var filetage=laVis[0];
    for (var j=0; j<filetageGaz.length; j++) {
    if (filetageGaz[j][0]==filetage) {
    var vis=filetageGaz[j][1];
    break;
    }
    }
    if (j==filetageGaz.length) app.alert("Filetage incorrect",3);
    else var pas=visPas.split("-")[1];
    } else app.alert("Filetage incorrect",3);
    }
    }
    }
    return [vis, pas]
    }
    // Script de touches personnalisé
    if (!event.willCommit) {
    var visETpas=filetages();
    try {
    /*
    console.println("vis : "+vis);
    console.println("pas : "+pas);
    this.getField("Text5").value=vis;
    this.getField("Text6").value=pas;
    */
    this.getField("FiltagePGR").value=visETpas[0];
    this.getField("PasPGconv").value=visETpas[1];
    } catch(e) {
    app.alert("Filetage incorrect",3);
    }
    }

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    en réponse à : Action pour ouvrir une page web par script #75811
    bebarth
    Maître des clés

    bonjour,

    Je n’arrive pas à savoir comment faire pour avoir tout ceci dans la même boite de dialogue…

    C’est un petit boulot, mais si tu n’es pas trop pressé je te fais ça en fin de semaine…

    @+
    😎

    en réponse à : Calcul filetages #75790
    bebarth
    Maître des clés

    J’ai voulu modifier le script car j’ai vu ou etait les diametres, je les mis mais le script sonne, je ne vois pas l’erreur

    Je regarderai lundi car ce ne sera pas possible ce weekend !

    Quelles sont les lignes modifiées ? Ça m’évitera de chercher trop longtemps…

    @+
    😎

    • Cette réponse a été modifiée le il y a 3 mois et 3 semaines par bebarth.
    en réponse à : Calcul filetages #75787
    bebarth
    Maître des clés

    Cette ligne correspond a quoi ? : var UN=[1.524,1.854,2.184,2.515,2.845,3.175,3.505,”-“,4.166,”-“,4.826,”-“,5,486];

    Cette ligne est une table de correspondance des petites vis UNC/UNF dont le numéro de 0 à 12 n’indique pas le diamètre.

    Attention, le dernier élément de la table doit être 5.486 (avec un point).

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    en réponse à : Calcul filetages #75784
    bebarth
    Maître des clés

    Et juste pour savoir, c’est normal que l’exportation de valeurs perçage ne se fait plus ?

    Il faut cocher la case du menu déroulant « Valider la valeur sélectionnée immédiatement ».

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    en réponse à : Action pour ouvrir une page web par script #75782
    bebarth
    Maître des clés

    bonjour,
    Voici ma proposition qui devrait correspondre à ce que tu demandes :
    var i=event.target.name.substr(6);
    var j=this.getField("NoLieT."+i).value;
    if (this.getField("LinkT."+i+"."+j).buttonGetCaption()!="....") {
    app.alert("Ce bouton renvoie déjà à une url.",3);
    } else {
    var leLien=this.getField("LaT."+i).value;
    if (j!="-" && /^(https?:\/\/)?([\w-]+(\.[\w-]+)+)(:\d+)?(\/[^\s]*)?$/i.test(leLien)) {
    this.getField("LinkT."+i+"."+j).setAction("MouseUp","app.launchURL(\""+leLien+"\");");
    var texteBouton="";
    while ((!/^(\w|\W)+( (\w|\W)+)*$/.test(texteBouton) && texteBouton!=null) || texteBouton=="Exemple") {
    var texteBouton=app.response({
    cQuestion: "Quel nom souhaitez-vous attribuer à ce bouton ?",
    cTitle: "Nom du bouton",
    cLabel: "Nom :",
    cDefault: "Exemple"
    });
    }
    if (texteBouton!=null) {
    this.getField("LinkT."+i+"."+j).buttonSetCaption(texteBouton);;
    this.getField("LinkT."+i+"."+j).fillColor=color.green;
    this.getField("LaT."+i).value="";
    for (var k=0; k<10; k++) {
    if (this.getField("LinkT."+i+"."+k).buttonGetCaption()=="....") {
    this.getField("NoLieT."+i).value=k;
    break;
    }
    }
    if (k==10) app.alert("Tous les boutons renvoient à une url",3);
    }
    }
    else if (j=="-") app.alert("Veuillez choisir un numéro d'indice",3);
    else app.alert("L'url indiquée n'est pas correcte",3);
    }

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    en réponse à : Calcul filetages #75769
    bebarth
    Maître des clés

    bonjour,
    Voici un nouveau script ou les diamètres pour les filetages gaz sont indiqués dans une table.
    Pour info, j’ai retiré de ta liste le modèle 1″3/8 qui n’existe pas et que je prenais en exemple… ce qui m’a perturbé un moment car bien entendu il n’était pas dans la table !
    if (!event.willCommit) {
    for (var i=0; i<event.target.numItems; i++) { if (event.changeEx==event.target.getItemAt(i,true)) break; } var lesValeurs=event.target.getItemAt(i,false); // var vis=""; var pas=""; var filetageRegEx=/^M[ ]*(\d{1,2})[ ]*-[ ]*\w*[ ]*(\d{1,2}[.,]\d{1,3})$/; if (filetageRegEx.test(lesValeurs)) { var visPas=lesValeurs.replace(filetageRegEx,"$1-$2".replace(/,/g,".")); var vis=visPas.split("-")[0]; var pas=visPas.split("-")[1]; } else { var filetageRegEx=/^(W|(BSF)|(PG)|(NPT))[ ]*(\d?["]?[ ]*(\d[/]\d+)?)[ ]*-[ ]*\w*[ ]*(\d{1,2}[.,]\d{1,3})$/; if (filetageRegEx.test(lesValeurs)) { var visPas=lesValeurs.replace("\""," ").replace(/[ ]+/g," ").replace(filetageRegEx,"$5-$7".replace(/,/g,".")); var laVis=visPas.split("-")[0].split(/[ ]/); if (laVis.length==1) { var vis=(Number(laVis[0].split("/")[0])/Number(laVis[0].split("/")[1]))*25.4; } else { if (laVis[1]) var vis=(Number(laVis[0])+(Number(laVis[1].split("/")[0])/Number(laVis[1].split("/")[1])))*25.4; else var vis=Number(laVis[0])*25.4; } var pas=visPas.split("-")[1]; } else { var filetageRegEx=/^UN(C|F)[ ]*(\d?["]?[ ]*(\d[/]\d+)?)[ ]*-[ ]*(\d{1,2})[ ]*-[ ]*\w*[ ]*(\d{1,2}[.,]\d{1,3})$/; if (filetageRegEx.test(lesValeurs)) { var visPas=lesValeurs.replace("\""," ").replace(/[ ]+/g," ").replace(filetageRegEx,"$2-$4-$5".replace(/,/g,".")); var laVis=visPas.split("-")[0].split(/[ ]/); if (Number(visPas.split("-")[1])>=28 && /[^"]/.test(lesValeurs) && Number(visPas.split("-")[0])<=12) { var UN=[1.524,1.854,2.184,2.515,2.845,3.175,3.505,"-",4.166,"-",4.826,"-",5.486]; var vis=UN[Number(visPas.split("-")[0])]; } else if (laVis.length==1) { var vis=(Number(laVis[0].split("/")[0])/Number(laVis[0].split("/")[1]))*25.4; } else { var vis=(Number(laVis[0])+(Number(laVis[1].split("/")[0])/Number(laVis[1].split("/")[1])))*25.4; } var pas=visPas.split("-")[2]; } else { var filetageRegEx=/^G[ ]*(\d?["]?[ ]*(\d[/]\d+)?)[ ]*-[ ]*\w*[ ]*(\d{1,2}[.,]\d{1,3})$/; if (filetageRegEx.test(lesValeurs)) { var visPas=lesValeurs.replace("\""," ").replace(/[ ]+/g," ").replace(filetageRegEx,"$1-$3".replace(/,/g,".")); var laVis=visPas.split("-")[0].split(/[ ]/); var filetageGaz=[["1/16",7.723],["1/8",9.728],["1/4",13.157],["3/8",16.662],["1/2",20.955],["5/8",22.911],["3/4",26.441],["7/8",30.201],["1",33.249],["1 1/8",37.897],["1 1/4",41.91],["1 1/2",47.803],["1 3/4",53.746],["2",59.614],["2 1/4",65.71],["2 1/2",75.184],["2 3/4",81.534],["3",87.884],["3 1/2",100.33],["4",125.73],["4 1/2",125.73],["5",138.43],["5 1/2",151.13],["6",163.83]]; if (laVis.length>1 && laVis[1]) var filetage=laVis[0]+" "+laVis[1];
    else var filetage=laVis[0];
    for (var j=0; j<filetageGaz.length; j++) {
    if (filetageGaz[j][0]==filetage) {
    var vis=filetageGaz[j][1];
    break;
    }
    }
    if (j==filetageGaz.length) app.alert("Filetage incorrect",3);
    else var pas=visPas.split("-")[1];
    } else app.alert("Filetage incorrect",3);
    }
    }
    }
    try {
    console.println("vis : "+vis);
    console.println("pas : "+pas);
    this.getField("Text5").value=vis;
    this.getField("Text6").value=pas;
    } catch(e) {
    app.alert("Filetage incorrect",3);
    }
    }

    Attention, le dernier élément de la table filetageGaz doit être [« 6 »,163.83] (avec un point).

    @+
    😎

    • Cette réponse a été modifiée le il y a 3 mois et 3 semaines par bebarth.
    Attachments:
    You must be logged in to view attached files.
    en réponse à : Calcul filetages #75765
    bebarth
    Maître des clés

    Comme indiqué sur la page « la lettre G suivi de la taille (qui, pour rappel, n’a aucun rapport avec le diamètre)« .
    Il me semble que pour le gaz la taille indiquée correspond au diamètre intérieur du tube, alors que le diamètre correspondant est son diamètre extérieur.
    Il faudra donc utiliser une table pour indiquer ces diamètres car le rapport intérieur/extérieur n’est pas constant. Je regarde plus tard…

    @+
    😎

    • Cette réponse a été modifiée le il y a 3 mois et 3 semaines par bebarth.
    • Cette réponse a été modifiée le il y a 3 mois et 3 semaines par bebarth.
    Attachments:
    You must be logged in to view attached files.
    en réponse à : Calcul filetages #75758
    bebarth
    Maître des clés

    <p style= »text-align: left; »>bonjour,
    J’ai fait une petite modification du script :
    if (!event.willCommit) {
    for (var i=0; i<event.target.numItems; i++) { if (event.changeEx==event.target.getItemAt(i,true)) break; } var lesValeurs=event.target.getItemAt(i,false); // var filetageRegEx=/^M[ ]*(\d{1,2})[ ]*-[ ]*\w*[ ]*(\d{1,2}[.,]\d{1,3})$/; if (filetageRegEx.test(lesValeurs)) { var visPas=lesValeurs.replace(filetageRegEx,"$1-$2".replace(/,/g,".")); var vis=visPas.split("-")[0]; var pas=visPas.split("-")[1]; } else { var filetageRegEx=/^(W|(BSF)|G|(PG)|(NPT))[ ]*(\d?["]?[ ]*(\d[/]\d+)?)[ ]*-[ ]*\w*[ ]*(\d{1,2}[.,]\d{1,3})$/; if (filetageRegEx.test(lesValeurs)) { var visPas=lesValeurs.replace("\""," ").replace(/[ ]+/g," ").replace(filetageRegEx,"$5-$7".replace(/,/g,".")); var laVis=visPas.split("-")[0].split(/[ ]/); if (laVis.length==1) { var vis=(Number(laVis[0].split("/")[0])/Number(laVis[0].split("/")[1]))*25.4; } else { if (laVis[1]) var vis=(Number(laVis[0])+(Number(laVis[1].split("/")[0])/Number(laVis[1].split("/")[1])))*25.4; else var vis=Number(laVis[0])*25.4; } var pas=visPas.split("-")[1]; } else { var filetageRegEx=/^UN(C|F)[ ]*(\d?["]?[ ]*(\d[/]\d+)?)[ ]*-[ ]*(\d{1,2})[ ]*-[ ]*\w*[ ]*(\d{1,2}[.,]\d{1,3})$/; if (filetageRegEx.test(lesValeurs)) { var visPas=lesValeurs.replace("\""," ").replace(/[ ]+/g," ").replace(filetageRegEx,"$2-$4-$5".replace(/,/g,".")); var laVis=visPas.split("-")[0].split(/[ ]/); if (Number(visPas.split("-")[1])>=28 && /[^"]/.test(lesValeurs) && Number(visPas.split("-")[0])<=12) {
    var UN=[1.524,1.854,2.184,2.515,2.845,3.175,3.505,"-",4.166,"-",4.826,"-",5.486];
    var vis=UN[Number(visPas.split("-")[0])];
    } else if (laVis.length==1) {
    var vis=(Number(laVis[0].split("/")[0])/Number(laVis[0].split("/")[1]))*25.4;
    } else {
    var vis=(Number(laVis[0])+(Number(laVis[1].split("/")[0])/Number(laVis[1].split("/")[1])))*25.4;
    }
    var pas=visPas.split("-")[2];
    } else app.alert("Filetage incorrect",3);
    }
    }
    try {
    console.println("vis : "+vis);
    console.println("pas : "+pas);
    this.getField("Text5").value=vis;
    this.getField("Text6").value=pas;
    } catch(e) {
    app.alert("Filetage incorrect",3);
    }
    }</p>
    @+
    😎

    • Cette réponse a été modifiée le il y a 3 mois et 3 semaines par bebarth.
    Attachments:
    You must be logged in to view attached files.
    en réponse à : Calcul filetages #75751
    bebarth
    Maître des clés

    Je te propose ce script valable (sauf erreur) pour toutes tes formes d’écritures.
    Si tu as un fichier terminé avec tous les différents filetages, Je te conseille de mettre ce script en fonction et de l’appeler par tous les menus déroulants.
    if (!event.willCommit) {
    for (var i=0; i<event.target.numItems; i++) { if (event.changeEx==event.target.getItemAt(i,true)) break; } var lesValeurs=event.target.getItemAt(i,false); // var filetageRegEx=/^M[ ]*(\d{1,2})[ ]*-[ ]*\w*[ ]*(\d{1,2}[.,]\d{1,3})$/; if (filetageRegEx.test(lesValeurs)) { var visPas=lesValeurs.replace(filetageRegEx,"$1-$2".replace(/,/g,".")); var vis=visPas.split("-")[0]; var pas=visPas.split("-")[1]; } else { var filetageRegEx=/^(W|(BSF)|G|(PG)|(NPT))[ ]*(\d?["]?[ ]*(\d[/]\d+)?)[ ]*-[ ]*\w*[ ]*(\d{1,2}[.,]\d{1,3})$/; if (filetageRegEx.test(lesValeurs)) { var visPas=lesValeurs.replace(filetageRegEx,"$5-$7".replace(/,/g,".")); var laVis=visPas.split("-")[0].split(/[ "]/); if (laVis.length==1) { var vis=(Number(laVis[0].split("/")[0])/Number(laVis[0].split("/")[1]))*25.4; } else { var vis=(Number(laVis[0])+(Number(laVis[1].split("/")[0])/Number(laVis[1].split("/")[1])))*25.4; } var pas=visPas.split("-")[1]; } else { var filetageRegEx=/^UN(C|F)[ ]*(\d?["]?[ ]*(\d[/]\d+)?)[ ]*-[ ]*(\d{1,2})[ ]*-[ ]*\w*[ ]*(\d{1,2}[.,]\d{1,3})$/; if (filetageRegEx.test(lesValeurs)) { var visPas=lesValeurs.replace(filetageRegEx,"$2-$4-$5".replace(/,/g,".")); var laVis=visPas.split("-")[0].split(/[ "]/); if (Number(visPas.split("-")[1])>=28 && /[^"]/.test(lesValeurs) && Number(visPas.split("-")[0])<=12) {
    var UN=[1.524,1.854,2.184,2.515,2.845,3.175,3.505,"-",4.166,"-",4.826,"-",5.486];
    var vis=UN[Number(visPas.split("-")[0])];
    } else if (laVis.length==1) {
    var vis=(Number(laVis[0].split("/")[0])/Number(laVis[0].split("/")[1]))*25.4;
    } else {
    var vis=(Number(laVis[0])+(Number(laVis[1].split("/")[0])/Number(laVis[1].split("/")[1])))*25.4;
    }
    var pas=visPas.split("-")[2];
    } else app.alert("Filetage incorrect",3);
    }
    }
    try {
    console.println("vis : "+vis);
    console.println("pas : "+pas);
    this.getField("Text5").value=vis;
    this.getField("Text6").value=pas;
    } catch(e) {
    app.alert("Filetage incorrect",3);
    }
    }

    @+
    😎

    • Cette réponse a été modifiée le il y a 3 mois et 3 semaines par bebarth.
    en réponse à : Calcul filetages #75735
    bebarth
    Maître des clés

    bonjour,
    Pour passer de pouces à millimètres il faut multiplier par 25,4.
    Exemple 5/8″ =  5*25.4/8 = 15.875 mm

    @+
    😎

    PS : Je n’avais pas vu sur ton fichier : 1″1/4 = 1.25″ = 1.25*25.4 = 31.75 mm

    • Cette réponse a été modifiée le il y a 3 mois et 3 semaines par bebarth.
    en réponse à : Calcul filetages #75730
    bebarth
    Maître des clés

    bonjour,
    Ça a l’air de fonctionner !

    @+
    😎

    en réponse à : Action pour ouvrir une page web par script #75724
    bebarth
    Maître des clés

    bonjour,
    Voici un script pour ajouter un lien aux boutons :
    var i=event.target.name.substr(6);
    var j=this.getField("NoLien."+i).value;
    var leLien=this.getField("LaC."+i).value;
    if (j!="-" && /^(https?:\/\/)?([\w-]+(\.[\w-]+)+)(:\d+)?(\/[^\s]*)?$/i.test(leLien)) {
    this.getField("Links."+i+"."+j).setAction("MouseUp","app.launchURL(\""+leLien+"\");");
    this.getField("LaC."+i).value="";

    }
    else if (j=="-") app.alert("Veuillez choisir un numéro d'indice",3);
    else app.alert("L'url indiquée n'est pas correcte",3);
    On trouve différentes expressions régulières sur internet qui correspondent à une url, celle-ci en est une !

    Pour la proposition de Merlin, on peut comme dans un post précédent lancer directement le lien depuis le menu déroulant en utilisant un script de touches personnalisé :
    if (!event.willCommit) {
    try {
    app.launchURL(event.changeEx);
    } catch(e) {}
    }
    On met le « try » au cas où la valeur d’exportation ne soit pas une url…

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    en réponse à : Calcul filetages #75714
    bebarth
    Maître des clés

    …reste a trouver les autres !

    On doit bien trouver les formules sur internet !

    @+
    😎

    https://www.h7g6.fr/data/article/37/memento-des-types-filetages (Par exemple – A vérifier).

    • Cette réponse a été modifiée le il y a 3 mois et 3 semaines par bebarth.
    • Cette réponse a été modifiée le il y a 3 mois et 3 semaines par bebarth.
    en réponse à : Calcul filetages #75710
    bebarth
    Maître des clés

    Oui mais je n’ai trouvé que les formules pour le pas métrique pour l’instant (je cherche les autres, a moins que cela fonction sur d’autre filetage ?

    Dire que j’avais tout ça et que je m’en suis séparé il n’y a pas très longtemps…

    @+
    😎

    en réponse à : Calcul filetages #75709
    bebarth
    Maître des clés

    ça affichait la valeur précédemment sélectionnée dans le tableau

    Le premier fichier que j’ai partagé n’était pas le bon… mais le script est correct.
    J’ai maintenant remplacé le fichier. Ça évite d’avoir un bouton !

    @+
    😎

    en réponse à : Calcul filetages #75701
    bebarth
    Maître des clés

    bonjour,
    Je te propose un script de touches personnalisé :
    if (!event.willCommit) {
    for (var i=0; i<event.target.numItems; i++) {
    if (event.changeEx==event.target.getItemAt(i,true)) break;
    }
    var lesValeurs=event.target.getItemAt(i,false).split(" - Pas ");
    this.getField("Text5").value=lesValeurs[0];
    this.getField("Text6").value=lesValeurs[1];
    }

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    en réponse à : Ajout d’un code #75694
    bebarth
    Maître des clés

    …et si tu veux écrire sur tous tes champs « Vol. » en script de calcul, tu exécutes :
    for (var i=0; i<126; i++) {
    this.getField("Vol."+i).setAction("Calculate", "var INDICE=event.target.name.substr(4);\revent.value=this.getField(\"JSerie.\"+INDICE).value*this.getField(\"JReps.\"+INDICE).value*this.getField(\"JCharge.\"+INDICE).value;");
    }

    @+
    😎

    en réponse à : Ajout d’un code #75693
    bebarth
    Maître des clés

    bonjour,
    Dans un premier temps il faut récupérer l’indice :
    var INDICE=event.target.name.substr(4);
    puis il faut écrire :
    this.getField("Vol."+INDICE).value=this.getField("JSerie."+INDICE).value*this.getField("JReps."+INDICE).value*this.getField("JCharge."+INDICE).value;

    @+
    😎

    en réponse à : Sauvegarde prefixe date #75670
    bebarth
    Maître des clés

    bonjour,

    Il est important de noter que l’exécution d’un tel script n’est pas permise sur un bouton.

    Ce n’est pas tout à fait vrai. C’est possible en plaçant une partie en script d’application pour élargir les privilèges. Mais c’est donc compliqué car il faut placer ce script en local dans le répertoire JavaScript d’Acrobat (ou Reader) de chaque ordinateur. Si ça t’intéresse tu me dis et je te fais un exemple.

    Pour les tablettes, tu oublies…

    @+
    😎

    • Cette réponse a été modifiée le il y a 4 mois par bebarth.
    en réponse à : Générer des nombres se trouvant dans une table commune #75651
    bebarth
    Maître des clés

    Avec event.change (en script de touches personnalisé) on peut détecter la plupart des touches appuyées sauf pour les tabulations, les flèches, …

    @+
    😎

    en réponse à : Générer des nombres se trouvant dans une table commune #75650
    bebarth
    Maître des clés

    bonjour,
    Les valeurs retournées sont de 0 à 2 :
    0 — La valeur n’a pas été validée (par exemple, la touche Échap a été enfoncée).
    1 — La valeur a été validée en raison d’un clic en dehors du champ à l’aide de la souris.
    2 — La valeur a été validée en raison d’un appui sur la touche Entrée.
    3 — La valeur a été validée en appuyant sur la touche Tab pour accéder à un nouveau champ.

    @+
    😎

    en réponse à : Générer des nombres se trouvant dans une table commune #75641
    bebarth
    Maître des clés

    La discussion a été très rapide !

    @+
    😎

    en réponse à : Script pour changer de Helvetica à Courier ? #75640
    bebarth
    Maître des clés

    Ah oui, c’est vrai… mais mois je suis toujours retourné directement à l’interface « classique ».

    @+
    😎

    en réponse à : Script pour changer de Helvetica à Courier ? #75638
    bebarth
    Maître des clés

    Ça donne envie !
    Et c’est prévu pour quand ?

    @+
    😎

    en réponse à : Script pour changer de Helvetica à Courier ? #75636
    bebarth
    Maître des clés

    ils ne sont pas compatibles avec la “nouvelle expérience” de l’interface d’Acrobat.

    C’est quoi cette nouvelle expérience ?

    @+
    😎

    en réponse à : Script pour changer de Helvetica à Courier ? #75627
    bebarth
    Maître des clés

    bonjour,
    Si tu utilises mon utilitaire « Propriétés d’un champs » dans les abracadabraTools de Merlin, tu peux voir toutes les propriétés d’un champ spécifique, y compris le nom de la police de caractères utilisée.
    Si tu n’as pas les abracadabraTools, je te conseille de les télécharger. Ils sont très utiles.
    Il faudrait d’ailleurs que je pense à le mettre à jour…

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    en réponse à : Générer des nombres se trouvant dans une table commune #75626
    bebarth
    Maître des clés

    Je fais évoquer le sujet sur le forum Adobe (plus tard) on verra si on a une réponse…

    Si vous voulez suivre la discussion :
    https://community.adobe.com/t5/acrobat-discussions/event-commitkey-values/m-p/15197726#M499460

    @+
    😎

    en réponse à : Script pour corriger une date #75623
    bebarth
    Maître des clés

    bonjour,
    J’ai légèrement modifié l’expression régulière car on pouvait écrire « 00 » pour les jours et mois lors d’une modification de date.
    La nouvelle expression régulière contrôlant la frappe est :
    var modeleRegEx=/^((0[1-9]?|[1-2][0-9]?|3[0-1]?)([\.]((0[1-9]?|1[0-2]?)([\.]([2]([0]\d{0,2})?)?)?)?)?)?$/;
    Maintenant, ce n’est plus possible… De plus, le 20 de l’année est automatiquement indiqué après le second point.

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    en réponse à : Script pour changer de Helvetica à Courier ? #75621
    bebarth
    Maître des clés

    bonjour,
    Bêtement, j’utilise toujours les noms des polices standard données par l’api reference (font.Helv, font.Cour,…).
    https://opensource.adobe.com/dc-acrobat-sdk-docs/library/jsapiref/JS_API_AcroJS.html#id615
    Existe-t-il une différence ???

    @+
    😎

    en réponse à : Générer des nombres se trouvant dans une table commune #75608
    bebarth
    Maître des clés

    Je fais évoquer le sujet sur le forum Adobe (plus tard) on verra si on a une réponse…

    @+
    😎

    en réponse à : Générer des nombres se trouvant dans une table commune #75606
    bebarth
    Maître des clés

    Valeur 13 : Ce nombre correspond au code ASCII/Unicode de la touche Entrée (Enter).

    C’est bien ce que j’avais cru comprendre, mais pourquoi un simple signe « = » ? Si on en met 2 « == » ça ne fonctionne plus !
    Et ça n’a l’air de fonctionner qu’avec event.commitKey = 13;.

    @+
    😎

    en réponse à : Générer des nombres se trouvant dans une table commune #75603
    bebarth
    Maître des clés

    bonjour,
    Du coup, si PDF-XChange Editor comprend “event.commitKey”, je ne comprends pas pourquoi ça ne fonctionne pas avec ton fichier, et surtout pourquoi ça fonctionne avec l’autre ! Il ne l’interprète peut-être pas correctement. Il faut dire que “commitKey” est assez mal documenté.

    @+
    😎

    en réponse à : Générer des nombres se trouvant dans une table commune #75592
    bebarth
    Maître des clés

    … j’ai trouvé, mais j’ai fait quelques tests et apparemment PDF-XChange Editor ne connait pas « event.commitKey » !!!

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    en réponse à : Générer des nombres se trouvant dans une table commune #75588
    bebarth
    Maître des clés

    Voici le script de touches personnalisé commenté :
    // Si aucun évènement ne sera exécuté, c’est à dire en cours de frappe
    if(!event.willCommit) {
    // La valeur du champ en table ou chaque élément est un caractère
    var aTester=event.value.split(«  »);
    // Dans cette table, avec « splice », on place le caractère frappé
    // entre la position de départ du curseur : event.selStart
    // et le nombre de caractères sélectionnés : event.selEnd-event.selStart
    // Si aucun caractère n’est sélectionné event.selEnd-event.selStart==0, on ajoute donc un caractère
    aTester.splice(event.selStart, event.selEnd-event.selStart, event.change);
    // testeChaine est la chaine de caractère à tester de la valeur du champ avec modification du caractère frappé
    var testeChaine=aTester.join(«  »);
    // Expression régulière pour valider la frappe en cours
    // Chaque nouveau caractère doit être validé sans tenir compte des caractères à venir
    // D’où l’ajout de « ? » qui signifie 0 ou 1
    // cf. explication de l’expression régulière ci-dessous
    var fractionRegEx=/^([1-9]\d*(\/([1-9]\d*)?)?)?$/;
    // La frappe est validée si le teste de la chaine avec l’expression régulière est vrai
    event.rc=fractionRegEx.test(testeChaine);
    // Sinon « if(event.willCommit) » : Si un évènement sera exécuté
    // Si on colle une valeur ou si on quitte le champ de quelque façon que ce soit
    } else {
    // Expression régulière pour valider l’entrée globale
    var fractionRegEx=/^[1-9]\d*(\/[1-9]\d*)?$/;
    // /^…$/ Teste la chaine de catactères du début jusqu’à la fin
    // [1-9] Le premier caractère doit être un chiffre de 1 à 9
    // \d* 0 ou plusieurs caractères numériques
    // (\/…)? Une barre de fraction et la suite, le tout facultatif
    // [1-9] Si il y a une barre de fraction, le premier caractère doit être un chiffre de 1 à 9
    // \d* suivi de 0 ou plusieurs caractères numériques
    // L’entrée est validée si le teste de la chaine avec l’expression régulière est vrai ou si le champ est vide
    event.rc=event.value== » » || fractionRegEx.test(event.value);
    }
    J’espère que c’est un peu plus clair pour toi !
    Ça ne fonctionne effectivement pas avec PDF-XChange Editor, mais je ne sais pas où trouver les scripts du champ…

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    en réponse à : Générer des nombres se trouvant dans une table commune #75582
    bebarth
    Maître des clés

    bonjour,
    Je commente plus tard !
    Qu’est-ce qui ne fonctionne pas avec pdf XChange editor ? La validation avec la touche Enter ou l’expression régulière ?

    @+
    😎

    en réponse à : Exportation des données #75577
    bebarth
    Maître des clés

    bonjour,
    Non, je ne crois pas qu’il soit possible d’exporter directement en .xlsx, mais par contre on peut exporter au format .csv ! On doit pouvoir ensuite convertir le format avec une macro VBA.

    @+
    😎

    PS : Perso je ne sais pas écrire de macro VBA mais c’est la spécialité de mon frère… si ça t’intéresse je peux lui demander !

    • Cette réponse a été modifiée le il y a 4 mois et 1 semaine par bebarth.
    en réponse à : Générer des nombres se trouvant dans une table commune #75574
    bebarth
    Maître des clés

    bonjour,

    J’ai donc tenté de mettre en script sur le champ Result le code suivant : if (event.commitKey = 13) Verif();

    Pourquoi 13 ??? Si tu penses au caractère ASCII du retour ligne, ce n’est pas comme cela que fonctionne « event.commitKey ».
    https://opensource.adobe.com/dc-acrobat-sdk-docs/library/jsapiref/JS_API_AcroJS.html#commitkey
    Du coup, en script de format personnalisé tu écris :
    if (event.commitKey==2) Verif();
    Il faut également changer 2 lignes de la fonction Verif() car this.getField("Result").value = ""; provoque une erreur. Il faut donc remplacer (2 fois) cette ligne par this.resetForm(["Result"]);.

    Dans mon exemple, j’ai également ajouté un script de touches personnalisé pour ne pouvoir taper que les caractères utilisés pour écrire une fraction (ou juste un nombre).
    if (!event.willCommit) {
    var aTester=event.value.split("");
    aTester.splice(event.selStart, event.selEnd-event.selStart, event.change);
    var testeChaine=aTester.join("");
    var fractionRegEx=/^([1-9]\d*(\/([1-9]\d*)?)?)?$/;
    event.rc=fractionRegEx.test(testeChaine);
    } else {
    var fractionRegEx=/^[1-9]\d*(\/[1-9]\d*)?$/;
    event.rc=event.value=="" || fractionRegEx.test(event.value);
    }
    Demande si tu souhaites que je commente !

    Voici un lien pour télécharger ton fichier modifié : https://we.tl/t-RlWyRLbGyD

    @+
    😎

    • Cette réponse a été modifiée le il y a 4 mois et 1 semaine par bebarth.
    Attachments:
    You must be logged in to view attached files.
    en réponse à : Générer des nombres se trouvant dans une table commune #75557
    bebarth
    Maître des clés

    bonjour,

    il y a par contre parfois le numérateur = au dénominateur

    Du coup, il faut écrire :
    ...
    while (a==b || PGCD(a,b)==1) hasard();
    ...

    Mon script va au plus simple en reprenant les valeurs des champs « Var.1.3 » et « Var.2.3 ». Je pense qu’on pourrait faire la même chose avant d’attribuer une valeur à ces champs, mais il faudrait revoir le script en entier ! Ça fonctionne comme ça…

    @+
    😎

    en réponse à : Générer des nombres se trouvant dans une table commune #75550
    bebarth
    Maître des clés

    Voici pour ton script de document « hasard ». La première fonction « function aleatoire (indice) » ne change pas, puis :

    function aleatoire (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);

    }
    function PGCD(a,b) {
    if (b) return PGCD(b,a%b);
    else return Math.abs(a);
    }
    function hasard () {
    for (i=1; i<=2; i++) {
    try {
    aleatoire (i);
    } catch(e) {
    this.getField("Var."+i+".3").value="";
    }
    }
    a=Math.abs(this.getField("Var.1.3").value);
    b=Math.abs(this.getField("Var.2.3").value);
    while (PGCD(a,b)==1) hasard();
    }

    @+
    😎

    PS : Bon, le fichier ne passe pas, je te laisse donc faire la modification.

    • Cette réponse a été modifiée le il y a 4 mois et 1 semaine par bebarth.
    en réponse à : Générer des nombres se trouvant dans une table commune #75545
    bebarth
    Maître des clés

    Voici une autre version avec moins de problèmes…

    Elle est où cette version ???

    @+
    😎

    en réponse à : Générer des nombres se trouvant dans une table commune #75544
    bebarth
    Maître des clés

    Le PGCD et le PPCM, mes cauchemars de collégien !

    Je crois même qu’on apprend ça en fin de primaire…

    @+
    😎

    en réponse à : Changement de couleur dans champ #75538
    bebarth
    Maître des clés

    bonjour,
    Il faut écrire :
    if (event.value>10) event.target.textColor=color.red;
    else event.target.textColor=color.black;

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    en réponse à : Générer des nombres se trouvant dans une table commune #75536
    bebarth
    Maître des clés

    bonjour,
    En fait je n’arrive pas bien à comprendre comment ça fonctionne (Comment on génère les nombres aléatoires). Quand on clique sur « CLIQUE ICI » on a toujours un message… de plus il me semble qu’il y a une inversion quelque part entre le numérateur et le dénominateur (cf. copie d’écran).

    Sinon dans le principe il faudrait calculer le PGCD et faire une boucle (while) tant qu’il est égal à 1.
    Si tu m’éclaire un peu, je te fais ça (je l’ai déjà fait).

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    en réponse à : Raccourcir un script #75528
    bebarth
    Maître des clés

    bonjour,

    Par contre ce qui est interdit partout, y compris sur les plaques d’immatriculation c’est “SS”.

    Je ne vais pas commenter la liste des noms partis à bannir, mais j’ai une info très intéressante à vous partager.
    Ma première voiture, une 4L, était immatriculée « 2200 SS 77 » et c’est la seule immatriculation que je me souvienne…
    Même l’immatriculation de ma voiture actuelle est notée sur mon téléphone. Intéressant, non ???

    @+
    😎

    en réponse à : Script pour corriger une date #75526
    bebarth
    Maître des clés

    bonjour,
    C’est possible si tu n’utilise pas un champ date mais un champ texte en forçant l’utilisation des caractère.
    Il y a 2 possibilités : Soit tu obliges l’utilisateur à taper tous les chiffres et dans ce cas tu peux insérer automatiquement les points de séparation ou l’utilisateur peut ne taper qu’un seul chiffres pour les jours et mois et 2 chiffres pour l’année et un script de format personnalisé se charge de remettre ça en forme.
    Voici les scripts utilisés dans mon document exemple qui vérifie les mois de 30 et 31 jours ainsi que le 29 février des année bissextiles :

    // script de document
    function verifDate(laDate) {
    var jour=Number(laDate.substr(0,2));
    var mois=Number(laDate.substr(3,2));
    var annee=Number(laDate.substr(6));
    var bissextile=annee%4==0 && (annee%100!=0 || annee%400==0)?"OUI":"NON";
    if (mois==2) {
    var leMois="FEVRIER";
    } else if (mois==4 || mois==6 || mois==9 || mois==11) {
    var leMois="30 JOURS";
    } else {
    var leMois="31 JOURS";
    }
    if (laDate.length==6) return (leMois=="30 JOURS" && jour<=30) || leMois=="31 JOURS" || (leMois=="FEVRIER" && jour<=29);
    else return (leMois=="30 JOURS" && jour<=30) || leMois=="31 JOURS" || (leMois=="FEVRIER" && jour<=28) || (bissextile=="OUI" && jour<=29);
    }

    // Script de touches personnalisé pour date entrée 01.02.2025
    if(!event.willCommit) {
    if (event.change==",") event.change=".";
    if ((/^0$/.test(event.value) || /^\d{2}\.0$/.test(event.value)) && event.change==0) var dateOK=false;
    else {
    var aTester=event.value.split("");
    if (event.value.length==1 && event.change!="") event.change=event.change+"\.";
    if (event.value.length==4 && event.change!="") event.change=event.change+"\.";
    aTester.splice(event.selStart, event.selEnd-event.selStart, event.change);
    var testeChaine=aTester.join("");
    if (testeChaine.length==6 || testeChaine.length==10) var dateOK=verifDate(testeChaine);
    else var dateOK=true;
    }
    var modeleRegEx=/^(([0-2][0-9]?|(3)[0-1]?)([\.](((0)[0-9]?|(1)[0-2]?)([\.]([2]([0]\d{0,2})?)?)?)?)?)?$/;
    event.rc=modeleRegEx.test(testeChaine) && dateOK;
    } else {
    var modeleRegEx=/^(\d{2}\.\d{2}\.\d{4})?$/;
    event.rc=event.value=="" || modeleRegEx.test(event.value);
    }

    // Script de touches personnalisé pour date entrée 1.2.25
    if(!event.willCommit) {
    if (event.change==",") event.change=".";
    if ((/^0$/.test(event.value) || /^\d{1,2}\.0$/.test(event.value) || /^\d{1,2}\.\d{1,2}\.0?$/.test(event.value)) && event.change==0) var dateOK=false;
    else {
    var aTester=event.value.split("");
    aTester.splice(event.selStart, event.selEnd-event.selStart, event.change);
    var testeChaine=aTester.join("");
    var aRetester=testeChaine.split(".");
    for (var i=0; i<aRetester.length; i++) {
    if (i==0 || i==1) {
    if (aRetester.length==1) aRetester="0"+aRetester+".";
    else aRetester=aRetester.toString()+".";
    } else if (i==3 && aRetester.length==2) aRetester="20"+aRetester;
    }
    var testeChaine=aRetester.join("");
    if (testeChaine.length==6 || testeChaine.length==10) var dateOK=verifDate(testeChaine);
    else var dateOK=true;
    }
    var modeleRegEx=/^(([0-2]?[0-9]?|(3)[0-1]?)([\.](((0)?[0-9]?|(1)[0-2]?)([\.](([2][0]?)?\d{0,2})?)?)?)?)?$/;
    event.rc=modeleRegEx.test(testeChaine) && dateOK;
    } else {
    var modeleRegEx=/^(\d{1,2}\.\d{1,2}\.\d{2,4})?$/;
    event.rc=event.value=="" || modeleRegEx.test(event.value);
    }

    // Script de format personnalisé
    var cetteDate=event.target.value.split(".");
    if (cetteDate[0].length==1) cetteDate[0]="0"+cetteDate[0];
    if (cetteDate[1].length==1) cetteDate[1]="0"+cetteDate[1];
    if (cetteDate[2].length==2) cetteDate[2]="20"+cetteDate[2];
    event.value=cetteDate[0]+"."+cetteDate[1]+"."+cetteDate[2];

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    en réponse à : Raccourcir un script #75499
    bebarth
    Maître des clés

    Concrètement ça veut dire que :

    • si la variable pointA == “P” alors les variables pointB et pointC doivent être différentes de S et de C
    • si pointB == “P” alors pointC doit être différente de S et de C
    • si (pointA == “F”|| pointA == “R”) alors les variables pointB et pointC doivent être différentes de N
    • si (pointB == “F”|| pointB == “R”) alors la variables pointC doit être différente de N

    …ça va encore !

    On peut modifier la seconde expression régulière en /P.?(S|C|D|Q|T)|(F|R).?N|F.?O|L.?R|W.?C|GPT/, ce qui donne :

    var pointsABC="";
    while (pointsABC.length<3) {
    pointsABC+=String.fromCharCode(65+Math.floor(Math.random()*26));
    if (/^(?=.*(.).*\1)[A-Z]{1,3}$/.test(pointsABC) || /P.?(S|C|D|Q|T)|(F|R).?N|F.?O|L.?R|W.?C|GPT/.test(pointsABC)) var pointsABC=pointsABC.slice(0,-1);
    }

    @+
    😎

    • Cette réponse a été modifiée le il y a 4 mois et 2 semaines par bebarth.
    en réponse à : Ajout de lignes de code avec JavaScript #75496
    bebarth
    Maître des clés

    bonjour,
    Attention aux scripts « Souris relâchée » pour les menus déroulants qui s’exécutent avant de relâcher réellement.
    Je pense qu’il vaut mieux utiliser un script de touches personnalisé tel que :
    if (!event.willCommit) fillDropdown();

    Donc pour placer cette ligne en Script de touches personnalisé de tous les menus déroulants il faut exécuter :
    for (var i=0; i<this.numFields; i++) {
    var f=this.getField(this.getNthFieldName(i));
    if (f.type=="combobox") f.setAction("Keystroke", "if (!event.willCommit) fillDropdown();");
    }

    Pour ajouter une petite précision, on peut utiliser if (event.willCommit)... si on est certain que la case « Valider la valeur sélectionnée immédiatement » est cochée, mais pour être certain que celà fonctionne j’ai l’habitude d’utiliser if (!event.willCommit)...

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    en réponse à : Raccourcir un script #75488
    bebarth
    Maître des clés

    bonjour,
    J’ai eu le temps de réfléchir à « comment réduire le script » hier pendant que je conduisais sur mon chemin du retour…
    Voici donc le résultat de ma réflexion après l’avoir testé ce matin :
    var pointsABC="";
    while (pointsABC.length<3) {
    pointsABC+=String.fromCharCode(65+Math.floor(Math.random()*26))
    if (/^(?=.*(.).*\1)[A-Z]{1,3}$/.test(pointsABC) || /PS|PC|FN|RN|FO|LR|PD|PQ|WC|GPT|PT/.test(pointsABC)) var pointsABC=pointsABC.slice(0,-1);
    }
    console.println(pointsABC);

    On peut donc récupérer chaque point si nécessaire en « splitant » la chaine pointsABC.

    Une autre réflexion m’en est ensuite venue : les couples/trios de lettres interdits le sont ici pour des points consécutifs et dans l’ordre (AB et BC) mais doivent-ils également l’être dans un autre ordre (BA, CB ou AC et CA) ??? Ça risque de compliquer un peu l’expression régulière…

    @+
    😎

    en réponse à : Raccourcir un script #75470
    bebarth
    Maître des clés

    Je pense que ça devrait être ça !

    @+
    😎

    en réponse à : Raccourcir un script #75467
    bebarth
    Maître des clés

    bonjour,
    le principe est le bon mais il faut aussi vérifier que les 3 lettres sont différentes.
    Je pourrai regarder à mon retour mercredi ou jeudi…

    @+
    😎

    en réponse à : Renommer indice 2 #75460
    bebarth
    Maître des clés

    bonjour,
    Il suffit de faire la même chose avec la variable P3 qu’il était fait avec la variable P2. Donc :

    function Renommer_c() {

    for (var i=0; i<this.numFields; i++) {
    var nomChamp=this.getNthFieldName(i);
    //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]);
    var P3a = this.getField("indice2_ancien").value;
    var P3n = this.getField("indice2_nouveau").value;

    if (P3==P3a) {
    renommerChamp (nomChamp,P1+"."+P2+"."+P3n);
    this.removeField(nomChamp);
    }
    }
    }
    function renommerChamp (leNom,nouveauNom) {
    try {
    g = this.getField(leNom);
    var laValeur=g.value;
    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) {}
    }
    f.strokeColor=["RGB",0,147/255,0];
    f.fillColor=color.white;
    //f.display=display.hidden;
    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);
    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.")}
    }

    Et comme le dit Merlin, si les champs possèdent des scripts il est impossible de les recopier.
    De même, il n’est pas possible de recopier les formats (mais on peut les définir si on les connait).

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    en réponse à : fonction aleatoire #75454
    bebarth
    Maître des clés

    bonjour,
    Il suffit de mettre la boucle en fonction !

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    en réponse à : Ajout de lignes de code avec JavaScript #75445
    bebarth
    Maître des clés

    bonjour,
    C’est ce qu’est censé faire le fichier que j’ai partagé !

    @+
    😎

    en réponse à : Ajout de lignes de code avec JavaScript #75440
    bebarth
    Maître des clés

    bonjour,
    Je ne suis pas certain d’avoir tout compris, mais au cas où voici un fichier que j’avais fait à partir du fichier « Texte2Unicode » de Merlin.
    Ce fichier ajoute un caractère d’échappement pour différents cas. Tu me dis…

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    en réponse à : Vérification et tri #75433
    bebarth
    Maître des clés

    bonjour,
    Il y avait plusieurs méthodes pour pallier ce message. En voici une :
    // Script de document
    var dropdownName="gato";
    var dropdownNumber=0;
    for (var i=0; i<this.numFields; i++) {
    if (this.getField(this.getNthFieldName(i)).name.indexOf(dropdownName+".")==0) dropdownNumber++;
    }
    var listeEleves=this.getField("entreesListe").value;
    var lesEleves=listeEleves.split("\r");
    lesEleves.sort(function(a,b){return a.localeCompare(b)});
    function liste() {
    lesNoms=lesEleves.map(function(element) {return [element.split("/")[0],element]});
    var theIndex=event.target.name.substr(event.target.name.indexOf(".")+1);
    theValue=event.target.value;
    for (var i=0; i<dropdownNumber; i++) {
    if (i!=theIndex) {
    var laPosition=this.getField(dropdownName+"."+i).currentValueIndices;
    for (j=0; j<lesNoms.length; j++) {
    if (lesNoms[j][0]==this.getField(dropdownName+"."+i).getItemAt(laPosition,false) && this.getField(dropdownName+"."+i).value!="-") {
    lesNoms.splice(j,1);
    break;
    }
    }
    }
    }
    }
    function fillDropdown() {
    liste();
    event.target.setItems(lesNoms);
    event.target.value=theValue;
    }
    function selection() {
    var theIndex=event.target.name.substr(event.target.name.indexOf(".")+1);
    if (event.changeEx=="-") this.getField("Group."+theIndex).value="-";
    else this.getField("Group."+theIndex).value=event.changeEx.split("/")[1];
    liste();
    if (event.changeEx=="-") this.getField("nonListes").value=lesNoms.length-1;
    else this.getField("nonListes").value=lesNoms.length-2;
    }
    function comptage() {
    lesNoms=lesEleves.map(function(element) {return [element.split("/")[0],element]});
    for (var i=0; i<dropdownNumber; i++) {
    var laPosition=this.getField(dropdownName+"."+i).currentValueIndices;
    for (j=0; j<lesNoms.length; j++) {
    if (lesNoms[j][0]==this.getField(dropdownName+"."+i).getItemAt(laPosition,false) && this.getField(dropdownName+"."+i).value!="-") {
    lesNoms.splice(j,1);
    break;
    }
    }
    }
    this.getField("nonListes").value=lesNoms.length-1;
    }
    comptage();

    Avec mon script, le bouton « Vérifier n’a plus lieu d’être » vu que les champs « Group » sont rempli automatiquement lors de chaque sélection d’élève.

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    en réponse à : Vérification et tri #75430
    bebarth
    Maître des clés

    Oups ! Ça vient de la mise en fonction… et « event.target.name » lancé depuis le script de document n’a aucun sens… Je regarde demain !

    Par contre, je ne comprends pas ta copie d’écran !!! Ça fonctionne chez moi.

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    en réponse à : Vérification et tri #75426
    bebarth
    Maître des clés

    bonjour,
    Je viens de finaliser le script.
    J’ai un peu galéré sur une erreur que je qualifierais « de débutant » (« <= » au lieu de « <« ), mais avec un instant de lumière pendant la nuit j’ai enfin pu débloquer le script que voici :

    // Script de document
    var dropdownName="gato";
    var dropdownNumber=0;
    for (var i=0; i<this.numFields; i++) {
    if (this.getField(this.getNthFieldName(i)).name.indexOf(dropdownName+".")==0) dropdownNumber++;
    }
    function liste() {
    var listeEleves=this.getField("entreesListe").value;
    var lesEleves=listeEleves.split("\r");
    lesEleves.sort(function(a,b){return a.localeCompare(b)});
    lesNoms=lesEleves.map(function(element) {return [element.split("/")[0],element]});
    var theIndex=event.target.name.substr(event.target.name.indexOf(".")+1);
    theValue=event.target.value;
    for (var i=0; i<dropdownNumber; i++) {
    if (i!=theIndex) {
    var laPosition=this.getField(dropdownName+"."+i).currentValueIndices;
    for (j=0; j<lesNoms.length; j++) {
    if (lesNoms[j][0]==this.getField(dropdownName+"."+i).getItemAt(laPosition,false) && this.getField(dropdownName+"."+i).value!="-") {
    lesNoms.splice(j,1);
    break;
    }
    }
    }
    }
    }
    function fillDropdown() {
    liste();
    event.target.setItems(lesNoms);
    event.target.value=theValue;
    }
    function selection() {
    var theIndex=event.target.name.substr(event.target.name.indexOf(".")+1);
    if (event.changeEx=="-") this.getField("Group."+theIndex).value="-";
    else this.getField("Group."+theIndex).value=event.changeEx.split("/")[1];
    liste();
    if (event.changeEx=="-") this.getField("nonListes").value=lesNoms.length-1;
    else this.getField("nonListes").value=lesNoms.length-2;
    }
    liste();
    this.getField("nonListes").value=lesNoms.length-1;

    // Pour placer les scripts sur tous les menus déroulants
    for (var i=0; i<this.numFields; i++) {
    var nomChamp=this.getNthFieldName(i);
    if (nomChamp.indexOf("gato.")==0) {
    this.getField(nomChamp).setAction("MouseEnter", "fillDropdown();");
    this.getField(nomChamp).setAction("Keystroke", "if (!event.willCommit) {selection();}");
    };
    }

    Tu me dis si tu as des questions…

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    en réponse à : Vérification et tri #75425
    bebarth
    Maître des clés

    bonjour,
    Je ne vais pas vous raconter ma vie, mais pour info j’ai terminé mais je ne pense pas avoir le temps de peaufiner le script aujourd’hui… Certainement demain !

    @+
    😎

    en réponse à : Vérification et tri #75417
    bebarth
    Maître des clés

    bonsoir,
    Je regarde rapidement…
    Je pense faire en sorte que lorsqu’un nom a été sélectionné il n’apparaisse plus dans les autres menus déroulants et afficher le nombre de noms qui n’ont pas encore été sélectionnés.
    Ça te conviendrait ???

    @+
    😎

    en réponse à : Vérification et tri #75411
    bebarth
    Maître des clés

    bonjour,
    Voici ma proposition :
    var listeEleves=this.getField("entreesListe").value;
    var VP1=[];
    var VTR=[];
    var VP2=[];
    var Alternance=[];
    var inconnus=[];
    var elevesX2=[];
    var lesEleves=listeEleves.split("\r");
    lesEleves.sort(function(a,b){return a.localeCompare(b)});
    var elevePrecedent="";
    for (var i=0; i<lesEleves.length; i++) {
    var unEleve=lesEleves.split("/");
    try {
    if (unEleve[0]==elevePrecedent) elevesX2.push(unEleve[0]);
    switch (unEleve[1]) {
    case "VP1":
    VP1.push(unEleve[0]);
    break;
    case "VTR":
    VTR.push(unEleve[0]);
    break;
    case "VP2":
    VP2.push(unEleve[0]);
    break;
    case "Alternance":
    Alternance.push(unEleve[0]);
    break;
    default:
    if (unEleve[0]!="-") inconnus.push(unEleve[0]);
    }
    var elevePrecedent=unEleve[0]
    } catch(e) {}
    }
    this.getField("groupe.1.1").value=VP1.toString().replace(/,/g,"\r");
    this.getField("groupe.1.2").value=VP1.length;
    this.getField("groupe.2.1").value=VTR.toString().replace(/,/g,"\r");
    this.getField("groupe.2.2").value=VTR.length;
    this.getField("groupe.3.1").value=VP2.toString().replace(/,/g,"\r");
    this.getField("groupe.3.2").value=VP2.length;
    this.getField("groupe.4.1").value=Alternance.toString().replace(/,/g,"\r");
    this.getField("groupe.4.2").value=Alternance.length;
    if (inconnus.length) app.alert("Les élèves suivants n'ont pas de groupe :\r"+inconnus.toString().replace(/,/g,"\r"),3);
    else app.alert("Tous les élèves ont un groupe.",3);
    if (elevesX2.length) app.alert("Les élèves suivants sont dans plusieurs groupes :\r"+elevesX2.toString().replace(/,/g,"\r"),3);

    Ceci est une version où l’on indique les noms des champs et des variables. On aurait pu en faire une qui les trouve automatiquement, mais ça complique un peu le script… Je me suis dit « commençons par le plus simple, on verra si il y a de la demande ! ».

    @+
    😎

    • 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.
    en réponse à : Effet au survol d’un champ #75386
    bebarth
    Maître des clés

    bonjour,
    Dans ton fichier tu exécutes un script « affiche(); », par exemple, qui est une fonction mais qui ici n’est définie nulle part…
    Lorsque les fonctions sont fréquemment utilisées dans un document, on les place souvent en script de document. Il n’y en a pas dans ton fichier.

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    en réponse à : Effet au survol d’un champ #75380
    bebarth
    Maître des clés

    J’avais pas bien lu… Voilà !

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    en réponse à : Effet au survol d’un champ #75377
    bebarth
    Maître des clés

    bonjour,
    Voici un exemple de ce que tu pourrais faire…

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    en réponse à : Scripts de document #75373
    bebarth
    Maître des clés

    J’espère que ça t’as bien avancé… 😉

    en réponse à : Scripts de document #75364
    bebarth
    Maître des clés

    bonjour et Bonne Année !
    Je ne peux te donner que mon avis. Je ne suis pas assez calé en programmation/informatique pour savoir si cela à un impact sur la vitesse ou la fluidité d’exécution…
    Pour ma part, donc, je préfère diviser les différents scripts nécessaires pour faciliter la lecture et ainsi retrouver plus facilement des éventuelles erreurs. Vu qu’en général on avance petit à petit dans le document on ajoute au fur et à mesure différents scripts de document. Généralement j’en crée un premier où je mets les différentes variables utilisées fréquemment par d’autres scripts ainsi que les scripts d’ouverture, puis les autres scripts de document sont généralement des fonctions.
    Par contre, je ne suis pas pour tout mettre en fonction. Cela rend le script plus compliqué à comprendre. Il ne faut donc les utilisées que lorsqu’elles sont appelées fréquemment. Si on a des centaines de champs et que tous les scripts sont en script de calcul cela va énormément rallonger les temps de calcul…

    @+
    Par contre, ce qui est important pour des formulaires compliqués ou avec beaucoup de champs à calculer, c’est de savoir lancer les scripts par les bons évènements.

    en réponse à : Custom Tool – avec multiples niveaux #75355
    bebarth
    Maître des clés

    Je viens de te répondre par mail.

    @+
    😎

    en réponse à : Renommer indices #75353
    bebarth
    Maître des clés

    Tu as même fait en sorte de ne pas re-créer les champs R.a.b s’ils sont déjà présents…

    Dans mon script les champs R.a.b sont effacés s’ils existent (d’où le try) :
    try {
    this.removeField("R."+P2+"."+P3);
    } catch(e) {};
    avant d’être re-créés :
    renommerChamp ("Q."+P2+"."+P3,"R."+P2+"."+P3);

    @+
    😎

    en réponse à : Renommer indices #75350
    bebarth
    Maître des clés

    bonjour,
    Tu pourrais aussi faire ça dans le même fichier !
    function Renommer_c() {
    //récuperer les noms de tous les champs
    for (var i=0; i<this.numFields; i++) {
    var nomChamp=this.getNthFieldName(i);
    //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 (P1=="Q") {
    try {
    this.removeField("R."+P2+"."+P3);
    } catch(e) {};
    renommerChamp ("Q."+P2+"."+P3,"R."+P2+"."+P3);
    }
    }
    }
    function renommerChamp (leNom,nouveauNom) {
    try {
    g = this.getField(leNom);
    var laValeur=g.value;
    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 lesAutresCoord=[lesCoord[0],lesCoord[1]+30,lesCoord[2],lesCoord[3]+30];
    var f = this.addField(nouveauNom, leType, cettePage, lesAutresCoord);
    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) {}
    }
    f.strokeColor=["RGB",0,147/255,0];
    f.fillColor=color.white;
    //f.display=display.hidden;
    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);
    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.
    en réponse à : Renommer indices #75338
    bebarth
    Maî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.
    en réponse à : Renommer indices #75332
    bebarth
    Maître des clés

    Je vais faire une petite vidéo si c’est trop confus…

    Je veux bien car je ne suis pas certain de comprendre !

    @+
    😎

    en réponse à : Custom Tool – avec multiples niveaux #75327
    bebarth
    Maître des clés

    bonjour,
    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.
    en réponse à : Renommer indices #75326
    bebarth
    Maître des clés

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

    @+
    😎

    en réponse à : Custom Tool – avec multiples niveaux #75312
    bebarth
    Maître des clés

    …je ne pense pas l’avoir déjà fait alors !

    @+
    😎

    en réponse à : Custom Tool – avec multiples niveaux #75308
    bebarth
    Maître des clés

    bonjour,
    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.
Affichage de 99 réponses de 1 à 99 (sur un total de 3,356)