Cocher plusieurs cases si l'une d'entre elles est cochée, et inversement.  (Lu 3444 fois) Partager ce sujet Imprimer

1 B


Esdeve  30 octobre 2014 : 16:16

Ok. Méa culpa. J'avais lu cette explication de On Focus / Blur sur un autre forum avec un utilisateur posant cette question.
Je vais expérimenter dès que je suis désoeuvré coté papelards, admin, trucs a écrire. Peut être dès ce soir.

IP archivée


brumbies  30 octobre 2014 : 16:05

Bonjour,
Tu devrais aller regarder sur le web des cours d’initiation à JavaScript ainsi tu auras une meilleur vu de la syntaxe à utiliser.
http://javascript.developpez.com/cours/
https://developer.mozilla.org/fr/docs/Web/JavaScript/Une_r%C3%A9introduction_%C3%A0_JavaScript
Ainsi, tu apprendras les variables, les opérateurs, les structures de contrôle, les fonctions … (ex : &&, ||, == ou =, if(), for(), …) dans quel cas et surtout comment les utiliser.
La boucle for() est un standard au même titres que la condition if(), et une fois que tu l’auras maitrisé, tu te rendras compte qu’elle peut être très utile dans ton cas.
Regarde de plus près la duplication rapide des champs et à la Convention de dénomination des champs de formulaire (recherche sur le site déjà évoqué plusieurs fois) et associé à la boucle for tu verras que ton script sera « raccourci ». Dans l’exemple j’ai mis une boucle for allant de i = 1 jusqu’à i <= 2 avec un pas de 1 (i++ s’écrit aussi i = i + 1), mais on aurait pu aussi faire aller i jusqu’à 100…
Le but d’avoir un script le plus minimaliste possible n’est pas toujours une bonne solution, car souvent perte de temps par rapport à la recherche de l’optimisation.
Dernier point sur (0), il ne signifie rien tout seul, ce qui importe c’est la fonction isBoxChecked, cette fonction doit recevoir une variable pour être exploitable. Variable correspondant au numéro de la Checkbox.
Tu peux voir l’utilisation des fonctions JavaScript propres à Acrobat ici :http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/js_api_reference.pdf
Merci Merlin pour la correspondance entre version anglaise et française.
:Smiley01:

IP archivée


Merlin  30 octobre 2014 : 14:38

On Focus : champ activé.
On Blur : champ désactivé.
Mouse Up : souris relevée.
Mouse Down : souris enfoncée.
Mouse Enter : curseur entrée (survol).
Mouse Exit : curseur sortie (fin de survol).

 :geek:

IP archivée


Esdeve  30 octobre 2014 : 13:40

Bonjour bonjour, et bienvenue dans ma ronde.
Du ex nihilo donc. Il me reste quand même à chercher comprendre un max. L'idée étant que je puisse aussi créer au bout d'un moment.
Depuis que je fais des tests, il y a toujours des parties de codes que je peux bien mémoriser peu à peu, mais qui me donnent l'impression d'apprendre les mots d'une langue sans savoir les assembler ou pourquoi ils se suivent dans cet ordre. On y va.

Réponses :
1) Ok. Pigé ! Je n'avais en effet pas essayé de faire ta 1ere version, alors que mes crochets en trop m'apparaissent ici comme évident. Petit pas vers la compréhension de la façon de structurer ... Enfin petite prise de conscience de certains détails. Je me considère pas comme sans sens de l'observation, mais l'idée de faire comme ça ne m'est même pas venue, et puis je m'y suis perdu aussi. Quand quelque chose apparait comme hermétique pendant un moment, on n'arrive pas à comprendre quoi qu'on fasse. On est aveugle.

3) Ah, bah c’était le même genre d'idée que pour le 1), compacter et alléger le nombre de choses à écrire dans le cas d'une TRÈS LONGUE arborescence. Si ça avait été automatique, pour chaque case comportant le code de départ, ça m'aurait évité d'avoir à l'entrer un bon nombre de fois en ne m'occupant que de celles directement en dessous dans la hiérarchie (même si la solution avec la variable 1) faciliterai les choses quand toutes les cases se suivent). L'idée de hiérarchie convient bien d'ailleurs c'est de la délégation complète. Là j'ai à peu près 100 cases avec 4 "niveaux" même si une arborescence n'est pas tout a fait une analogie exacte. C'est encore moins linéaire puisque certaines cases existent en double et se retrouvent dans des parties appartenant à des "troncs" plus petits et négligeables. D'où la recherche de plusieurs réponses techniques à utiliser selon situation ... voir juste pour l'apprentissage.
Paradoxe et une illusion souvent ressentis : les flemmards sont les plus performants, ou l'inverse. Un ami n'ayant rien à faire de l'informatique a appris à maitriser les scripts/macros (je fais pas bien la différence) juste pour automatiser certaines tâches, et c'est fou ce qu'il abat en se touchant maintenant. Je cherche la même.

Pour donner une idée, là c'est un long docu bien chiant avec dessus des validations d'acquis comportant pleins de critères et sous critères d'évaluations dans différentes catégories, et ensuite des étapes de travail planifiées. Là tout est très détaillé et ultra précis ... mais j'ai pas choisi. J'aurai à reproduire. Je veux donc juste changer la forme et du même coup avoir une base pour des documents ultérieurs. Je me vois aussi m'en servir à l'inverse dans le cadre de modes opératoires à suivre lors d'un exercice/auto évaluation. Ce genre de choses.



Et ^^ Questions :
Que ce soit pour 1) 2) et 3), je passe à la pratique et tests dès que j'ai un passage sur pc un peu plus long autre que pour mails/forum/machins sociaux puis je reviens éditer ou répondre. Déjà des questions sans même aller test :
1) Je ne sais pas si le terme commande est exacte, mais je me demandais si il n'existait pas comme commande "&" ou approchant comme j'ai voulu utiliser. Elle semble l’être et est visible dans le 2) C'est juste qu'il en faut deux ?!! "&&" ?!! Oo

Pour la deuxième proposition, dans :
for(var i = 1; i <=2; i++)Pour une variable i allant de 1 à 2 parce que trois checkbox, dont deux après la 0 contenant le code concernant les deux autres ça d'accord. Mais à quoi correspond "i++" stp ? Et peut on peut remplacer tout numéro par une formule mathématique ou une variable de cette façon, même dans le nom d'un objet comme dans le cas présent ?

2) Toujours l'apprentissage de la syntaxe. À force de pas trouver même en tentant de copier j'ai fait nimp. Le truc que j'ai écrit de mémoire en 2 est un pale exemple de mes bêtises, mais il me fait poser une question :
Déjà, j'y ai oublié un (this.), mais elle concerne l'autre oubli (0). Je pense m'être trompé sur son utilité. Je n'en vois plus qu'une à vérifier. C'est dans le cas ou la case existe en plusieurs exemplaires (#0, #1, #2 ...etc) ? Et est-il obligatoire ?

3) Je le souhaitais aussi mais me souviens sans regarder qu'il n'y a pas de déclencheur ''champ activé". Comme je suis sur une version anglophone j'ai Mouse Up, Down, Enter, Exit que j'ai traduit par curseur enfoncé, relâchement du curseur, entrée du curseur dans le champ de l'objet, sortie. Et On Focus, On Blur que j'avais trouvé correspondre à la même idée que enter exit mais avec les commandes clavier.
À moins que ce soit une option existante avec d'autres logiciels compatibles avec ce format de formulaire (PDFforms ici, et l'autre xml je crois)? Je ne fais déjà plus la distinction mais j'avais cherché dans le libre au départ et m'étais aussi renseigné sur les différences entre les formats de formulaires existants. Même si l'idée du professionnalisme n'est pour moi absolument pas liée à l'usage d'un outil ... Je ne me suis dirigé vers Adobe uniquement parce que j'avais l'occasion de tester un logiciel "Pro". Peut il y avoir des déclencheurs différents chez des concurrents d'Adobe (Je me souviens de PDF FORMS Designer par exemple) ?
... Ou suis-je encore au mauvais endroit dans le logiciel ...
Aussi "setFocus" c'est pour se déplacer dans la page vers une cible non ? Je vais chercher à en faire qqch ;)

