CADxp: Liste déroulante - CADxp

Aller au contenu

  • 2 Pages +
  • 1
  • 2
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

Liste déroulante

#1 L'utilisateur est hors-ligne   cyrkan 

  • Advanced Member
  • PipPipPip
  • Groupe : Membres
  • Messages : 48
  • Inscrit(e) : 20-mars 08

Posté 03 juin 2008 - 15:37

Bien le bonjour.

Voila j'ai voulut m'interresser au liste déroulantes pour ma boite de dialogue.
C'est la première fois que je doit en faire une.

Je me suis reporté sur afralisp, mais il n'utilise pas opendcl pour leur boite de dialogue, il les font a "l'ancienne" (dcl box).
J'ai donc regardé dans l'aide d'opendcl (qui est la même que celle de objectdcl) et la j'ai obtenu a peut prés ce que je cherchais, mais lors du lancement j'ai eut droit à un "no function définition"

Voici le code, adapter à mes besoin:
 ;préparation des listes des combobox

(defun Getlistedesfiltres (/ listedesfiltres)

  (vlax-for item (vla-get-blocks (vla-get-activedocument(vlax-get-acad-object)))

    (if (and (not (wcmatch (vla-get-name item) "*EU_*"))

	     (not (wcmatch (vla-get-name item) "*EP_*"))

	     (not (wcmatch (vla-get-name item) "*ELEC_*"))

	     )

      (setq listedesfiltres (cons (vla-get-name item) listedesfiltres))

      )

    )

  )

  

  

;combobox type

(defun c:Projet_Form1_ComboBox1_OnDropDown ( / listedesfiltres)

	;(setq listedesfiltres (list EP EU AEP))   ;essai de liste dans combobox

  (dcl_ComboBox_AddList Projet_Form1_ComboBox1 

	 StringList (Getlistedesfiltres))  ;StringList (listedesfiltres));essai de liste dans combobox

)


J'ai aussi essayer de tout bêtement créer directement un liste dans la combobox
J'avoue que je patauge sévère sur le coup...

Comment fait t'on une liste déroulante dans opendcl et comment peut ton extraire par la suite le résultat du choix de l'utilisateur de la liste déroulante.
0

#2 L'utilisateur est hors-ligne   Tramber 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 8463
  • Inscrit(e) : 29-mars 03
  • LocationStrasbourg

Posté 04 juin 2008 - 10:38

(dcl_ComboBox_AddList Projet_Form1_ComboBox1 StringList (Getlistedesfiltres))


?

Non, il faut faire un :

(dcl_ComboBox_AddList Projet_Form1_ComboBox1 (Getlistedesfiltres))



Pour extraire, c'est : Odcl_ComboBox_GetTBText
Image IPB

Bureau d'études dessin.
Spécialiste Escaliers
Développement - Formation

./__\.
(.°=°.)
0

#3 L'utilisateur est hors-ligne   stephan35 

  • ceinture noire
  • Groupe : Membres
  • Messages : 351
  • Inscrit(e) : 22-janvier 07
  • LocationRENNES

Posté 04 juin 2008 - 15:54

Bonjour,

Pour te prémunir de tout problème de nom de variable, fait bien attention aux méthodes d'appel (ou de nommage de symboles) !!!

De mon coté, je préfère l'ancienne méthode, plus claire à mon gout !

Le fichier boite.exemple.odcl
Boite : Form1
Combo : Combo1

(dcl_Project_Load "chemin/boite.exemple" T "boite.exemple")

(defun c:boite_Form1_OnInitialize ( /)

(dcl_ComboBox_AddList boite_Form1_Combo1 (list "A" "B" "C"))

;ou

(dcl_ComboBox_AddList "boite.exemple" "Form1" "Combo1" (list "A" "B" "C"))

)

(dcl_Form_Show boite_Form1)

; ou

 (dcl_Form_Show "boite.exemple" "Form1")

 


Utilise la version 4.1.2.1 d'openDCL, les autres ne sont pas encore stables ;)

A+

0

#4 L'utilisateur est hors-ligne   Tramber 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 8463
  • Inscrit(e) : 29-mars 03
  • LocationStrasbourg

Posté 04 juin 2008 - 16:45

Attention, très clairement, il faut préférer la première façon de nommer que la 2ème. Dans certaines fonctions les machins avec des guillemets déconnent !
Image IPB

Bureau d'études dessin.
Spécialiste Escaliers
Développement - Formation

./__\.
(.°=°.)
0

#5 L'utilisateur est hors-ligne   stephan35 

  • ceinture noire
  • Groupe : Membres
  • Messages : 351
  • Inscrit(e) : 22-janvier 07
  • LocationRENNES

Posté 04 juin 2008 - 20:41

Citation

Attention, très clairement, il faut préférer la première façon de nommer que la 2ème. Dans certaines fonctions les machins avec des guillemets déconnent !


T'es sur ???

Parceque, justement j'aurais préconisé la seconde ........
Qui à l'avantage de pouvoir justement passer les mnémo en variables, ce qui permet de créer des fonctions très facilement réutilisables ....

Peut-être une question de point de vue ? ;)

A+
0

#6 L'utilisateur est hors-ligne   Tramber 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 8463
  • Inscrit(e) : 29-mars 03
  • LocationStrasbourg

Posté 05 juin 2008 - 09:43

Tu me files un doute. Sachez que je n'utilise jamais les guillemets pour une autre raison, c'est que l'éditeur te file le nom composé. Et hop ! Copier-coller.

(dcl_Form_Show boite_Form1)
-> + pratique et nom obtenu par copier-coller et boite_Form1 devient effectivement une variable (ceci dit je ne comprends pas l'intérêt que tu en tires).

(dcl_Form_Show "boite" "Form1")
-> laborieux et déconnant à l'époque d'ODCL 3.


Image IPB

Bureau d'études dessin.
Spécialiste Escaliers
Développement - Formation

./__\.
(.°=°.)
0

#7 L'utilisateur est hors-ligne   stephan35 

  • ceinture noire
  • Groupe : Membres
  • Messages : 351
  • Inscrit(e) : 22-janvier 07
  • LocationRENNES

Posté 05 juin 2008 - 10:35

Citation

Tu me files un doute. Sachez que je n'utilise jamais les guillemets pour une autre raison, c'est que l'éditeur te file le nom composé. Et hop ! Copier-coller.
(dcl_Form_Show "boite" "Form1")
-> laborieux et déconnant à l'époque d'ODCL 3.


No soucy ;)

J'ai eu moi, quelques soucis avec cette méthode, entre autre lors de l'utilsation des (VarName)
depuis, ça roule impec !

Comme décrit précédemment, la subtilité subsiste dans la définition du nom de la boite lors de son chargement :

 (setq $boite (dcl_Project_Load "chemin/boite.exemple" T "boite.exemple"))


$boite contient le nom de la boite(s) : "boite.exemple"

 (setq $dial1 "Form1")

(dcl_Form_Show  $boite $dial1)


après , tu passes tous les autres paramètre à l'identique.
Je me suis prémunis de pas mal de soucis de copier/coller en procédent ainsi ....

De plus boite_Form1_Combo1 n'est pas forcément vrai , essaye avec un fichier boite.exemple.odcl .....

Autre petit conseil, raccourcir les noms des variavles dans les events est fortement suggéré parceque :
C:maboiteamoi_formulairediagnostique1_OnCancel n'est pas super pratique à lire ;)
C:Forme1_OnCancel est plus claire !

Etc .

Après, sur 1000 développeurs, 1000 façons de faire .... :casstet:


0

#8 L'utilisateur est hors-ligne   Tramber 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 8463
  • Inscrit(e) : 29-mars 03
  • LocationStrasbourg

Posté 05 juin 2008 - 10:48

Ma vieille version fonctionne sur 2008, du coup je ne me suis pas intéressé (encore) aux nouvelles versions (libre ou payante).
Ce que tu décrit là n'était pas documenté avant, ..... j'en apprends.
Image IPB

Bureau d'études dessin.
Spécialiste Escaliers
Développement - Formation

./__\.
(.°=°.)
0

#9 L'utilisateur est hors-ligne   cyrkan 

  • Advanced Member
  • PipPipPip
  • Groupe : Membres
  • Messages : 48
  • Inscrit(e) : 20-mars 08

Posté 05 juillet 2008 - 10:30

Je pense mettre mal exprimer...

Bon comme la dit tramber effectivement il y avait un problème avec un stringlist en trop!

Maintenant quand je charge la boite j'ai bien la combobox qui apparait et quand je clique dessus je n'est pas un bug.... mais la liste déroulante n'apparait pas!!!!

En faite ce que je souhaite faire, c'est créer en amont de la combobox une liste qui pourra être utilisé dans un vingtaine de combobox différent grâce a un appel au moment de désigné la liste.

En regardant l'aide j'ai penser que ce qui suis permet de créer le liste en amont:

;préparation des listes des combobox

(defun Getlistedesfiltres (/ listedesfiltres)

  (vl-load-com)

  (vlax-for item (vla-get-blocks (vla-get-activedocument(vlax-get-acad-object)))

    (if (and (not (wcmatch (vla-get-name item) "*EU_*"))

	     (not (wcmatch (vla-get-name item) "*EP_*"))

	     (not (wcmatch (vla-get-name item) "*ELEC_*"))

	     )

      (setq listedesfiltres (cons (vla-get-name item) listedesfiltres))

      )

    )

  ) 


Et enfin en lançant la combobox avec l'appel:

;combobox type

(defun c:Projet_Form1_ComboBox1_OnDropDown ( / listedesfiltres)

  (dcl_ComboBox_AddList Projet_Form1_ComboBox1 (Getlistedesfiltres))

) 


Précision, les noms sont générer automatiquement par le logiciel, je ferais une version allégé quand déjà la première version de ma boite marchera (ce qui serais déjà pas si mal!!! :cool: )
Quand a la boite de dialogue et à la combobox elle se charge avant dans le code.
0

#10 L'utilisateur est hors-ligne   stephan35 

  • ceinture noire
  • Groupe : Membres
  • Messages : 351
  • Inscrit(e) : 22-janvier 07
  • LocationRENNES

Posté 07 juillet 2008 - 08:22

Bonjour,

Petite suggestion .....
Il faut utiliser l'évènement OnInitialize !

 (defun c:MaBoite_OnInitialize ( /)

(dcl_ComboBox_AddList Projet_Form1_ComboBox1 (Getlistedesfiltres))

)



L'évènement DropDown est mal utilisé .... il est appelé lors de la selection basse, hors, il y a paradoxe, car elle n'existe pas, donc ne peut pas se dérouler ... ;)


A+
0

#11 L'utilisateur est hors-ligne   stephan35 

  • ceinture noire
  • Groupe : Membres
  • Messages : 351
  • Inscrit(e) : 22-janvier 07
  • LocationRENNES

Posté 07 juillet 2008 - 08:25

Petit rapel :

L'appellation des objets sous la forme Projet_Form1_ComboBox1 est à éviter ....
 (dcl_ComboBox_AddList "Projet" "Form1" "ComboBox1" (Getlistedesfiltres))


Certe plus lisible, mais j'ai eu des soucis .... c'est vous qui voyez, y en a qu'on essayer ...... ;)
0

#12 L'utilisateur est hors-ligne   cyrkan 

  • Advanced Member
  • PipPipPip
  • Groupe : Membres
  • Messages : 48
  • Inscrit(e) : 20-mars 08

Posté 15 juillet 2008 - 19:02

J'ai donc adapté les deux dernier conseil, j'obtient ceci:

 ;préparation des listes des combobox

