Donnez vie à vos documents numériques !
 

affichage ligne suivante.

abracadabraPDF Forums PDF – Général affichage ligne suivante.

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

    Bonjour, j’ai un formulaire qui fonctionne à peu près comme je veux mais il y a 2/3 questions qui me taraudent.

    Je voudrais que lorsqu’un utilisateur saisis une donnée dans un champ sur une ligne, celle d’en dessous s’affiche.

    1er problème : je voudrais que l’action d’afficher ait lieu lors de la saisie ; là il faut cliquer en dehors de la case pour que l’action ait lieu.

    2ème question : Mon script de document comporte 20 lignes pour la déclaration des  variables. Est il possible de simplifier ça pour nommer toutes ces variables par “incrémentation” comme avec une boucle for ?

    3ème question : J’ai des champs dupliqués sur 5 lignes et 4 colonnes, je les ai renommés pour qu’ils soient nommés ac.0 à ac.19 et non pas ac.0.0 à ac.4.3 (cela pour me faciliter la tâche pour mes boucles) mais est ce qu’il aurait été possible d’avoir des boucles for “imbriquées” dans lesquelles 2 variables interviennent ? Une variable pour l’incrémentation des lignes et l’autre pour celle des colonnes ?

    Merci

     

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

    Bonjour

     

    1 Il faudrait placer le script en script de validation, pas en script de calcul.

    De plus tous les scripts et actions de calcul de tous les champs d’un document se déclenchent tous à chaque fois qu’un champ du document, y compris les boutons, passe par l’état “champ désactivé”. Ce qui peut vite devenir pénalisant en terme de performances et d’expérience utilisateur.

    Les scripts de calculs sont à éviter autant que possible.

     

    2 Pour moi une variable qui n’est utilisée qu’une seule fois et qui ne change pas de valeur ne sert à rien d’autre qu’à encombrer la mémoire, en tel cas je mettrais les noms de champs directement dans les conditions if.

     

    3 C’est possible mais je préfère toujours faire comme toi car je trouve que c’est trop prise de tête.

    Par-contre dans ce cas précis la double numérotation des suffixes serait avec toi puisqu’elle rendrait les boucles inutiles. Si les champs étaient nommés comme les champs “ab” de la capture ci-jointe, pour afficher la deuxième rangée tu pourrais utiliser :

    this.getField("ab.1").display = display.visible;

    Qui affiche tous les champs enfants du champ virtuel “ab.1”, peut importe leur nombre.

     

    • Cette réponse a été modifiée le il y a 2 années et 3 mois par Merlin.
    Attachments:
    You must be logged in to view attached files.
    #70460
    Merlin
    Maître des clés

    L’ordre d’exécution des événements dans les champs de formulaire PDF

     

    https://www.abracadabrapdf.net/ressources-et-tutos/js-et-formulaires-ressources/lordre-dexecution-des-evenements-dans-les-champs-de-formulaire-pdf/

    #70461
    bebarth
    Maître des clés

    bonjour,
    Ci-joint ma proposition.

    2ème question : Mon script de document comporte 20 lignes pour la déclaration des variables. Est il possible de simplifier ça pour nommer toutes ces variables par « incrémentation » comme avec une boucle for ?

    Pour faire cela, il faut exécuter la fonction eval();

    for (var i=0; i<=19; i++) {
    eval("var ac"+i+" = this.getField(\"ac."+i+"\").value");
    }

    @+
    😎

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

    Merci pour la proposition.

    Lors de la saisie de la dernière ligne il y a un message d’erreur sur la ligne 11 du script (this.getField….is null)

    Sinon, ça fonctionne nickel, tu as résolu le problème que j’avais avec le “0” qui lorsqu’il était saisi ne faisait pas apparaître la ligne suivante.

    Il y a par contre pas mal de choses que je ne connais pas dans ce script, il va me falloir pas mal de temps pour le décrypter, mais en tout cas merci, ça me fait progresser.

    #70464
    bebarth
    Maître des clés

    Il faut ajouter un try catch car on vas modifier la ligne n+1 et bien sûr il n’y en a pas pour la dernière ligne…

    @+
    😎

    #70467
    michel c.
    Participant

    Bonjour et merci pour les réponses.


    @BB
    , pour l’instant, je n’arriverai pas à faire ces modifs, il y a trop de choses que je ne maîtrise pas dans ce script et il me faut pas mal de temps pour le décrypter.

    J’ai essayé de modifier celui que j’avais fait avec les propositions de Merlin mais en faisant cela fonctionne mal. toutes les lignes s’affichent dès la saisie d’un champ sur la 1ère. J’ai une solution en tête mais ça va être très chargé, surtout sans faire utiliser de variables.

    J’ai un souci avec le script de raz ; je dois cliquer 1 fois sur le bouton pour effacer les valeurs et une 2ème fois pour effacer. Et je n’ai pas pu formater les champs en nombre car cela crée une erreur (je pense qu’un champ nombre ne peut pas contenir la valeur vide “”.

     

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

    @BB (suite) : J’ai regardé le try catch et si je comprends bien, cela crée une exception lors de l’exécution d’une fonction pour qu’une erreur n’affecte pas sa bonne exécution. Je vais essayer de potasser un peu ça.

    #70470
    Merlin
    Maître des clés

    Avec le script de bebarth ça fonctionne bien.

    Dans le ci-joint j’ai mis la fonction en action “onBlur”, j’ai supprimé les calculs et j’ai optimisé le script de reset.

     

    function affLigne() {
    for (var i=0; i<=19; i++) {
    eval("var ac"+i+" = this.getField(\"ac."+i+"\").value");
    }

    if (ac0 != "" | ac1 != "" | ac2 != "" | ac3 != "" ) {
    for (var k = 4 ; k<8 ; k++) {
    this.getField("ac."+k).display = display.visible;}}

    if (ac4 != "" | ac5 != "" | ac6 != "" | ac7 != "" ) {
    for (var l = 8 ; l<12 ; l++) {
    this.getField("ac."+l).display = display.visible;}}

    if (ac8 != "" | ac9 != "" | ac10 != "" | ac11 != "" ) {
    for (var m = 12 ; m<16 ; m++) {
    this.getField("ac."+m).display = display.visible;}}

    if (ac12 != "" | ac13 != "" | ac14 != "" | ac15 != "" ) {
    for (var n = 16 ; n<20 ; n++) {
    this.getField("ac."+n).display = display.visible;}}

    }

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

    je n’ai pas pu formater les champs en nombre car cela crée une erreur (je pense qu’un champ nombre ne peut pas contenir la valeur vide « ».

     

    C’est exactement ça.

    Ajoute cette fonction et appelle la en “script de touche personnalisé” dans chacun des champs.

    Elle n’autorise que la saisie de chiffres mais elle n’empêche pas “rien”.

     

    function formatChiffre() {
    var regxp=/^[0-9]$/;
    if (event.willCommit==false) {
    if (event.change.length>0 && regxp.test(event.change)==false) {
    app.beep();
    event.rc=false
    }
    }
    }

    #70474
    Merlin
    Maître des clés

    appelle la en « script de touche personnalisé » dans chacun des champs

     

    Pour le faire en un clin d’œil copie-colle ce script dans la Console, sélectionne tout et appuie sur la touche Entrée (ne pas confondre avec Retour) :

     

    for (var i = 0; i < this.numFields; i++) {

    var oFld = this.getField(this.getNthFieldName(i));
    if ((oFld.type == "text") && (/ac/.test(oFld.name))) {
    oFld.setAction("Keystroke", "formatChiffre()");
    }

    }

    #70475
    bebarth
    Maître des clés

    bonjour,

    pour l’instant, je n’arriverai pas à faire ces modifs, il y a trop de choses que je ne maîtrise pas dans ce script et il me faut pas mal de temps pour le décrypter.

    Quitte à essayer de comprendre, autant le faire avec un document qui est fonctionnel !
    Voici donc un nouveau fichier où il n’y a plus de message d’erreur lors de l’exécution du script de la dernière ligne.
    Je l’ai également modifié un peu car il ne fonctionnait pas bien lorsqu’on effaçait les champs un à un.
    Si tu as besoin d’explications sur certaines lignes, tu demandes…

    En bonus, voici un fichier que j’ai fait pour moi afin d’écrire les textes pour les fonctions eval(), ce qui n’est pas toujours évident !
    C’est un fichier de travail qui n’était pas destiné à être distribué, il ne comporte donc pas d’alertes et les variables doivent être nommées avec attention…
    Merlin reconnaitra sans doute un de ses fichiers dont je me suis inspiré pour créer celui-ci.

    @+
    😎

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

    @Merlin : Merci pour ces réponses. Je n’ai pas eu besoin d’implémenter le dernier code proposé.

    J’ai pu formater mes champs en nombre et pour que cela fonctionne j’ai modifié les conditions dans la fonction affLigne :

    if (ac0 === 0 | ac1 === 0 | ac2 === 0 | ac3 === 0 | ac0 > 0 | ac1 > 0 | ac2 > 0 | ac3 > 0)

    Et j’ai trouvé ce code super pratique pour déclarer un grand nombre de variable :

    for (var i=0; i<=19; i++) {eval("var ac"+i+" = this.getField(\"ac."+i+"\").value");}

    Je ne connaissais pas la fonction eval(). J’ai fait un peu des recherches et il y a certaines choses que je ne comprend pas bien.

    J’ai entre autre lu que : La fonction  eval()évalue le code JavaScript représenté sous forme de chaîne. et plus loin : Si la chaîne représente une expression, eval() évalue l’expression. Si l’argument représente une ou plusieurs instructions JavaScript, eval() évalue les instructions.

    Mais je ne comprend pas bien ce qu signifie évaluer une expression.

    Et un peu plus loin je lis qu’il est dangereux d’utiliser cette fonction : eval() est une fonction dangereuse, qui exécute le code qui lui est passé avec les privilèges de l’appelant. Si vous exécutez eval() avec une chaîne qui pourrait être affectée par une partie malveillante, vous risquez d’exécuter un code malveillant sur la machine de l’utilisateur avec les autorisations de votre page Web/extension.

    Je suppose que le danger évoqué concerne le javascript utilisé sur des pages web et non pas celui intégré aux pdf?

    Source : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval#never_use_eval!

    Merci

    Edit : @BB : Merci pour le fichier, je vais prendre le temps d’y voir un peu plus clair….

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

    Je viens d’intégrer la fonction format chiffre proposée par Merlin dans le fichier proposé par BB. Du coup seuls les chiffres peuvent être saisis.

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

    Je viens d’intégrer la fonction format chiffre proposée par Merlin dans le fichier proposé par BB. Du coup seuls les chiffres peuvent être saisis

    Comme ça, tu exécutes mon script avant celui de Merlin et ça ne fonctionne pas très bien ! Si tu tapes une lettre, elle ne sera effectivement pas affichée mais la ligne du dessous sera affichée.

    …et ma version pour ne taper qu’un chiffre par champ !

    @+
    😎

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

    Bonjour, je ne comprends pas bien pourquoi je n’arrive plus à voir les réponses de ce fil. Je ne vois plus que ma première intervention du 21/01…

    Edit : le fait de répondre a réglé ce problème.

    Merci BB pour ta dernière proposition.

    • Cette réponse a été modifiée le il y a 2 années et 3 mois par michel c..
    #70496
    michel c.
    Participant

    Je commence à  étudier ton script, j’en suis au début ;

    la variable modeleRegEx est définie par : /^\d?$/;

    Le \d définit la saisie de chiffres de 0 à 9 si je comprend bien.

    ^ et  $ : semblent marquer le début et la fin d’une ligne

    Le ? : Correspond à 0 ou 1 occurrence de l’élément précédent → je ne vois pas trop …

    Y a t-il de la documentation à ce sujet ? J’ai regardé un peu sur le net et dans JavaScript for Acrobat API Reference mais ça me semble un peu confus.

    J’ai aussi du mal à comprendre la ligne suivante : aTester.splice(event.selStart, event.selEnd-event.selStart, event.change);

    event.selStart semble marquer le début de la saisie et  event.selEnd-event.selStart; ce qu’il y a entre le début et la fin mais je ne suis pas sûr.

    Par contre je ne saisis pas le .splice

     

    Merci

     

     

     

     

    #70497
    Merlin
    Maître des clés
    #70499
    bebarth
    Maître des clés

    bonjour,
    /^\d?$/ ici peut être écrit /\d?/ car on ne cherche qu’un seul chiffre
    / : Ouverture de l’expression régulière
    ^ : Depuis le début de la chaine de caractères (ici non nécessaire vu qu’il ne peut y avoir qu’un seul chiffre
    \d : Correspond à un chiffre dans la chaine de caractères
    ? : 0 ou 1 occurrence du  caractère précédent (ici \d)
    $ : Jusqu’à la fin de la chaine de caractères (ici non nécessaire vu qu’il ne peut y avoir qu’un seul chiffre
    / : Fermeture de l’expression régulière
    Sources : https://www.w3schools.com/jsref/jsref_obj_regexp.asp
    ou : https://developer.mozilla.org/fr/docs/Web/JavaScript/Guide/Regular_Expressions

    Par contre je ne saisis pas le .splice

    https://www.w3schools.com/jsref/jsref_splice.asp
    https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/Array/splice

    J’ai essayé de commenter le script de document le plus explicitement possible… cf. nouveau fichier

    @+
    😎

    Fichier mis à jour le 24/01/22

    • Cette réponse a été modifiée le il y a 2 années et 3 mois par bebarth.
    Attachments:
    You must be logged in to view attached files.
    #70503
    michel c.
    Participant

    @Merlin : merci, j’ai acheté le bouquin, il a l’air vraiment bien fait et gros avantage pour moi : c’est en français.

    @ BB : Merci aussi pour les commentaires sur le script, ça me fait gagner un temps fou.

    Et merci aussi pour ce site, j’ai énormément progressé grâce à vous. Il y a quelques moi j’étais loin d’imaginer tout ce que l’on pouvait faire avec des formulaires pdf.

    Pour un débutant en programmation, c’est très agréable d’avoir un site comme celui-ci pour se faire aider.

    #70506
    Merlin
    Maître des clés

    Merci pour les compliments !

    Si tu pouvais publier les mêmes sur Twitter, LinkedIn, Facebook, etc. ce serait extra.

    😎

    #70507
    michel c.
    Participant

    Malheureusement je n’utilise aucun réseau social…

    #70511
    Merlin
    Maître des clés

    On ne peux pas te donner tort.

    😉

    #70512
    michel c.
    Participant

    Je viens de me souvenir que j’avais un compte chez Linked In sur lequel je vais quasiment jamais. Je cherche comment faire pour publier les recommandations mais je n’ai pas trop l’habitude de ce genre de trucs….

    #70513
    Merlin
    Maître des clés

    Merci, mais n’hésites pas : moins on a l’habitude de publier et plus ça parait sincère quand on le fait.

    😎

    #70514
    michel c.
    Participant

    Bon, j’ai commenté un truc avec des commentaires positifs et tout, cependant, je ne sais pas trop qui les verra, j’ai jamais trop bien compris comment fonctionnent ces réseaux sociaux.

    Bon je n’ai pas d’abonnement à LinkedIn, juste un compte gratuit, je suppose qu’il y a certaines limitations pour la publication de commentaires.

    #70515
    Merlin
    Maître des clés

    Moi je l’ai vu, c’est déjà ça 😉

    Merci.

    #70516
    michel c.
    Participant

    Alors ça va, ça n’aura pas été fait pour rien.

Affichage de 28 réponses de 1 à 28 (sur un total de 28)
  • Vous devez être connecté pour répondre à ce sujet.