Fenetre à partir de paramètres

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
GeBonet
Messages : 453
Inscription : ven. 29/févr./2008 16:17
Localisation : Belgique

Fenetre à partir de paramètres

Message par GeBonet »

Bonjour,

Voici des généralités utiles réunies dans un code fonctionnel... (Ébauche d'une fiche de saisie)
Le principal c'est la fenêtre qui est crée à partir de Data... L'utilisation de Tables de paramètres.
Aussi pour obtenir les réponses...
Le déplacement dans la fenêtre se fait en plus du ou [TAB] par [ENTER] aussi et les Flèches Haut/Bas.
etc... L'objet se trouve dans le code même... A lire !

Code : Tout sélectionner

; ================================================== 
; Saisie dans fenêtre à partir de paramètres                        10/02/2010  |
;                                                                               |
; La fenêtre 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 tableaux 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 entête de la fenêtre...                                
;           IniX ,IniY                     : Position X,Y du coin supérieur gauche                           
;           progParametreFichier.s() : Tableau des paramètres d'en présentation de la fiche à saisir    
;           progReponse()              : Tableau des données récolté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 exigences 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érêt 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'où !!! 
  ;                   ;
  ;                   ;   LA RÈGLE :    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'à 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) 
; =========================================================================
; - Début 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 = > Libellé 
;                            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 fenêtre                               
  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 PARAMÈTRES 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 saisies 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       ; Flèche Haut 
      If Rp$="40" And J<Nombre:Continue:EndIf      ; Flèche 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 ()                   ; Sélectionne 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
; Adaptée de Nico... 
; ---------------------------------------------------------------------------------------------
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: ;{ Pas utilisé ici mais permet de contrôler au caractère près les entrées... 
  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 ;}
; *******************************************************************************
Voilà, voilà.... Si ça peut servir :wink:
A++
Windows 7 et Windows 8.1 Pb 5.0 jusque 5.24 Lts 64 et 5.3 (64)/b]
“Ceux qui rêvent éveillés ont conscience de mille choses qui échappent à ceux qui ne rêvent qu’endormis.”
-Edgar Allan Poe-