1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360
| ; ===============================================================================
; Saisie dans fenetre à partir de paramètres 10/02/2010 |
; |
; La fenetre se forme en fonction Par GeBonet |
; ==============================================================================================
;{ Le BUT ici est de disposer d'un moyen d'appeler une fenêtre qui se dimensionne SEULE en
; fonction du nombre d'éléments demandé (ICI de taleaux contenants un nombre variable d'élément).
; Et évidement qui renvois les réponses correspondantes aux points envoyées.
;
; Pour lequel on donne : Un titre, une position d'affichage (x,y) la table de question, la table pour les réponse
; pour les réponses et le nombre de point à montrer et à remplir....
; SOIT comme ci-après :
;
; Rp$ : Caractères de contrôle transmit par la procédure de saisie....
; NomEntete$ : Titre ou entete de la fenetre...
; IniX ,IniY : Position X,Y du coin supérieur gauche
; progParametreFichier.s() : Tableau des paramètres d'e présentation de la fiche à saisir
; progReponse() : Tableau des données recoltés dans la présentation ci-dessus
; Appel : Nombre de champ à saisir (Appel =< Nombre Maximum du tableau )
;
; Cas=PointFenetre(NomEntete$, IniX ,IniY, progParametreFichier.s() , progReponse() , Appel)
;
; ------------------------------------------------------------------------------------------------------------
; On pourrait y ajouter des exigeances comme demander la couleur de fond, des caractères, la police ou encore
; le type à saisir (Alpha ou Numérique, voir réponse visible ou non (mots de passe)...
; ==============================================================================================================
; Mais l'intéret EST AUSSI de montrer l'aspect dynamique des affectations de Gadget !!!
; --------------------------------------------------------------
;} Et de l'utilisation exclusive d'instructions PureBasic...
;==============================================================================================================
Enumeration ;{
#Fenetre_Champ ; Constante de la fenêtre qui sera utilisé.
#Fenetre_Statut ; Constante de la fenêtre qui sera utilisé.
#DebutChamps ; Constante de Base pour le 1er Gadget d'affichage de la table des questions.
; CETTE CONSTANTE SERVIRA de BASE d'incrémentation pour fournir
; le n° unique des questions suivantes s'il y a lieu.
;
#Fichier=10 ; N° du premier Fichier
;
#AutrePoint=50 ; Constante de départ d'un AUTRE POINT de constante dynamique !!!
; ***************************************************************************************
;#bouton_valide ; Ne serons pas utilisée comme tels car comme les gadgets suivants seront affectés
;#bouton_annule ; dynamiquement ils risquent alors de prendre une valeur de constante existante et
; ; donc de ne pas être affichée... d'ou !!!
; ;
; ; LA REGLE : Lorsque l'on attribue des ID de gadget dynamiquement ils doivent
; ; commencer à un point connu (ici "#DebutChamps") puis rester sous contrôle du
; ; programme jusqu'a l'autre Constante identifié qui servirait de départ d'un autre point.
; ; Comme par exemple ICI : "#AutrePoint"
; ; -----------------------------------------------------------------------------------------------------------------
#bouton_valide =70 ; Ou alors une Affectation qui dans ce cas ci ne risque pas d'entrer en contact d'autres...
#bouton_annule=71 ; Idem ...
#AideSaisie=99
;
EndEnumeration ;} Les problèmes sont souvent issus de détails... Ou de manque d'info claire !!!
; --------------------------------------------------------------------------------------------------------------
Define Nombre.i, IniX.i, IniY.i, Appel, Longueur.l, gadget.l
Nombre=13 ; Nombre d'éléments MAXIMUM du tableau des données pouvant-être saisie...
NbParametre=2 ; Nombre de paramètres par point de saisie... (NbParametre+1)
Dim progParametreFichier.s(Nombre,3) ; Table Texte des Questions=0, Type de saisie=1, Longueur de la saisie=2...
Dim progReponse.s(Nombre) ; Table des Réponses correspondante
Dim progParametreAffichage.i(Nombre,3) ; Table d'affichage des données X,Y, CouleurFond,CouleurText
;
Global Nume$="0123456789.", Alpha$, Control$
Gosub DefinitionClavier ; Alpha$, Control$ SI on désire controler au caractère près !
; --------------------------------------------------------------------------------------------------------------
Declare.s SaisieChaine(Longueur, Gadget) ; Saisie d'une chaine contrôlé...
Declare PointFenetre(NomEntete$, IniX , IniY , Array progParametreFichier.s(2) , Array progReponse.s(1) ,Nombre)
Declare OuvreEtRange(Array progParametreFichier.s(2) , Array progReponse.s(1) ,Nombre)
; =============================================================================================================
; - Debut Programme ou d'endroit ou sera traité le Tableau Text(i) et recevoir les réponses progReponse(i) >-
;{=============================================================================================================
; ; ------------ Question ? ----------- < On pourrait aussi avec d'autres dimensions... > -----------
; DIM progParametreFichier(NbrPOINT,ParaPOINT)
; NbrPOINT= Taille Table, ParaPOINT= 0 = > Libélé
; ParaPOINT= 1 = > Type de donnée
; ParaPOINT= 2 = > Longueur du champs
; ParaPOINT= 3 = > Formule ??? etc...
;
; ******* Ensemble de paramètre qui pourraient être chargé à partir d'un fichier séquentiel........ ************
;
NomEntete$="Identification" ; Titre de la fenetre
IniX=400:IniY=200 ; Position sur l'écran
Appel=13:Cas=0 ; Nombre d'élément du tableau à utiliser...
IniY=Appel*20 ; Nombre de champs
;}
;{ Paramétrage des Tables....
If Appel>Nombre:Appel=Nombre:EndIf ; Je m'auto-contrôle ne peut-être plus grand que le nombre d'éléments du tableau :-))
; ---------------------------------------------------------------
Restore Champs ; Ici la lecture pourrait se faire à partir d'un fichier....
For i=0 To Nombre-1
For j=0 To NbParametre
Read.s progParametreFichier(i,j)
Ligne$+progParametreFichier(i,j)+" : "
Next j
Debug Str(i+1)+" > "+Ligne$:ligne$=""
Next i
DataSection
Champs: ; Libellé , Type , longueur du champs à afficher
Data.s "Nom prenom" , "0" ,"30"
Data.s "Adresse +N°" , "0" ,"35"
Data.s "Code Postal" , "1" ,"8"
Data.s "Localitée " , "0" ,"30"
Data.s "Pays" , "0" ,"30"
Data.s "Telephone" , "0" ,"16"
Data.s "Adresse Email", "4" ,"40"
Data.s "Entree Mensuel","2" ,"8"
Data.s "Sortie Mensuel","2" ,"8"
Data.s "Solde Mensuel" ,"2" ,"8"
Data.s "Entree Annuel" ,"2" ,"8"
Data.s "Sortie Annuel" ,"2" ,"8"
Data.s "Solde Annuel" ,"2" ,"8"
Data.s "10(-)11"
EndDataSection
; ---------------------------------------------------------------------------------------------------------------
For i=0 To Nombre:progReponse(i) = "":Next i ; Mise à zéro de la table des réponses..
;} ---------------------------------------------------------------------------------------------------------------
; ON VA CREER UNE FENETRE DE SAISIE SELON LES PARAMETRES CI-DESSUS
;{ ---------------------------------------------------------------------------------------------------------------
Repeat
; ICI APPEL
Cas=PointFenetre(NomEntete$, IniX ,IniY, progParametreFichier.s() , progReponse() , Appel) ; Appel de la procèdure....
;
Espace$="":;Debug "Retour Procedure : "+Str(Cas)
; -----------------------
; Exposé des résultats ---
; ------------------------
For i=0 To Nombre
progLongueur=Val(progParametreFichier(i,2))
Espace$+Left(progParametreFichier(i,0)+Space(progLongueur),progLongueur)
;Debug progParametreFichier(i,0)+" : "+progParametreFichier(i,1)+" : "+progParametreFichier(i,2)+" =>"+progReponse(i)
Next i ; Affichage des données saises en fonction de "Appel"
;
;Debug "Ligne de Titres : "
;Debug Espace$
If Cas<>99:For i=0 To Nombre:progReponse(i) = "":Next i :EndIf ; Mise à zéro de la table des réponses..
;
Until Cas=99 Or Cas=90
; ----------------------------------------------------------------------------------------------------------------
; A partir d'ici ou ceci progReponse(n) peut être utilisée pour être classé dans liste chainée
; ou un Tableau deux dimensions type Table_Adresse(i,n) les progReponse(n) sont les lignes
; de Table_Adresse(i,n)...
; -----------------------------------------------------------------------------------------------------------------
;
If Cas<>90 ;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
; La suite ==> enregistrement dans fichier... du : contenu Nombre de progReponse(i)
; ou autre traitement des données de "progReponse(i)"
;
EndIf ;} ;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;
End
; *************************************************************************************************************
; >>>>>>>>>> Fenêtre Commune de question <<<<<<<<<<
; *************************************************************************************************************
Procedure PointFenetre(Titre$, IniX , IniY , Array progParametreFichier.s(2) , Array progReponse.s(1) ,Nombre)
;
Taille=ArraySize(progParametreFichier())
For i=0 To Nombre ; Recherche du champs le plus long
If Lmax<Len(progParametreFichier(i,0)):Lmax=Len(progParametreFichier(i,0)):EndIf
If Lmax2<Val(progParametreFichier(i,2)):Lmax2=Val(progParametreFichier(i,2)):EndIf
Next i
; ----------------------------- Calcul des dimensions -----------------------------------------------
HauteurBouton = 20
Largeur_fenetre = (160+Lmax+Lmax2)*2+20 ; Largeur de la fenêtre tenant compte des longueur des champs
Hauteur_Fenetre = Nombre*30+HauteurBouton+70 ; Hauteur de la fenêtre (50 = 30 titre + 20 interligne avant boutons ! )
PosYBouton = Hauteur_Fenetre-30 ; Position Y des boutons
; ---------------------------------------------------------------------------------------------------
; Fenetre d'interrogation multibox .........
; ---------------------------------------------------------------------------------------------------
WindWid = Largeur_fenetre : WindHigh = Hauteur_Fenetre : Cas = 0
#WinOption = #PB_Window_SystemMenu;| #PB_Window_SizeGadget;|#PB_Window_MaximizeGadget
;
If OpenWindow(#Fenetre_Champ,IniX,IniY,WindWid,WindHigh+20,Titre$,#WinOption);#PB_Window_BorderLess
;
SetWindowColor(#Fenetre_Champ,$0AFAF5) ; Colorier la fenêtre
StickyWindow(#Fenetre_Champ, 1):Lentitre=Len(Titre$)
; Creation de la ligne de statut...
CreateStatusBar(#Fenetre_Statut,WindowID(#Fenetre_Champ))
AddStatusBarField(45)
AddStatusBarField(45)
AddStatusBarField(WindWid-90)
; -----------------------------------------
Milieu=WindWid/2-Lentitre/2 ; Milieu de la Largeur_fenetre
PosYDep=35 ; Position départ
PosY=PosYDep ; Position Y
; ------------------------------------- Titres ------------------------------------------------
TextGadget(#DebutChamps,Milieu-(Lentitre)*6, 5, Milieu+50,25,Titre$) ;
SetGadgetFont(#DebutChamps+j,LoadFont(#DebutChamps+j, "Arial", 18))
SetGadgetColor(#DebutChamps+j,#PB_Gadget_BackColor, $0AFAF5)
SetGadgetColor(#DebutChamps+j,#PB_Gadget_FrontColor, $E25048)
; --------------------------------- Question et champs pour réponses --------------
For j=1 To Nombre ;:TextGadget(7,130,140,100,100,"",$6F666)
Texte$=Trim(progParametreFichier(j-1,0)): LenChamp=Val(progParametreFichier(j-1,2))*6
Debug Str(j)+" >"+Text$+" : "+Str(LenChamp)
TextGadget(#DebutChamps+j,10, PosY+10, Milieu-15,20,Texte$) ; Attention ici les ID sont attribué dynamiquement !
StringGadget(#AutrePoint+j, Milieu-20, PosY+10,LenChamp,20,"") ; Milieu-10 Attention ici les ID sont attribué dynamiquement !
;
SetGadgetFont(#DebutChamps+j,LoadFont(#DebutChamps+j, "Arial", 12))
SetGadgetColor(#DebutChamps+j,#PB_Gadget_BackColor, $0AFAF5)
SetGadgetColor(#DebutChamps+j,#PB_Gadget_FrontColor, $E25048)
PosY+30
Next j
; -----------------------------------------------------------------------------------------------
BoutonVal=#AutrePoint+j ; ICI j'affecte au "Bouton" une ID Dynamique pour l'exemple
BoutonSORTIE=BoutonVal+1
;
ButtonGadget(BoutonVal,10,PosYBouton,100,20,"Valider",#PB_Button_Toggle)
ButtonGadget(#bouton_annule,Largeur_fenetre-120,PosYBouton,100,20,"Annuler",#PB_Button_Toggle)
ButtonGadget(BoutonSORTIE,WindWid/2-50,PosYBouton,100,20,"Sortie",#PB_Button_Toggle)
;
HideGadget(BoutonVal,1) ; cache le bouton Valide
HideGadget(BoutonSORTIE,1) ; cache le bouton Sortie
HideGadget(#bouton_annule,1) ; cache le bouton Annule
;
AideFiche$="<Fleches Haut/Bas> Monte descends, <ESC> Sortie, <ENTER> Champs suivant"
LenAide=Len(AideFiche$)*6:PosG=(WindWid-LenAide);/2
TextGadget(#AideSaisie,PosG,PosYBouton, LenAide+5,20,AideFiche$)
SetGadgetColor(#AideSaisie,#PB_Gadget_BackColor,$0AFAF5) ; Colorier la fenêtre
SetGadgetColor(#AideSaisie,#PB_Gadget_FrontColor, $0C07F3) ;
; -----------------------------------------------------------------------------------------------
; ENCODAGE DES DONNEES
; -----------------------------------------------------------------------------------------------
For j=1 To Nombre ; Récupère les données dans le tableau
;
Gadget=#AutrePoint+j ; String Gadget concerné...
Type=Val(progParametreFichier(j-1,1)) ; Type prédéfinit
Longueur=Val(progParametreFichier(j-1,2)) ; Longueur Prédéfinie
Formule$=progParametreFichier(j-1,3) ; Formule à executer
;
SetActiveGadget(Gadget)
Rp$=SaisieChaine(Longueur,Gadget) ; Appel de la saisie d'un champs.......
;Debug "Sortie = "+Rp$
; Controle selon Rep$
If Rp$="38" And j>1:J-2:Continue:EndIf ; Fleche Haut
If Rp$="40" And J<Nombre:Continue:EndIf ; Fleche Bas
If Rp$="27":Break:EndIf
;If Cas=98:Break:EndIf ; PgUp PgDn
;Debug "Gadget = "+Str(Gadget)
;Debug "---------------------"
;
Next j
; ----------------------------------- Fin de saisie des champs ----------------------------
;
; ------------- Traite la Validation ou l'Annulation de l'ensemble de la fiche ------------
HideGadget(#AideSaisie,1)
HideGadget(BoutonVal,0) ; Montre le bouton Valide
HideGadget(BoutonSORTIE,0) ; cache le bouton Sortie
HideGadget(#bouton_annule,0) ; Montre le bouton Annule
; -----------------------------------------------------------------------------------------
Repeat ;
Select WaitWindowEvent (#Fenetre_Champ) ; Traite les boutons....
Case #PB_Event_Gadget
Select EventGadget () ; Selectionne en fonction de ....???
; ---------------------------------------------------------------------------------
Case BoutonVal ; VALIDE pour MODIF ou AJOUT
For j=1 To Nombre ; Récupère les données dans le tableau
progReponse(j-1)=GetGadgetText (#AutrePoint+j)
Debug progReponse(j-1)
Next j
Cas=99:Break ; Fin de saisie normale Validation
; -------------------------------------------------------------------------------
Case BoutonSORTIE ;
Cas=90:Break ; Sortie demandée....
; -------------------------------------------------------------------------------
Case #bouton_annule ;BoutonAnul ; Annule l'entrée
Cas=10:Break ;
; -------------------------------------------------------------------------------
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
EndIf
StickyWindow(#Fenetre_Champ,0)
CloseWindow (#Fenetre_Champ) ; Fermeture de la fenêtre ajoute...
; ---------------------------------
ProcedureReturn Cas
;
EndProcedure
; --------------------------------------------------------------------------------------------------
; Système de saisie dans un Gadget d'une chaine selon les critères passés
; --------------------------------------------------------------------------------------------------
Procedure.s SaisieChaine(Longueur, Gadget)
SendMessage_(GadgetID(Gadget), #EM_LIMITTEXT, Longueur,Gadget)
Repeat
Event=WaitWindowEvent()
Select Event
Case #WM_KEYDOWN ; F1.....F12
Car$=Chr(EventwParam()):Typ$=Str(EventwParam()) :; Debug "#KEYDOWN: " + Str(EventwParam())+" "+Car$
If Typ$="40" Or Typ$="38" Or Typ$="27":Sort=1:EndIf
Case #WM_KEYUP
;Car$=Chr(EventwParam()) : Debug "#KEYUP: " + Str(EventwParam())+" "+Car$
If Sort=1:ProcedureReturn Typ$:EndIf ; Fleche HAUT ou BAS donc Sort
Case #WM_DEADCHAR
Car$=Chr(EventwParam()) : ;Debug "#DEADCHAR: " + Str(EventwParam())+" "+Car$
Case #WM_SYSCHAR ; Alt + Char
Car$=Chr(EventwParam()) : ;Debug "#SYSCHAR: " + Str(EventwParam())+" "+Car$
Case #WM_SYSKEYDOWN
Car$=Chr(EventwParam())
Debug "#SYSKEYDOWN: " + Str(EventwParam())+" "+Car$
Case #WM_SYSKEYUP
Car$=Chr(EventwParam()) : ;Debug "#SYSKEYUP: " + Str(EventwParam())+" "+Car$
Case #WM_CHAR ; Char & Ctrl + Char
Car$=Chr(EventwParam())
If Car$=Chr(13)
ProcedureReturn Car$ ; ENTER donc Sort
EndIf ; Debug "#CHAR Dans boucle : " + Str(EventwParam())
EndSelect
Chaine$=GetGadgetText(Gadget) ; Chaine déjà saisie dans ce Gadget
; Affiche dans la barre d'état...
x=DesktopMouseX() : y= DesktopMouseY()
StatusBarText(#Fenetre_Statut,0,"X: "+Str(x))
StatusBarText(#Fenetre_Statut,1,"Y: "+Str(y))
StatusBarText(#Fenetre_Statut,2,Chaine$)
ForEver
EndProcedure
; *************************************************************************************************************
Procedure OuvreEtRange(Array progParametreFichier.s(2) , Array progReponse.s(1) ,Nombre)
;
; CreateFile(#Fichier, NomFichier$) ATTENTION création si existe.. Perdu !!!
; OpenFile(#Fichier, NomFichier$)
;
;
;
EndProcedure
; -------------------------------------------------------------------------------------------------------------
; Définition des Caractères Controlé Permits ou non !....
; -------------------------------------------------------------------------------------------------------------
DefinitionClavier: ;{
Nume$="0123456789."
For i=32 To 47:Alpha$+Chr(i):Next i
For i=58 To 126:Alpha$+Chr(i):Next i
Alpha$+Chr(128)
For i=188 To 203:Alpha$+Chr(i):Next i
For i=224 To 229:Alpha$+Chr(i):Next i
For i=231 To 246:Alpha$+Chr(i):Next i
For i=249 To 252:Alpha$+Chr(i):Next i
Control$=Chr(13) ; CR 1
Control$+Chr(8) ; BACK 2
Control$+Chr(45) ; INS 3
Control$+Chr(46) ; DEL 4
Control$+Chr(9) ; TAB 5
Control$+Chr(27) ; ESC 6
Control$+Chr(33) ; PgUP 7
Control$+Chr(34) ; PgDn 8
Control$+Chr(36) ; HOME 9
Control$+Chr(35) ; END 10
Control$+Chr(37) ; Fleche G 11
Control$+Chr(38) ; Fleche H 12
Control$+Chr(39) ; Fleche D 13
Control$+Chr(40) ; Fleche B 14
; ; de F1 à F12 (Position 11 à 12)
For i=112 To 123: Control$+Chr(i):Next i
; Touche contrôle seule... exemple de Combiné => toucheCTRL$+"A"... ou autre !
toucheCTRL$=Chr(17) : toucheALT$=Chr(18) : toucheSHIF$=Chr(16) : toucheCAPS$=Chr(20)
Return ;}
; ************************************************************************************************************* |
Partager