Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Rendre la disposition d'une FORM modifiable par utilisateur Ven 3 Fév 2012 - 1:03 | |
| Voici un petit essai de rendre une FORM modifiable par l'utilisateur. On peut prendre cela comme base pour un IDE, pour donner de la souplesse à une application, etc. On peut décider à la création si un objet est déplaçable et/ou ou non. Cet outil peut être intégré dans un programme par 3 lignes de code en début du programme, dont une est un #INCLUDE du module concerné. Cette directive peut également être placée tout à la fin du programme. Elle est entièrement protégée contre toute exécution intempestive, même si on place le #INCLUDE en plein milieu d'un sous-programme, par exemple. Le programme de démo montre un bouton et un mémo déplaçable, et un bouton non déplaçable. Cette option peut être activée ou désactivé, dans cet exemple, par la simple gestion du commentaire devant les deux lignes stratégiques en début du programme (ce sont les lignes 6 et 7 dans ce programme). Si la possibilité est activée, un menu "Edition" avec le sous-menu "Déplacer" apparait, et une ligne "Mode d'emploi" apparaît dans le menu "Aide". Dans la version ci-après, ces deux lignes sont désactivées, et ces éléments n'apparaissent pas. - Code:
-
label labels : gosub labels ' pour utiliser le modificateur: ' placer les trois lignes suivantes AU DEBUT du programme ! ' uniquement pour le modificateur ' label declarer_modificateur : ' à placer au début du programme ' gosub declarer_modificateur : ' à placer au début du programme ' à placer après les deux lignes précédentes OU à la fin du programme ! #INCLUDE "MODIFICATEUR.bas" gosub variables gosub GUI gosub MENU
end
' clic sur un bouton géré par le modificateur fermer: ' *** les lignes suivantes sont spécifiques à l'usage du modificateur if variable("EDI_flag%")=1 if EDI_flag%=0 terminate else gosub identifier end_if return else ' *** fin des lignes spécifiques pour le modificateur ' *** ici, traitement normal de l'application terminate end_if : ' nécessaire pour fermer le IF du modificateur ' clic sur un objet non géré par le modificateur non_gere: message "Cet objet ne peut pas être modifié !' return
' clic sur un mémo géré par le modificateur click_memo: ' *** les lignes suivantes sont spécifiques à l'usage du modificateur if variable("EDI_flag%")=1 if EDI_flag%=0 message "Clic sur le mémo en PRESENCE du modificateur !" else gosub identifier end_if return else ' *** fin des lignes spécifiques pour le modificateur ' *** ici, traitement normal de l'application message "Click sur le mémo en ABSENCE du modificateur !" end_if : ' nécessaire pour fermer le IF du modificateur return labels: label creer_objet_visible label creer_objet_invisible, variables, doc, apropos, click_memo label GUI, MENU, fermer, close_doc, close_apropos, non_gere return
variables: if variable("EDI_flag%")=0 dim no% : ' nécessaire en absence du modificateur ! end_if ' placer ici toutes les variables de l'application dim form_doc%, form_apropos%, s$, nl$ dim temp1% , temp2% ' placer ici toutes les initialisations de variables nl$ = str$(13)+str$(10) return
' création d'un numéro d'objet creer_objet_visible: if variable("EDI_flag%")=1 n_objet% = n_objet% + 1 no% = no% + 1 objets%(no%,0) = no% objets%(no%,1) = 1 else no% = no% + 1 end_if return
' création d'un numéro d'objet creer_objet_invisible: if variable("EDI_flag%")=1 n_objet% = n_objet% + 1 no% = no% + 1 objets%(no%,0) = no% objets%(no%,1) = 0 else no% = no% + 1 end_if return
' créer ici l'interface visuel de l'application ' contraite: utiliser creer_objet_visible pour générer ' un numéro d'objet pour tous les objets "modifiables" ' et creer_objet_invisible pour tous les objets "non- ' "modifiables" GUI: ' objets de la form 0 gosub creer_objet_visible button no% : top no%,10 : left no%,10 caption no%,"Fermer" : on_click no%, fermer gosub creer_objet_invisible button no% : top no%,10 : left no%,200 caption no%,"Non géré" : on_click no%, non_gere gosub creer_objet_visible memo no% : top no%,40 : left no%,50 item_add no%,"mémo géré par le Modificateur" on_click no%, click_memo
' form pour le mode d'emploi if variable("EDI_flag%")=1 gosub creer_objet_invisible form_doc% = no% form no% : hide no% : caption no%, "Mode d'emploi" on_close no%, close_doc top no%,200 : left no%,200 height no%, 500 : width no%,300 gosub creer_objet_invisible memo no% : parent no%,form_doc% top no%,10 : left no%,10 height no%,450 : width no%,280 item_add no%,"Mode d'emploi du Modificateur" item_add no%,"" item_add no%,"Le modificateur permet de changer l'aspect" item_add no%,"de tous les objets créés par creer_objet_visible." item_add no%,"" item_add no%,"Pour l'activer, il faut choisir l'option Edition/Déplacer" item_add no%,"dans le menu de l'application." item_add no%,"" item_add no%,"La fenêtre du modificateur apparaît alors," item_add no%,"avec l'invitation de sélectionner un objet." item_add no%,"Pour cela, il suffit d'un clic gauche sur un objet" item_add no%,"qui a été créé par la routine creer_objet_visible." item_add no%,"" item_add no%,"Une invitation à appliquer les modifications s'affiche alors." item_add no%,"Ces modifications s'effectuent à l'aide des champs et" item_add no%,"boutons de la fenêtre du modificateur. Ces éléments son" item_add no%," inactifs tant qu'un objet approprié n'a pas été choisi." item_add no%,"" item_add no%,"On peut alors déplacer l'objet en utilisant les flèches du" item_add no%,"modificateur. Le pas de déplacements en pixels (défaut=5)" item_add no%,"est spécifié dans le champ à droite. Toute valeur non" item_add no%,"valide dans ce champ restaure le défaut de 5 pixels." item_add no%,"" item_add no%,"On peut aussi changer les dimensions de l'objet, en" item_add no%,"spécifiant les nouvelles valeurs pour hauteur et largeur" item_add no%,"dans les champs respectifs. Ces valeurs seront appliquées" item_add no%,"par le bouton Valider.Toute valeur non valide dans ces" item_add no%,"champs laisse la valeur correspondante inchangée." item_add no%,"" item_add no%,"Note:" item_add no%,"Pour l'heure, uniquement position et dimensions sont gérées." end_if
' form pour la fenêtre A-propos gosub creer_objet_invisible form_apropos% = no% form no% : hide no% : caption no%, "A propos" on_close no%, close_apropos top no%,200 : left no%,200 gosub creer_objet_invisible alpha no% : parent no%, form_apropos% top no%,10 : left no%,10 s$ = "GUI modifiable Version V1.0"+nl$+nl$ s$ = s$ + "Auteur: Klaus"+nl$+nl$ s$ = s$ + "Date: 1/2/2012" caption no%, s$ return
' création des menus de l'application MENU: gosub creer_objet_invisible temp1% = no% main_menu no%
' menu "fichiers" gosub creer_objet_invisible temp2% = no% sub_menu no% : parent no%,temp1% caption no%, "Fichers" gosub creer_objet_invisible sub_menu no% : parent no%,temp2% caption no%, "---------" gosub creer_objet_invisible sub_menu no% : parent no%,temp2% caption no%, "Fermer" : on_click no%, fermer
' intégration automatique du modificateur dans le menu ' menu "édition" if variable("EDI_flag%")=1 gosub creer_objet_invisible temp2% = no% sub_menu no% : parent no%,temp1% caption no%, "Edition" gosub creer_objet_invisible sub_menu no% : parent no%,temp2% caption no%, "Déplacer" : on_click no%, edition end_if
' menu "aide" gosub creer_objet_invisible temp2% = no% sub_menu no% : parent no%,temp1% caption no%, "Aide" if variable("EDI_flag%")=1 gosub creer_objet_invisible sub_menu no% : parent no%,temp2% caption no%, "Mode d'emploi" : on_click no%,doc end_if gosub creer_objet_invisible sub_menu no% : parent no%,temp2% caption no%, "A Propos" : on_click no%,apropos return
' montrer le mode d'emploi doc: inactive 0 show form_doc% return
' fermer le mode d'emploi close_doc: hide form_doc% active 0 to_foreground 0 return
' montrer la fenêtre A-propos apropos: inactive 0 show form_apropos% return
' fermer la fenêtre A-propos close_apropos: hide form_apropos% active 0 to_foreground 0 return Voici le fichier MODIFICATEUR.bas qui doit résider dans le même répertoire que le programme (pour #INCLUDE): - Code:
-
' ===================== section "Moficicateur" ======== ' inclure cette section si l'on veut utiliser le module ' éventuellement par #INCLUDE if 1=0 : ' ne rien faire si on passe ici ! declarer_modificateur: label labels_edit : gosub labels_edit gosub variables_edit form 1 : hide 1 : top 1,30 : left 1,500 on_close 1,close_edit : width 1,300 : height 1,600 alpha 2 : parent 2,1 : top 2,10 : left 2,10 font_size 2,12 : font_bold 2 container 3 : parent 3,1 : top 3,70 : left 3,10 caption 3,"Positionnement" : width 3,200 button 4 : parent 4,3 : top 4,20 : left 4,30 caption 4,"^" : width 4,20 : height 4,20 on_click 4,vers_haut button 5 : parent 5,3 : top 5,40 : left 5,10 caption 5,"<" : width 5,20 : height 5,20 on_click 5,vers_gauche button 6 : parent 6,3 : top 6,40 : left 6,50 caption 6,">" : width 6,20 : height 6,20 on_click 6,vers_droite button 7 : parent 7,3 : top 7,60 : left 7,30 caption 7,"v" : width 7,20 : height 7,20 on_click 7,vers_bas alpha 8 : parent 8,3 : top 8,10 : left 8,100 caption 8,"Valeur du pas:" edit 9 : parent 9,3 : top 9,30 : left 9,125 text 9,"5" : width 9,30 container 10 : parent 10,1 : top 10,180 : left 10,10 caption 10,"Dimensions" : width 10,200 : height 10,120 alpha 11 : parent 11,10 : top 11,20 : left 11,10 caption 11,"Hauteur;" edit 12 : parent 12,10 : top 12,20 : left 12,100 width 12,40 alpha 13 : parent 13,10 : top 13,50 : left 13,10 caption 13,"Largeur;" edit 14 : parent 14,10 : top 14,50 : left 14,100 width 14,40 button 15 : parent 15,10 : top 15,80 : left 15,100 width 15,40 : caption 15,"Valider" on_click 15,changer_dimension return
labels_edit: label identifier, edition, close_edit, variables_edit label vers_haut, vers_gauche, vers_droite, vers_bas label charger_pas, changer_dimension return
variables_edit: dim n_objet%, no%, no_base%, objets%(500,1) dim no_id% , pas% dim nlx$, EDI_flag% , i_edit% n_objet% = 0 no_base% = 100 no% = no_base% nlx$ = chr$(13)+chr$(10) EDI_flag% = 0 return
identifier: no_id% = 0 for i_edit%=no_base%+1 to no% if objets%(i_edit%,1)=1 if clicked(objets%(i_edit%,0))=1 no_id% = i_edit% text 12,height(no_id%) text 14,width(no_id%) to_foreground 1 caption 2,"Modifiez l'objet sélectionné"+nlx$+"avec les boutons" return end_if end_if next i_edit% return
edition: if EDI_flag%=1 message "Vous êtes déjà en mode Edition !" return end_if show 1 EDI_flag% = 1 no_id% = 0 caption 2,"Sélectionnez un objet..." text 12,0 text 14,0 return
close_edit: EDI_flag% = 0 no_id% = 0 hide 1 return
vers_haut: if no_id%=0 then return gosub charger_pas top no_id%, top(no_id%) - pas% return
vers_gauche: if no_id%=0 then return gosub charger_pas left no_id%, left(no_id%) - pas% return
vers_droite: if no_id%=0 then return gosub charger_pas left no_id%, left(no_id%) + pas% return
vers_bas: if no_id%=0 then return gosub charger_pas top no_id%, top(no_id%) + pas% return
charger_pas: if numeric(text$(9))=0 then text 9,"5" pas% = val(text$(9)) return
changer_dimension: if no_id%=0 then return if numeric(text$(12))=0 then text 12,height(no_id%) if numeric(text$(14))=0 then text 12,width(no_id%) height no_id%,val(text$(12)) width no_id%,val(text$(14)) return
end_if : ' fin d'exécution conditionnelle pour modificateur absent
| |
|