start_list
add_list
end_list
Les listes de choix
Pour afficher une liste de données dans une case de dialogue en DCL, on va travailler avec ces trois fonctions : start_list, add_list et end_list
C'est quoi une "liste" dans les cases de dialogue ?
Rien à voir avec la notion de liste (list) de l'AutoLisp, une liste est un élément d'une case de dialogue où des données sont fournies en lignes dans une ou des colonnes et que l'utilisateur peut choisir en cliquant.
L'avantage de ces listes est qu'il n'y aura pas de saisie au clavier par l'utilisateur et de cette façon l'orthographe sera respectée et on n'aura plus à craindre d'erreur de saisie de la part de l'utilisateur puisque, par définition, il a opéré un choix dans ce qui est prévu et pas autre chose.
Dans ces listes on peut mettre des noms de calques, des noms de blocs, tout ce qui est utile à la gestion du programme et qui évite de la saisie au clavier (d'où émanent la plupart des erreurs sachant que neuf fois sur dix le "problème" est entre la chaise et le clavier)
Le visuel de la case avec liste c'est ça :
Donc, un titre comme d'habitude, un cadre qui contient la liste, une liste des jours de la semaine dans l'exemple, et l'utilisateur va en choisir un en cliquant dessus.
Pour vous montrer que la valeur de la ligne sélectionnée est bien passée dans le LSP sous forme de variable on va afficher une simple case d'alerte qui rappelle le choix effectué, de ce style :
C'est parti pour les codes :
Le DCL :
Liste01 : dialog {
label = "[www.da-code.fr] Case avec liste "; // Titre de la case
: column {
: row {
: boxed_column { label ="Choisissez un jour";
: list_box {
key = "MaListe";
} // fin de list_box
} // fin de boxed_column
} // fin de row
ok_cancel; //bouton de validation par défaut
} // fin de column
} // fin de dialog
Le LSP :
(defun fonction() ;;; extrait le numéro dans la liste (setq Choix_String(get_tile "MaListe")) ;;; si le numéro n'est pas vide (if(/= Choix_String "") (progn ;;;extrait le numéro choisi et le convertit en integer (setq Index_Integer(atoi Choix_String)) ;;; extrait le numéro de la liste (setq Choix-Liste (nth Index_Integer MaListe)) ) ;;; si rien n'est choisi (progn (setq Index_Integer -1) ;;; met l'index à -1 (setq Choix-Liste nil) ;;; et vide la variable Choix-Liste ) ) )
;---------------------------
( defun C:Liste-01 () ;;;création de la liste qui sera affichée ( setq MaListe ( list "Lundi" "Mardi" "Mercredi" "Jeudi" "Vendredi" "Samedi" "Dimanche" ) ) ;;;chargement du fichier DCL ( if ( not ( setq dcl_id (load_dialog "liste01.dcl"))) ( progn ( alert "Le fichier DCL n'a pas été trouvé !") ( exit ) ) ;;;si ça se passe bien, le fichier est chargé en mémoire ( progn ;;;test de recherche de la définition Liste01 dans le fichier DCL ( if ( not ( new_dialog "Liste01" dcl_id )) ( progn ( alert "la définition n'a pas été trouvée dans le fichier DCL !" ) ( exit );et on quitte le programme ) ;;; si ça se passe bien, la définition est chargée en mémoire ;;; et on continue ( progn ;;; la liste dans la case est remplie ( start_list "MaListe" 3 ) ( mapcar 'add_list MaListe ) ( end_list ) ( action_tile "cancel" "(done_dialog 1)" ) ( action_tile "accept" "(fonction)(done_dialog 2)" ) ;;;Affichage de la case de dialogue (setq ddiag ( start_dialog )) ( if (= ddiag 1 );; Si bouton annulé choisi : ( alert "\n Vous êtes sorti sans rien choisir !" ) ) ( if (= ddiag 2 );;;Si bouton OK choisi : ( alert ( strcat "Vous avez choisi : " Choix-Liste )) ) ) ) ) ) ( princ ) )
La fonction définie est "liste01" et je vous suggère de la lancer en ligne de commande pour voir si tout fonctionne correctement.
À votre disposition par le biais de la page CONTACT pour répondre à vos suggestions (corrections, explications, idées d'exemples...)
23 mars 2018