Page 1 sur 1

InputRequester Multiligne...

Publié : mar. 13/oct./2009 10:25
par GeBonet
Bonjour,

Un petit code simple et qui peut s'avérer pratique à intégrer dans n'importe quoi...

Comme je l'indique il permet de saisir plusieurs lignes de réponses pour autant de questions
posées. Les directives sont simple et dans les commentaires !

Le Point intéressant c'est l'affectation et le contrôle dynamique des ID des gadgets !
Ou comment se passer de "#PB_Any" quand ce n'est pas indispensable !

Code : Tout sélectionner

; ========================================================== 
;  -       Saisie  dans  "InputRequester MultiLigne"     -    PureBasic Version 4.31 & 4.40
;                                                                                                  28-08-2009
;           OU Fenetre à champs variable...                       ;                                                                                                     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é... Et évidement qui renvois les réponses correspondantes aux points envoyés. 
; 
;   Soit un espèce de "InputRequester" multiple...  
;
;     Pour lequel on donne : Un titre, une position d'affichage (x,y) la table de question, la tabe
;                                    pour les réponses et le nombre de point à montrer et à remplir.... 
; 
;   SOIT comme ci-après => PointFenetre(NomEntete$ ,IniX ,IniY , Array Text.s(1), Array Rep.s(1), A_Remplir)  
;   
;   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érêt PRINCIPAL ICI est de montrer l'aspect dynamique des affectation de Gadget !!! 
;   --------- 
;   AUSSI avec l'utilisation exclusive d'instructions PureBasic... 
;=========================================================== 
Enumeration 
    #Fenetre_Champ       ; 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.
    ; 
    #AutrePoint=50          ; Constante de départ d'un AUTRE POINT de constante dynamique !!!
    ;  **************************************************************
    ;#bouton_valide         ; Ne serons pas utilisé 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é... 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 ...
                                      ;
EndEnumeration        ;   Les problèmes sont souvent issus de détails...  Ou de manque d'info claire !!!                 
;------------------------------------------------------------------------------------------
Define Nombre.i, IniX.i, IniY.i, Appel
Nombre=6                     ; Nombre d'éléments MAXIMUM du tableau des données pouvant-être saisie...
Dim Text.s(Nombre)     ; Table des Questions 
Dim Rep.s(Nombre)     ; Table des Réponses correspondante 
;------------------------------------------------------------------------------------------

Declare PointFenetre(NomEntete$, IniX , IniY , Array Text.s(1) , Array Rep.s(1) ,Nombre)  
;
;------ Debut Programme ou d'endrit ou srea traité le Tableau Text(i) et les Recoir les réponses Rep(i) >-----------------
;
;   ;  ------------ Question ? ------------<  On pourrait aussi avec une deuxième dimension et le point 0    >-------------------
    ; 
    ;                                                        Questions qui peuvent venir d'une ligne de DATA ou d'un fichier annexe.
    ; 
    Text(0) = "Nom prenom"          ;        Text(0,0) =   Type  parmis ceux ci ou plus limité... 
    Text(1) = "Adresse +N°"          ;        Type =0  => Alphanumérique
    Text(2) = "Code Postal"           ;        Type =1  => Numérique ENTIER Long
    Text(3) = "Localité"                  ;         Type =2  => Numérique Quad 
    Text(4) = "Pays"                      ;         Type =3  => Numérique Double/Flottant
    Text(5) = "Adresse Email"       ;         Type =4  => Mots de Passe (Invisible (*******))
    ;
    ;  -----------------------------------------------------------------------------------------
    For i=0 To Nombre:Rep(i) = "":Next i  ; Mise à zéro de la table des réponses..
    ;  ----------------------------------------------------------------------------------
    NomEntete$="Identification"                    ; Titre de la fenetre     
    IniX=400:IniY=200                                    ; Position sur l'écran  
    ;
    Appel=4                                                    ; Nombre d'élément du tableau à utiliser...  
    If Appel>Nombre:Appel=Nombre:EndIf ; Je m'auto-contrôle il ne peut-être plus grand que le nombre d'élémnts du tableau :-))
    ;  ------------------------------------------------------------------------------------
    Resultat=PointFenetre(NomEntete$, IniX ,IniY, Text() , Rep() , Appel)  ; Appel de la procédure....  
    Debug "Retour Procedure : "+Str(Resultat)
    ;  ----------------------------------------------------------------------------------
    For i=0 To Nombre:Debug Rep(i):Next i  ; Affichage des données saises en fonction de "Appel"
    ;
    ; A partir d'ici ou ceci Rep(n) peut être utilisé pour être classé dans liste chainée ou un Tableau deux dimensions
    ; type Table_Adresse(i,n) les Rep(n) sont les lignes de Table_Adresse(i,n)... 
    ;