(defun Getlistedesfiltres (/ listedesfiltres)

  (vl-load-com)

  (vlax-for item (vla-get-blocks (vla-get-activedocument(vlax-get-acad-object)))

    (if (and (not (wcmatch (vla-get-name item) "*EU_*"))

	     (not (wcmatch (vla-get-name item) "*EP_*"))

	     (not (wcmatch (vla-get-name item) "*ELEC_*"))

	     )

      (setq listedesfiltres (cons (vla-get-name item) listedesfiltres))

      )

    )

  )

  

  

;combobox type

(defun c:Projet_Form1_ComboBox1_OnInitialize ( / listedesfiltres) ;_OnDropDown

  (dcl_ComboBox_AddList "Projet" "Form1" "ComboBox1" (Getlistedesfiltres))

)




Problème: J'ai ma fenêtre qui apparait, le bouton pour la fermer fonctionne, l'objet combobox apparait aussi, seulement lorsque je clique dessus aucune liste n'apparait, alors que devrais apparaitre dans le cas présent, "EU; EP; et ELEC"....

Je comprend pas d'ou peut venir le problème.

Note: quand je clique dessus il n'y a pas de bug, ce ne fait juste rien, comme si il n'y avait pas de liste en faite... est ce que la préparation de mes liste en amont est correct??
0

#13 L'utilisateur est hors-ligne   Tramber 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 8463
  • Inscrit(e) : 29-mars 03
  • LocationStrasbourg

Posté 16 juillet 2008 - 07:29

Rapido :

Pourquoi un "oninitialize" sur le combo ? C'est sur la boite de dialogue entière qu'on doit initialiser.

Une fonction générale pour la boite dans laquelle il y a un oninitialize (de la boite et coché dans l'éditeur) en sous fonction pour l'ensemble des éléments à alimenter.

Ou alors je n'ai pas compris.


(defun c:boite ()


(defun c:Form1_OnInitialize ()

(dcl_ComboBox_AddList "Projet" "Form1" "ComboBox1" (Getlistedesfiltres)))


(defun Form1_blabla()

...)


  (if(not Projet_Form1)	(Odcl_LoadProject "Projet" T)	)

  (setq bFlag t)  (while bFlag    (setq bFlag nil)    (Odcl_Form_Show "Projet" "Form1"))

)


Image IPB

Bureau d'études dessin.
Spécialiste Escaliers
Développement - Formation

./__\.
(.°=°.)
0

#14 L'utilisateur est hors-ligne   stephan35 

  • ceinture noire
  • Groupe : Membres
  • Messages : 351
  • Inscrit(e) : 22-janvier 07
  • LocationRENNES

Posté 16 juillet 2008 - 17:49

Citation

Rapido :

Pourquoi un "oninitialize" sur le combo ? C'est sur la boite de dialogue entière qu'on doit initialiser.
...
Ou alors je n'ai pas compris.


Oui, Bien évidemment !!! ;)

Si Si ! tu as tout compris !

Et cyrkan ???


 (defun c:MaBoite_OnInitialize ( /)

(dcl_ComboBox_AddList "Projet" "Form1" "ComboBox1" (Getlistedesfiltres)))

)

0

#15 L'utilisateur est hors-ligne   cyrkan 

  • Advanced Member
  • PipPipPip
  • Groupe : Membres
  • Messages : 48
  • Inscrit(e) : 20-mars 08

Posté 16 juillet 2008 - 18:37

Oui oui enfin je croit ^^