Déjà merci pour tout. @+

IP archivée


brumbies  29 octobre 2014 : 15:59

Bonjour,
 
Quelques pistes pour tes diverses interrogations :
 
1) tu étais proche d'un script opérationnel, tu as simplement ajouté trop de {}

if (event.target.isBoxChecked(0))
{
 this.getField("CheckBox1").checkThisBox(0,true);
 this.getField("CheckBox2").checkThisBox(0,true);
}
else
{
 this.getField("CheckBox1").checkThisBox(0,false);
 this.getField("CheckBox2").checkThisBox(0,false);
}

sinon tu peux aussi simplifier le code de la façon suivante :

if (event.target.isBoxChecked(0))
{
 for(var i = 1; i <=2; i++)
  this.getField("CheckBox"+i).checkThisBox(0,true);
}
else
{
 for(var i = 1; i <=2; i++)
  this.getField("CheckBox"+i).checkThisBox(0,false);
}

2) en reprenant l'arborescence en 3) alors tu peux utiliser un scrip comme celui-ci, que tu dupliques sur les CheckBox3 et CheckBox4

if (this.getField("CheckBox3").isBoxChecked(0) && this.getField("CheckBox4").isBoxChecked(0))
{
 this.getField("CheckBox1").checkThisBox(0,true)
}
else
{
 this.getField("CheckBox1").checkThisBox(0,false)
}

3) je ne comprends pas ta logique de ne vouloir activer que CheckBox1 et CheckBox2 via un script en CheckBox0 parce que la finalité est d'activer CheckBox3 et CheckBox4.
 
Pour moi il suffit d'activer C3 et C4 dans le même script que C1 et C2 soit en C0.
 
Enfin une piste pour répondre à ta demande serait d'ajouter en C0 la ligne
this.getField("CheckBox1").setFocus();
le tout en dupliquant le code en C1 aussi bien avec le déclencheur "souris relachée" et le déclencheur "Champ activé".
 
 :Smiley01:

IP archivée


Esdeve  29 octobre 2014 : 09:48

Salut. Je suis de retour, après beaucoup de temps sans avoir la possibilité d'en prendre pour ce petit "exercice" beaucoup moins urgent que le reste. À vrai dire avant hier, j'avais même perdu le sujet de vue et posté de nouveau ailleurs, avec progression, ce que je m'empresse de rajouter ici après vous avoir retrouvés.
(désolé de l'abandon de quasi deux mois  :Smiley11: mais même si je n'aime pas faire ça, j'avais vraiment autre chose à faire de mes mains)

Voici ou j'en suis :


En éditant des exemples, dont un pdf abracadabratools et en les testant je suis parvenu à un code identique à celui du forum externe. En cocher plusieurs avec étant possible simplement pour moi en ajoutant le même code à plusieurs reprise :

Premièrement, une petite note qui pourrait en aider certains, on avait vu que moi même je ne savais pas au départ où aller dans Acrobat (j'utilise toujours le 11 chez un ami):
En édition de formulaire, clic droit sur la box concernée, propriété, actions, dans les deux menus déroulants du cadre "ajouter une action", choisir pour déclencheur "mouse up"(je ne suis pas sur de ce que cela donnerait dans une version française, ça correspond à la remontée du bouton de souris), et pour action "executer javascript", puis cliquez sur ajouter. Un champ de texte s'ouvre directement pour écrire le script désiré. Ici :

if (event.target.isBoxChecked(0))
{this.getField("CheckBox1").checkThisBox(0,true);}
else
{this.getField("CheckBox1").checkThisBox(0,false);}

if (event.target.isBoxChecked(0))
{this.getField("CheckBox2").checkThisBox(0,true);}
else
{this.getField("CheckBox2").checkThisBox(0,false);}
...
etc etc selon le nombre à cocher, ici deux, "chekbox1" et "checkbox2".
Code provenant de http://forums.mediabox.fr/topic/179510-cocher-une-checkbox-avec-javascript/

Seulement j'ai depuis trois buts supplémentaires à ma première et simple intention de multichecker ... Et comme je cherche à apprendre des bases, il y s'en ajoutera probablement avec d'autres sujets ne pouvant être liés à celui ci :)
1- Le premier puisque je risque de renouveler l'expérience, et avec moult moult cases, ce serait de savoir rendre tout ça plus compacte. Au moins gagner quelques lignes sur les box scripts les plus longs. J'ai bien essayé des choses comme :

if (event.target.isBoxChecked(0))
{this.getField("CheckBox1").checkThisBox(0,true);}
{this.getField("CheckBox2").checkThisBox(0,true);}
else
{this.getField("CheckBox1").checkThisBox(0,false);}
{this.getField("CheckBox2").checkThisBox(0,false);}

et :
if (event.target.isBoxChecked(0))
{this.getField("CheckBox1").checkThisBox(0,true);}
&
{this.getField("CheckBox2").checkThisBox(0,true);}
else
{this.getField("CheckBox1").checkThisBox(0,false);}
&
{this.getField("CheckBox2").checkThisBox(0,false);}


ou encore :
if (event.target.isBoxChecked(0))
{this.getField("CheckBox1"&"CheckBox2").checkThisBox(0,true);}
else
{this.getField("CheckBox1"&"CheckBox2").checkThisBox(0,false);}


Et bien d'autres, qui montrent juste que je patouille en variant une syntaxe que je ne maitrise évidement pas même si je cherche à comprendre un maximum de sa théorie sans avoir de support. Réduire ce code est-il seulement possible ?


2- Le second but, je l'avais déjà donné, c'est de faire l'inverse du code original ! C'est à dire qu'une case soit cochée si deux autres ou plus le sont. Le modèle rétroactif du premier.
Là aussi j'ai tâtonné, en réutilisant le matériel trouvé sur d'autres scripts d'abord en cherchant à le faire avec une seule ... ce qui, ne savant pas beaucoup voir rien et ne trouvant pas d'équivalent, n'a bien sur pas porté ses fruits.

J'ai par exemple du faire des machins comme suit, tentant même d'écrire quelque-chose (uncheckThisBox ^^) que je n'avais pas vu mais qui pourrait exister :
if (getField("CheckBox1").isBoxChecked)
{checkThisBox(0);}
else
{uncheckThisBox(0);}


3- Et pour finir, un détail me contrarie dans l'utilisation du code de ce sujet :
Comme vu précédemment, on peut comparer ce que je cherche à faire à une arborescence. Pour rappel :

Checkbox0---
                     |
                     |       |--Checkbox3
     Checkbox1-----
                     |       |--Checkbox4
                     |     
     Checkbox2
                     |
                     |
                   etc...


La "racine", Checkbox0 cochant TOUT (ça c'est possible et fait mais j'aimerai nuancer), Checkbox1 cochant Checkbox3 et 4 (même envie de performance) ... (Mais)
En utilisant le code que nous avons :
- Si je fais le choix de n'activer automatiquement QUE Checkbox1 et Checkbox2 quand je coche manuellement Checkbox0 grâce au code contenu par celle ci.
- Et si Checkbox3 et Checkbox4 s'activent de la même manière en cochant Checkbox1 ...
- Ici, le problème reste que Checkbox3 et Checkbox4 ne se cochent pas automatiquement lorsque Checkbox1 est activée par Checkbox0.

Savons nous à l'avance si il est possible d'en venir jusqu'à ce cochage de box en cascade ou est-ce un oubli de la part d'Adobe ? J'espère que ce point 3- puisse être résolu par le point 2- en ajoutant le code y correspondant à ces cases 3 et 4 récalcitrantes.


Pour ces trois questionnements, je suis toujours preneur de réponse allant de la résolution ex nihilo (Dixitque Deus: "Fiat JavaScriptus !" Et facta est JavaScriptus. Alleluia !!) sans que je n'y comprenne rien ce qui serait dommage, à l'aide simple, en passant par la correction, les travaux dirigés ^^, des références, au conseil de tutoriaux. En plus de ce que je peux trouver ici, je commence à en lire ailleurs, par exemple sur 3schools qui se trouve en haut de ma liste.

Cordialement.

Ps: Arf pas de balises spoiler pour tasser ...

IP archivée


Merlin  07 septembre 2014 : 17:24

Nous sommes donc d'accord

C'est bien ce que je disais : je n'ai pas tout compris !


Peux tu confirmer que c'est bien à l'endroit que je cite que je dois scripter … ?

Je te confirme que ce n'est pas là du tout ! L'Assistant Action (Action Wizard) c'est pour les traitements par lot ou répétitifs.
Tu vas devoir utiliser des scripts de document, des scripts d'évènement et des scripts d'action, voir : http://abracadabrapdf.net/ressources-et-tutos/js-et-formulaires-ressources/les-differents-niveaux-dutilisation-des-scripts-javascript/

Les scripts de document et d'événement sont accessibles via le panneau d'outils JavaScript d'Acrobat, les scripts d'action via les Propriétés du champ de formulaire concerné.


En voulant répondre j'ai cliqué sans lire les boutons sur le "modifier" de TON post ... Et ça m'a ouvert la possibilité de le modifier. N'ai-je pas des droits que je ne devrais pas avoir ??? -_-
Edit : Ah non. Sur les autres sujets c'est bon, je suis juste le roi de mon topic apparemment.

Merci de l'avoir signalé, ce forum a toujours été très permissif mais là c'était trop !
 :geek:

IP archivée


Esdeve  06 septembre 2014 : 21:28

Salut. Merci de la réponse :)

J'ai un peu plus lu d'autres trucs concernant les scripts, mais pas commencé la mise en pratique.

Concernant la clarté de mon post. Je dis simplement que "je connais la possibilité offerte par le logiciel de cocher plusieurs cases en même temps sans scripter parce que ce sont une seule et même case située à plusieurs endroits", cela histoire qu'on ne me dirige pas sur cette solution (je connais les forums) mais "que cette solution ne me convient pas" car "ce que je veux c'est" ce que tu écris effectivement juste en dessous.
Soit toutes cases cochées par la principale.
Soit cases cochées individuellement, la principale inactive (et du coup rétroaction, principale cochée si cases secondaires toutes cochées manuellement).

Nous sommes donc d'accord ;) c'était juste de la mauvaise rhétorique et écriture désolé.

Je reviens dessus dans la semaine j'espère avec un exemple de script, selon somme de travail autre, pour voir si du monde peux proposer une correction si ça marche pas, ou si qqn a une version plus simple etc.

Peux tu confirmer que c'est bien à l'endroit que je cite que je dois scripter, ou dire si il a autre chose à faire avant que je m'y mette ?

++


Ps : En voulant répondre j'ai cliqué sans lire les boutons sur le "modifier" de TON post ... Et ça m'a ouvert la possibilité de le modifier. N'ai-je pas des droits que je ne devrai pas avoir ??? -_-

Edit : Ah non. Sur les autres sujets c'est bon, je suis juste le roi de mon topic apparemment.

IP archivée


Merlin  05 septembre 2014 : 10:47

Bonjour et bienvenue,

J'ai déjà découvert que si deux cases ont le même nom (en faisant un copier coller par exemple), elles seront cochées simultanément. Mais ayant plusieurs box et des situations dans lesquelles elles ne doivent pas toutes être activées, ça ne convient pas. Si mon titre n'est pas assez clair…

Ce n'est pas le titre qui manque de clarté, ce sont tes explications.
Dans la citation ci-dessus tu demandes une chose et son contraire en même temps (ou alors je n'ai rien compris), ça va être difficile…

Je ne vois que 2 cas possibles à gérer :
- soit des cases doivent être toutes cochées si la case principale est cochée,
- soit elles ne doivent pas l'être.

Dans tous les autres cas ce sera à l'utilisateur de les cocher unes par unes.

 :Smiley01:

IP archivée


Esdeve  05 septembre 2014 : 10:20

Salut à tous !

Tout d'abord, je veux dire que je m’apprête pour l'occasion à aborder le JavaScript sans jamais avoir fait quelque chose de similaire mais j'imagine c'est en scriptant qu'on apprend à scripter, comme un ami me disait à propos de son évolution dans la programmation. En fait je suis totalement néophyte à Accrobat version X en entier, j'ai de vagues connaissances de précédentes versions, et je vais l'utiliser chez quelqu'un d'autre, qui lui n'est pas capable de m'aider pour cette partie, même si il connais l'existence des scripts et m'a proposé d'essayer. L'outil en question m’intéresse, je verrais selon mes besoins et ce que j'en découvre si j’acquiers le logiciel.

Je viens donc ici vérifier plusieurs choses ^^
D'une, tout simplement si c'est bien à l'intérieur du volet à droite, dans [ Tools / Action wizard / Create new action / More tools / Execute JavaScript ] que je dois faire ces scripts ? Puis je clic droit sur la box concernée, propriétés, puis actions et je lui attribue l'action qui lui est destinée et je fais ça pour toutes les box ? Ou y a t'il un autre endroit pour préciser le comportement de mes cases à cocher ? Peut être n'ai je même pas besoin de scripter et n'ai je pas trouver comment faire. Ce qui nous amène (enfin) au sujet principal, le comportement que je veux faire adopter à mes box :


J'ai des différentes box, hiérarchisées d'une façon, disons arborescente, même si elles ne sont pas forcément proches dans le document (d'une manière comparables à celles présentes dans un installeur de logiciel, quand on choisit des sous options) comme suit :
 (les x sont des cases)

  X0--
         |
     
   |
        X1
         |
     
   |
        X2
         |
     
   |
        X3

Voir encore des sous champs à cocher dans les X1/2/3 ... ^^'

J'ai déjà découvert que si deux cases ont le même nom (en faisant un copier coller par exemple), elles seront cochées simultanément. Mais ayant plusieurs box et des situations dans lesquelles elles ne doivent pas toutes être activées, ça ne convient pas. Si mon titre n'est pas assez clair, ce que je veux, c'est que si X0 est cochée, X1 X2 et X3 le soient aussi automatiquement. Ou plusieurs autres case ailleurs dans le document. Et que si inversement je coche X1 X2 et X3 , X0 se coche automatiquement. Pareil ailleurs pour d'autres Xx.

Un scripteur voulant scripter apprenant à scripter en scriptant je vais déjà essayer de réussir quelque chose d'aussi (probablement) élémentaire ; même pour un novice ; seul. Je cherche surtout cette confirmation quand à l'endroit dans lequel je script/attribue une action. J'ai un exemple qui semble approchant sous la main, mais peut être aurai-je besoin d'un autre ensuite si je ne parviens pas à quelque chose avec le "matériel" que l'on m'a donné ^^ des "if" "this" "true" "false" "event" "getfield" "check" "checkbox" "target" etc. Bref, bonjour le dur apprentissage de la syntaxe. Je trouve ça de toute façon plus intéressant de donner le résultat ensuite sur forum.

Merci d'avance à toute personne m'aidant dans ce "TP" si je reviens avec des difficultés, ou avant.

IP archivée