DCL-03

Troisième exemple
Case avec TEXTE


Dans cet exemple, je vais expliquer comment créer une boîte de dialogue qui contient une zone de texte.
Dans cette zone de texte, il sera possible d'y mettre une valeur (textuelle) par défaut depuis le programme LSP, ou créer une zone vide.
Une fois que l'utilisateur aura tapé quelque chose dans cette zone de texte et qu'il aura validé par OK, la valeur sera mémorisée dans une variable dans le fichier LSP.
Libre à nous de l'utiliser pour créer un texte dans le dessin ou tout autre chose.
Si l'utilisateur choisit de cliquer sur annuler, on sort sans rien mémoriser.
Cette fonction peut être utile pour envoyer une chaine de caractère dans une variable pour traitement futur dans un LSP, par exemple, entrez le nom de la pièce, et plus tard utiliser le contenu de cette variable pour créer une entité texte dans le dessin.


Aspect visuel de la case au lancement :


On a besoin toujours de deux fichiers, un DCL un LSP :

Fichier DCL :

// CaseDeTexte
CaseDeTexte : dialog { key = "Titre";
                        label = ""; //Titre depuis le LSP
                        initial_focus = "Edit1";
                        spacer;
                       : row { : column { width = 13; fixed_width = true;
                       : text { key = "Prompt";
                                 label = "";//Prompt depuis le LSP
                                 }}
                       : edit_box { key = "Edit1";//Edit1 depuis le LSP
                        edit_width = 25;
                        fixed_width = true;
                         }}
                       spacer;
                       : row { fixed_width = true;
                         alignment = centered;
                       : ok_button { width = 11; }
                       : cancel_button { width = 11;}
                          }
}//fin de CaseDeTexte

Voici maintenant le fichier LSP qui va piloter le tout :

;|
CaseDeTexte - Case de Dialogue avec case de texte à remplir
contient deux Arguments
Titre = Titre de la case de dialogue
Edit1 = Texte dans la case
exemple de syntaxe : (CaseDeTexte " Titre de la case " "vide")
renvoie la valeur du texte tapé ou le texte par défaut si pas de frappe de texte
|;

(defun CaseDeTexte (Titre Edit1 / dcl_id flag-dcl nouveau_texte)
   (setq Dcl_Id (load_dialog "CaseDeTexte.dcl"))
   (new_dialog "CaseDeTexte" Dcl_Id)

   (set_tile "Titre" Titre)
   (set_tile "Prompt" "Texte à saisir:")
   (set_tile "Edit1" Edit1)

   (action_tile "accept" "(setq Nouveau_Texte (get_tile \"Edit1\"))(done_dialog 1)")
   (action_tile "cancel" "(done_dialog 0)")
   (setq flag-dcl (start_dialog))

   (unload_dialog Dcl_Id)
(if (= flag-dcl 0)
      (setq Nouveau_Texte nil)
   ) ;_ Fin de if
nouveau_Texte
) ;_ Fin de defun


Quelques explications :

La syntaxe est donc : (NomFonction argument1 argument2), en l'occurrence :

NomFonction est ce qui est défini par (defun) : casedetexte,
le LSP n'est pas aussi tatillon que le DCL et ne s'occupe pas de la casse, la différence majuscules/minuscules pour mémoire, le DCL étant très sensible à la casse, c'est un sujet d'erreur de bon nombre de personnes habituées au lisp moins regardant.
Viennent ensuite les deux arguments titre et edit1 (j'ai mis edit1 car bien sûr, il est possible de faire des extensions et de prévoir d'autres cases de texte, edit2,edit3...)
Exemple de syntaxe pour lancer la case de dialogue avec un titre de la case (écrit dans le bandeau supérieur) en premier argument et une chaîne vide en deuxième argument (qui va apparaître dans la zone de saisie de texte).
(casedetexte "Titre de la Case " " ")
Voici de que ça va donner visuellement :


Dans cet autre exemple, je vais faire le contraire, renseigner le premier argument d'une chaîne (string) vide et le deuxième avec une chaîne préremplie.
La syntaxe est donc (casedetexte " " "texte déjà saisi ")

Pas de titre et un argument de chaîne en surbrillance, c'est la ligne (surlignée sur cette image) dans le fichier DCL qui en est la cause, on dit qu'elle met le focus sur une ligne :

Comme son nom le laisse penser, initial_focus avec une valeur de 1 met la ligne indiquée en valeur (focus)


À vous de jouer...


Haut de page

retour à "Exercices DCL"


20 janvier 2018
petite correction et mise à jour le 30 octobre 2018

autre correction de faute de frappe et mise à jour le 15 février 2023.