Ma boite de dialogue est bien initialisé, je ne fait pas apparaitre tout tout le code pour ne pas surchargé (j'ai pleins de commentaire dedans.. mais je croit que je vais tout mettre!!)
Faite attention au ; qui traine partout... (désolé)

"Button1" est un bouton ok qui ferme la boite de dialogue a l'heure actuelle
"Button2" est un bouton qui doit ouvrir (normalement, la il marche pas complètement un fichier d'aide sur un support texte.
Et après viens le sujet qui me préocuppe a l'heure actuelle, la combobox, un trentaine dans le futur.


 ; the following command will ensure the 

; appropriate OpenDCL ARX file is loaded

(command "OPENDCL")



(defun c:Projet ()

   ; call the method to load the projet.odcl file.

   (dcl_Project_Load "projet" T)

   ; call the method to show the projet world dialog box example

   (dcl_Form_Show projet_Form1)

   (princ)

)


(defun c:Projet_Form1_OnInitialize ( /)

     (dcl_Control_SetCaption projet_Form1_Label1 "TRIEUR DE CALQUES")

)



(defun c:Projet_Form1_TextButton1_OnClicked ( /)

      (dcl_Form_Close projet_Form1)

)


(defun c:Projet_Form1_TextButton2_OnClicked ( / shell filename)

;(defun c:test ( / shell filename)

  (vl-load-com)

  (if (setq file (findfile "aideproj.txt"))

(if (setq app

(findfile

;"C:\\Program Files\\Microsoft Office\\Office10\\WINWORD.EXE"

"C:\\Program Files\\Windows NT\\Accessoires\\wordpad.exe"

;"C:\\WINDOWS\\system32\\config\\systemprofile\\Menu Démarrer\\Programmes\\Accessoires\\bloc_notes.exe"

)

)

(startapp app file)

(princ "\nApplication non trouvé")

)

(princ "\nFichier non trouvée")

)

;	(setq filename (findfile "aideproj.doc"))

 ; (if filename

 ;   (progn

 ;     (setq shell

;	     (vla-getinterfaceobject

;;	       (vlax-get-acad-object)

;	       "shell Application"

;	       ))

;      (vlax-invoke-method shell 'Open filename)

 ;     (vlax-release-object shell)

;      )

 ;   (alert "fichier d'aide non trouvé")

    )



;préparation des listes des combobox

(defun Getlistedesfiltres (/ listedesfiltres)

  (vl-load-com)

  (vlax-for item (vla-get-blocks (vla-get-activedocument(vlax-get-acad-object)))

    (if (and (not (wcmatch (vla-get-name item) "*EU_*"))

	     (not (wcmatch (vla-get-name item) "*EP_*"))

	     (not (wcmatch (vla-get-name item) "*ELEC_*"))

	     )

      (setq listedesfiltres (cons (vla-get-name item) listedesfiltres))

      )

    )

  )

  

  

;combobox type

(defun c:Projet_Form1_ComboBox1_OnInitialize ( / listedesfiltres) ;_OnDropDown

  (dcl_ComboBox_AddList "Projet" "Form1" "ComboBox1" (Getlistedesfiltres))

)



0

#16 L'utilisateur est hors-ligne   stephan35 

  • ceinture noire
  • Groupe : Membres
  • Messages : 351
  • Inscrit(e) : 22-janvier 07
  • LocationRENNES

Posté 16 juillet 2008 - 20:35

Citation

Oui oui enfin je croit ^^

Ma boite de dialogue est bien initialisé, je ne fait pas apparaitre tout tout le code pour ne pas surchargé (j'ai pleins de commentaire dedans.. mais je croit que je vais tout mettre!!)
Faite attention au ; qui traine partout... (désolé)

"Button1" est un bouton ok qui ferme la boite de dialogue a l'heure actuelle
"Button2" est un bouton qui doit ouvrir (normalement, la il marche pas complètement un fichier d'aide sur un support texte.
Et après viens le sujet qui me préocuppe a l'heure actuelle, la combobox, un trentaine dans le futur.



C'est quoi la question ?

C'est long à paramétrer ???: OUI !
C'est long à tester ??? : OUI !
On peut faire la même chose en DCL : NON !

;)

PS: Tu te débrouilles bien !
Tramber m'avait filer quelques tuyaux au débuts, après j'ai vécu ma vie ! ;)
J'ai développer une applie complête grace à OpenDCL dans le domaine électrique.
Et ça tient la route !

[Edité le 16/7/2008 par stephan35]
0

#17 L'utilisateur est hors-ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 11291
  • Inscrit(e) : 02-septembre 05

Posté 16 juillet 2008 - 21:14

Salut,

Citation

On peut faire la même chose en DCL : NON !


Je n'utilise pas ODCL, mais je suis intrigué, que fait cette boite de dialogue qu'on ne pourrait pas faire en DCL ?
Peux-tu poster une image et explicatif ?

De mon côté je m'amuse à faire des LISP qui écrivent le fichier DCL dans un répertoire temporaire et le suppriment à la fin.
Outre le fait qu'il n'y ait plus de fichier DCL séparé, ça permet d'ajuster la boite de dialogue suivant les besoins.
Par exemple ici, suivant le nombre de paramètres du bloc dynamique sélectionné et leurs types la boite de dialogue sera différente.
On peut faire la même chose avec ODCL ?

[Edité le 16/7/2008 par (gile)]
Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
Image IPB
0

#18 L'utilisateur est hors-ligne   stephan35 

  • ceinture noire
  • Groupe : Membres
  • Messages : 351
  • Inscrit(e) : 22-janvier 07
  • LocationRENNES

Posté 17 juillet 2008 - 14:29

Citation

Salut,

Je n'utilise pas ODCL, mais je suis intrigué, que fait cette boite de dialogue qu'on ne pourrait pas faire en DCL ?
Peux-tu poster une image et explicatif ?


Bonjour Gile,

En fait OpenDCL gère l'ensemble des controles existants windows(Bontons,images,arbre,liste déroulante, zone graphique, etc.) et sans passer par VBA.

Un alternative interressante pour développer des applications finies.

Free Image Hosting at www.ImageShack.us

QuickPost Quickpost this image to Myspace, Digg, Facebook, and others!
0

#19 L'utilisateur est hors-ligne   cyrkan 

  • Advanced Member
  • PipPipPip
  • Groupe : Membres
  • Messages : 48
  • Inscrit(e) : 20-mars 08

Posté 21 juillet 2008 - 21:35

Je me suis mal exprimé! désolé!

En faite, je disais que jusque à présent, je n'affichait pas tout le code de ma boite de dialogue!
Donc on ne voyait jamais le boite ce faire initialisé!

Je l'est donc mis en entier dans mon poste précédent!

Je confirme que c'est long a paramétrer et long a tester... :cool:
Mais bon la je patauge de plus en plus!

Donc dans mon code, j'initialise bien la boite, et je pense avoir tenus compte des commentaire fait visant a améliorer celui ci afin qu'il fonctionne.

Bref je ne vois plus trop ou peut être le problème!
0

#20 L'utilisateur est hors-ligne   stephan35 

  • ceinture noire
  • Groupe : Membres
  • Messages : 351
  • Inscrit(e) : 22-janvier 07
  • LocationRENNES

Posté 22 juillet 2008 - 16:15

Bonjour cyrkan,

Pas de panique !

Il faut peut-être repartir depuis le début afin de comprendre les processus d'OpenDCL.

Je t'en fait un petit résumé :

Pour qu'OpenDCL fonctionne, il faut tout d'abord charger les ARX .

Charger la boite de dialogue.

Définir toutes les fonctions Lisp.

Verifier dans la configuration de la boite, que les évènements soient bien associés aux lisp (noms correctes).

Ne pas avoir peur d'utiliser les exmples d'évènements ou de fonctions afin d'en vérifier le fonctionnement.

 (defun c:MaBoite_OnInitialize ( /)

     (dcl_MessageBox "To Do: code must be added to event handler\r\nc:MaBoite_OnInitialize" "To do")

(alert "J'initialise ici toutes les fonctions de ma boite")

)


Déclencher l'affichage de la boite.

0

Partager ce sujet :


  • 2 Pages +
  • 1
  • 2
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

1 utilisateur(s) en train de lire ce sujet
0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)