End
;
; ***************************************************************
;
;----------------------- Procedure ------------------------------------------------
; ****************************************************************
; >>>>>>>>>>               Fenêtre Commune de question                      <<<<<<<<<<
; ****************************************************************
Procedure PointFenetre(Titre$, IniX , IniY , Array Text.s(1) , Array Rep.s(1) ,Nombre) 
    
    Taille=ArraySize(Text())
    For i=0 To Nombre           ; Determination du champs le plus long 
        If Lmax<Len(Text(i)):Lmax=Len(Text(i)):EndIf
    Next i
    ;-----------------------------  Calcul des dimensions -------------------------------------
    HauteurBouton    = 20
    Largeur_fenetre  = (100+Lmax)*2+20                      ; Largeur de la fenêtre 
    Hauteur_Fenetre= Nombre*30+HauteurBouton+50 ; Hauteur de la fenêtre (50 = 30 titre + 20 interligne avant boutons ! )
    PosYBouton       =Hauteur_Fenetre-30                     ; Position Y des boutons
    ; ---------------------------------------------------------------------------------------------------
    ; 
    WindWid=Largeur_fenetre : WindHigh=Hauteur_Fenetre :  Cas=0   
    ;   Fenetre d'interrogation multibox ...
    If OpenWindow(#Fenetre_Champ,IniX,IniY,WindWid,WindHigh,"",#PB_Window_BorderLess)
       
        SetWindowColor(#Fenetre_Champ,$0AFAF5)    ; Colorier la fenêtre
        StickyWindow(#Fenetre_Champ, 1) 
        ;    
        Milieu=WindWid/2                                                  ; Milieu de la Largeur_fenetre            
        PosYDep=35                                                         ; Position départ  
        PosY=PosYDep                                                    ; Position Y    
        ; -------------------------------------   Titres ------------------------------------------------
        TextGadget(#DebutChamps,40, 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
            Texte$=Trim(Text(j-1))
            TextGadget(#DebutChamps+j,10, PosY, Milieu-15,20,Texte$)     ; Attention ici les ID sont attribué dynamiquement ! 
            StringGadget(#AutrePoint+j, Milieu, PosY,Milieu-10,20,"")            ; 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
        ;
        ButtonGadget(BoutonVal,10,PosYBouton,100,20,"Valider",#PB_Button_Toggle)     
        ButtonGadget(#bouton_annule,Largeur_fenetre-120,PosYBouton,100,20,"Annuler",#PB_Button_Toggle)
        ;   Et ICI c'est "#bouton_annule" 
        ; -----------------------------------------------------------------------------------------------    
    EndIf                
;   ********************************************************************************************
    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 
                            Rep(j-1)=GetGadgetText (#AutrePoint+j)     
                        Next j       
                        Fermer_window1=1 :Cas=1
                        ; --------------------------------------------------------------------------------  
                    Case #bouton_annule ;BoutonAnul             ; Annule l'entrée
                        Fermer_window1=1 :Cas=9
                        ; --------------------------------------------------------------------------------    
                EndSelect
        EndSelect
    Until Fermer_window1=1
    StickyWindow(#Fenetre_Champ,0) 
    CloseWindow (#Fenetre_Champ)                             ; Fermeture de la fenêtre ajoute...
    ; ---------------------------------
    ProcedureReturn Cas
    ;
EndProcedure 
;*******************************************************
Voilà, si ça peut servir : :wink: Tant mieux !