cyrkan Posté(e) le 3 juin 2008 Posté(e) le 3 juin 2008 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 comboboxJ'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.
Tramber Posté(e) le 4 juin 2008 Posté(e) le 4 juin 2008 (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 Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
stephan35 Posté(e) le 4 juin 2008 Posté(e) le 4 juin 2008 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.odclBoite : Form1Combo : 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+
Tramber Posté(e) le 4 juin 2008 Posté(e) le 4 juin 2008 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 ! Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
stephan35 Posté(e) le 4 juin 2008 Posté(e) le 4 juin 2008 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+
Tramber Posté(e) le 5 juin 2008 Posté(e) le 5 juin 2008 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. Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
stephan35 Posté(e) le 5 juin 2008 Posté(e) le 5 juin 2008 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:
Tramber Posté(e) le 5 juin 2008 Posté(e) le 5 juin 2008 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. Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
cyrkan Posté(e) le 5 juillet 2008 Auteur Posté(e) le 5 juillet 2008 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.
stephan35 Posté(e) le 7 juillet 2008 Posté(e) le 7 juillet 2008 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+
stephan35 Posté(e) le 7 juillet 2008 Posté(e) le 7 juillet 2008 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 ...... ;)
cyrkan Posté(e) le 15 juillet 2008 Auteur Posté(e) le 15 juillet 2008 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??
Tramber Posté(e) le 16 juillet 2008 Posté(e) le 16 juillet 2008 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")) ) Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
stephan35 Posté(e) le 16 juillet 2008 Posté(e) le 16 juillet 2008 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))) )
cyrkan Posté(e) le 16 juillet 2008 Auteur Posté(e) le 16 juillet 2008 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)) )
stephan35 Posté(e) le 16 juillet 2008 Posté(e) le 16 juillet 2008 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]
(gile) Posté(e) le 16 juillet 2008 Posté(e) le 16 juillet 2008 Salut, 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 - GitHub Développements sur mesure pour AutoCAD
stephan35 Posté(e) le 17 juillet 2008 Posté(e) le 17 juillet 2008 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. http://img122.imageshack.us/img122/46/modulebornierjn1.th.jpg http://imageshack.us/img/butansn.png Quickpost this image to Myspace, Digg, Facebook, and others!
cyrkan Posté(e) le 21 juillet 2008 Auteur Posté(e) le 21 juillet 2008 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!
stephan35 Posté(e) le 22 juillet 2008 Posté(e) le 22 juillet 2008 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.
stephan35 Posté(e) le 22 juillet 2008 Posté(e) le 22 juillet 2008 Ok , Essaye ça : ; the following command will ensure the ; appropriate OpenDCL ARX file is loaded (command "OPENDCL") (defun c:projet (/) (defun c:projet_Form1_OnInitialize ( /) ;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)) ) ) ) (defun c:projet_Form1_TextButton1_OnClicked ( /) (dcl_Form_Close "projet""Form1") ) (defun c:projet_Form1_TextButton2_OnClicked ( / shell filename) (vl-load-com) (if (setq file (findfile "aideproj.txt")) (if (setq app (findfile "C:\\Program Files\\Windows NT\\Accessoires\\wordpad.exe" ) ) (startapp app file) (princ "\nApplication non trouvé") ) (princ "\nFichier non trouvée") ) ) (dcl_Control_SetCaption "projet""Form1""Label1" "TRIEUR DE CALQUES") (dcl_ComboBox_AddList "Projet" "Form1" "ComboBox1" (Getlistedesfiltres)) ) (dcl_Project_Load "projet" T) (dcl_Form_Show "projet""Form1") (princ) ) [Edité le 22/7/2008 par stephan35] [Edité le 22/7/2008 par stephan35]
cyrkan Posté(e) le 25 juillet 2008 Auteur Posté(e) le 25 juillet 2008 Merci pour la version éppuré et modifié...Mais bon malheureusement quand je clique sur la combobox, rien ne ce passe... Mais merci quand même de te creuser la tête pour moi! (Je pars en vacance deux semaine, je n'aurais pas de connexion internet!Mais je vais continuer a chercher et voir si le problème ne viendrais pas d'une erreur de ma pars lors de la fabrication de la boite de dialogue sur opendcl... (ce qui ne serais pas forcément impossible! :P )
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant