Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Des EDIT masqués paramétrables Jeu 14 Nov 2013 - 2:32 | |
| Basé sur mon code pour des EDIT filtrés paramétrables, j'ai fait une version qui permet d'imposer des maques de saisie sur un EDIT. Quelques exemples simples: une date en format jj/mm/aaa, un numéro de sécurité sociale etc. J'ai donc ajouté une sub xEditMask à KGF_OBJ.bas. Le principe, c'est de donner une chaîne de caractères représentant un masque de saisie, et optionnellement une chaîne de caractères donnant un jeu de caractères choisi par l'utilisateur. Plusieurs règles s'appliquent alors, pour le contrôle de la saisie: 1. on ne peut saisir qu maximum que le nombre de caractères contenus dans le masque. Tout caractère saisi au-delà sera écarté. 2. chaque position d'un caractère saisi doit corrspondre au contenu du masque appliqué. 3. le masque contient des caractères spéciaux déterminant le jeu de caractères autorisé à chaque position. Ceux-ci sont: ' 9 = chiffre 0...9 ' A = lettre majuscule ou espace ' a = lettre minuscule ou espace ' $ = lettre minuscule ou majuscule ou espace ' X = code hexadécimal en majuscules ' x = code hexadécimal en minuscules ' * = tout caractère ' U = contenu du paramètre userset 4. tout caractère du masque autre que les caractères spéciaux doivent être saisis tels quels, à leur position respective Le caractère spécial * permet en particulier de faire un EDIT limité à une longueur maximale, sans autres limitations. Je pense qu'avec xEditFilter et xEditMask, j'ai apporté une nouvelle fonctionnalité vraiment intéressante à Panoramic. Pensez qu'il suffit maintenant d'une seule ligne de code pour définir un champ EDIT qui impose la saisie d'une date en format correct. I n'y a plus qu'à contrôler la valeur de la date, mais plus son format ! Et le tout 100 Panoramic, sans DLL ! Et voici une petite démo, évidemment non exhaustive: - Code:
-
' KGF_OBJ.bas
' Ce fichier implémente la création normalisée d'objets visuels. ' Il n'y a rien d'autre à insérer dans le programme.
' ############# ici, le #INCLUDE KGF_OBJ.bas contenant tout ce qui suit ######### ' =============================================================================== ' interface de procédures autour de KGF.dll ' Auteur: Klaus ' ' Objets géré: ' alpha edit button combo container container_option ' memo list check image scene2d scene3d
' =============== dipatching des fonctions ==================================== message "KGF: on ne peut pas executer ce module directement !" terminate
' paramètres: (top,left,width,height,caption) sub xContainer(t%,l%,w%,h%,c$) if variable("no%")=0 then dim no% no% = no% + 1 : container no% top no%,t% : left no%,l% : width no%,w% : height no%,h% caption no%,c$ end_sub
' paramètres: (top,left,width,height,parent,caption) sub xContainer_Option(t%,l%,w%,h%,p%,c$) if variable("no%")=0 then dim no% no% = no% + 1 : container_option no% top no%,t% : left no%,l% : width no%,w% : height no%,h% caption no%,c$ if p%>0 then parent no%,p% end_sub
' paramètres: (top,left,parent,fontsize,caption) sub xAlpha(t%,l%,p%,s%,s$) if variable("no%")=0 then dim no% no% = no% + 1 : alpha no% : caption no%,s$ font_size no%,s% top no%,t% : left no%,l% if p%>0 then parent no%,p% end_sub
' paramètres: (top,left,width,parent,inactive) sub xEdit(t%,l%,w%,p%,a%) if variable("no%")=0 then dim no% no% = no% + 1 : edit no% top no%,t% : left no%,l% : width no%,w% if p%>0 then parent no%,p% if a%=1 then inactive no% end_sub
' paramètres: (top,left,width,parent,inactive,mask,userset) ' mask est un masque de saisie ' userset est un jeu de caractères donné par l'utilisateur. ' Les caractères suivants représentent des jeux de caractères spéciaux: ' 9 = chiffre 0...9 ' A = lettre majuscule ou espace ' a = lettre minuscule ou espace ' $ = lettre minuscule ou majuscule ou espace ' X = code hexadécimal en majuscules ' x = code hexadécimal en minuscules ' * = tout caractère ' U = contenu du paramètre userset ' tous les autres caractères sont imposés tels quels à leur place ' Exemples: ' numéro de sécurité sociale: 9.99.99.999.999.99 ' Nom propre: A$$$$$$$ ' Numéro de téléphone: 09U99U99U99U99 avec userset = " ." sub xEditMask(t%,l%,w%,p%,a%,m$,u$) if m$<>"" : ' au premier appel, création de tout ce qu'il faut if variable("mask_list%")=0 dim mask_list%(3), mask_temp$, mask_n% dim mask_c$, mask_ci%, mask_set$ dim mask_i%, mask_m$, mask_s$ dim mask_codes$ : mask_codes$ = "9Aa$Xx*U" dim mask_masks$(7) mask_masks$(1) = "01234567890" mask_masks$(2) = "ABCDEFGHIJKLMNOPQRSTUVWXYZ " mask_masks$(3) = "abcdefghijklmnopqrstuvwxyz " mask_masks$(4) = mask_masks$(2) + mask_masks$(3) mask_masks$(5) = mask_masks$(1) + "ABCDEF" mask_masks$(6) = mask_masks$(1) + "abcdef" mask_masks$(7) = u$ no% = no% + 1 : dlist no% : mask_list%(1) = no% : ' liste des numéros d'objet no% = no% + 1 : dlist no% : mask_list%(2) = no% : ' liste des masques no% = no% + 1 : dlist no% : mask_list%(3) = no% : ' liste des valeurs anciennes end_if if label("mask_change")=0 then label mask_change, mask_change_1 end_if : ' ici, on a fini de créer tout ce qu'il faut if variable("no%")=0 then dim no% no% = no% + 1 : edit no% top no%,t% : left no%,l% : width no%,w% : ' créer l'objet Panoramic if p%>0 then parent no%,p% : ' autre parent que form 0 ? if a%=1 then inactive no% : ' le EDIT doit être inactif au début ? if m$<>"" : ' si un filtre est demandé, alors on_change no%,mask_change : ' on utilise l'évènement On_CHANGE item_add mask_list%(1),str$(no%) : ' on ajoute le numéro d'objet dans une 1ère liste item_add mask_list%(2),m$ : ' on ajoute le filtre dans une 2ème liste item_add mask_list%(3),"" end_if : ' fin du traitement du filtre end_sub mask_change: : ' évènement ON_CHANGE sur EDITs maskqués mask_temp$ = str$(number_change) : ' prendre le numéro de l'objet for mask_n%=1 to count(mask_list%(1)) : ' chercher cet objet dans la liste ' mask_s$ = item_read$(mask_list%(1),mask_n%) if mask_temp$=mask_s$ then exit_for : ' est-ce que l'objet est trouvé ? next mask_n% : ' fin de recherche mask_temp$ = text$(number_change) : ' prendre le texte du EDIT if mask_temp$="" : ' si le EDIT est vide: item_delete mask_list%(3),mask_n% : ' alors vider la ligne de la 3ème liste item_insert mask_list%(3),mask_n%,"" return : ' on a fini end_if mask_s$ = item_read$(mask_list%(2),mask_n%) : ' prendre le masque for mask_i%=1 to len(mask_temp$) : ' pour tous les caractères du EDIT: if mask_i%>len(mask_s$) mask_s$ = item_read$(mask_list%(3),mask_n%) : ' alors reprendre l'état précédent off_change number_change : ' désactiver ON_CHANGE text number_change,item_read$(mask_list%(3),mask_n%) : ' remplacer le contenu de l'EDIT caret_position number_change,mask_i%-1 : ' restaurer la position du curseur on_change number_change,mask_change : ' réactiver le ON_CHANGE return end_if mask_c$ = mid$(mask_s$,mask_i%,1) : ' prendre le caractère du masque if instr(mask_codes$,mask_c$)=0 if mid$(mask_temp$,mask_i%,1)<>mask_c$ : ' pas le bon caractère imposé ? mask_s$ = item_read$(mask_list%(3),mask_n%) : ' alors reprendre l'état précédent off_change number_change : ' désactiver ON_CHANGE text number_change,item_read$(mask_list%(3),mask_n%) : ' remplacer le contenu de l'EDIT caret_position number_change,mask_i%-1 : ' restaurer la position du curseur on_change number_change,mask_change : ' réactiver le ON_CHANGE return end_if goto mask_change_1 end_if if mask_c$<>"*" mask_set$ = mask_masks$(instr(mask_codes$,mask_c$)) : ' prendre le bon jeu de caractères if instr(mask_set$,mid$(mask_temp$,mask_i%,1))=0 : ' est-ce que le car n'est pas dans le jeu ? mask_s$ = item_read$(mask_list%(3),mask_n%) : ' alors reprendre l'état précédent off_change number_change : ' désactiver ON_CHANGE text number_change,item_read$(mask_list%(3),mask_n%) : ' remplacer le contenu de l'EDIT caret_position number_change,mask_i%-1 : ' restaurer la position du curseur on_change number_change,mask_change : ' réactiver le ON_CHANGE return end_if end_if mask_change_1: next mask_i% : ' fin de la boucle sur le contenu de l'EDIT item_delete mask_list%(3),mask_n% : ' ici, tous les caractères sont valides, item_insert mask_list%(3),mask_n%,mask_temp$ : ' donc on sauvegarde le contenu de l'EDIT return : ' ouf !
' paramètres: (top,left,width,parent,inactive,filtre) sub xEditFilter(t%,l%,w%,p%,a%,f$) if f$<>"" : ' au premier appel, création de tout ce qu'il faut if variable("filter_list%")=0 dim filter_list%(3), filter_temp$, filter_n% dim filter_i%, filter_f$, filter_s$ no% = no% + 1 : dlist no% : filter_list%(1) = no% : ' liste des numéros d'objet no% = no% + 1 : dlist no% : filter_list%(2) = no% : ' liste des filtres no% = no% + 1 : dlist no% : filter_list%(3) = no% : ' liste des valeurs anciennes end_if if label("filter_change")=0 then label filter_change end_if : ' ici, on a fini de créer tout ce qu'il faut if variable("no%")=0 then dim no% no% = no% + 1 : edit no% top no%,t% : left no%,l% : width no%,w% : ' créer l'objet Panoramic if p%>0 then parent no%,p% : ' autre parent que form 0 ? if a%=1 then inactive no% : ' le EDIT doit être inactif au début ? if f$<>"" : ' si un filtre est demandé, alors on_change no%,filter_change : ' on utilise l'évènement On_CHANGE item_add filter_list%(1),str$(no%) : ' on ajoute le numéro d'objet dans une 1ère liste item_add filter_list%(2),f$ : ' on ajoute le filtre dans une 2ème liste item_add filter_list%(3),"" end_if : ' fin du traitement du filtre end_sub filter_change: : ' évènement ON_CHANGE sur EDITs filtrés filter_temp$ = str$(number_change) : ' prendre le numéro de l'objet for filter_n%=1 to count(filter_list%(1)) : ' chercher cet objet dans la liste ' filter_s$ = item_read$(filter_list%(1),filter_n%) if filter_temp$=filter_s$ then exit_for : ' est-ce que l'objet est trouvé ? next filter_n% : ' fin de recherche filter_temp$ = trim$(text$(number_change)) : ' prendre le texte du EDIT if filter_temp$="" : ' si le EDIT est vide: item_delete filter_list%(3),filter_n% : ' alors vider la ligne de la 3ème liste item_insert filter_list%(3),"" return : ' on a fini end_if filter_s$ = item_read$(filter_list%(2),filter_n%) : ' prendre le filtre for filter_i%=1 to len(filter_temp$) : ' pour tous les caractères du EDIT: if instr(filter_s$,mid$(filter_temp$,filter_i%,1))=0 : ' est-ce que le car n'est pas dans le filtre ? filter_s$ = item_read$(filter_list%(3),filter_n%) : ' alors reprendre l'état précédent off_change number_change : ' désactiver ON_CHANGE text number_change,item_read$(filter_list%(3),filter_n%) : ' remplacer le contenu de l'EDIT caret_position number_change,filter_i%-1 : ' restaurer la position du curseur on_change number_change,filter_change : ' réactiver le ON_CHANGE return : ' et sortir end_if next filter_i% : ' fin de la boucle sur le contenu de l'EDIT item_delete filter_list%(3),filter_n% : ' ici, tous les caractères sont valides, item_insert filter_list%(3),filter_n%,filter_temp$ : ' donc on sauvegarde le contenu de l'EDIT return : ' ouf !
' paramètres: (top,left,width,parent,caption) sub xButton(t%,l%,w%,p%,c$) if variable("no%")=0 then dim no% no% = no% + 1 : button no% top no%,t% : left no%,l% : width no%,w% if p%>0 then parent no%,p% caption no%,c$ end_sub
' paramètres: (top,left,width,parent,caption) sub xOption(t%,l%,w%,p%,c$) if variable("no%")=0 then dim no% no% = no% + 1 : option no% top no%,t% : left no%,l% : width no%,w% if p%>0 then parent no%,p% caption no%,c$ end_sub
' paramètres: (top,left,parent) sub xCombo(t%,l%,p%) if variable("no%")=0 then dim no% no% = no% + 1 : combo no% top no%,t% : left no%,l% if p%>0 then parent no%,p% end_sub
' paramètres: (top,left,width,height,parent,bar_horizontal,bar_vertical) sub xMemo(t%,l%,w%,h%,p%,bh%,bv%) if variable("no%")=0 then dim no% no% = no% + 1 : memo no% top no%,t% : left no%,l% : width no%,w% : height no%,h% if p%>0 then parent no%,p% if bh%>0 then bar_horizontal no% if bv%>0 then bar_vertical no% end_sub ' paramètres: (top,left,width,height,parent) sub xList(t%,l%,w%,h%,p%) if variable("no%")=0 then dim no% no% = no% + 1 : list no% top no%,t% : left no%,l% : width no%,w% : height no%,h% if p%>0 then parent no%,p% end_sub
' paramètres: (top,left,width,parent,caption) sub xCheck(t%,l%,w%,p%,c$) if variable("no%")=0 then dim no% no% = no% + 1 : option no% top no%,t% : left no%,l% : width no%,w% if p%>0 then parent no%,p% caption no%,c$ end_sub
sub xPicture(t%,l%,w%,h%,p%) if variable("no%")=0 then dim no% no% = no% + 1 : picture no% top no%,t% : left no%,l% : width no%,w% if p%>0 then parent no%,p% end_sub
sub xScene2d(t%,l%,w%,h%,p%) if variable("no%")=0 then dim no% no% = no% + 1 : picture no% top no%,t% : left no%,l% : width no%,w% if p%>0 then parent no%,p% end_sub
sub xScene3d(t%,l%,w%,h%,p%) if variable("no%")=0 then dim no% no% = no% + 1 : picture no% top no%,t% : left no%,l% : width no%,w% if p%>0 then parent no%,p% end_sub
sub xSub_Menu(p%,c$) no% = no% + 1 : sub_menu no% parent no%,p% caption no%,c$ end_sub
| |
|