Bonsoir,
Je soumet un petit code passe partout, Basé sur des tableaux qui peut faire l'objet d'une réflexion sur un mode de dynamique de création d'un formulaire de question / Réponse... !
Voilà votre bon plaisirs !
Gerhard
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
; ============================================================================== 
;  - Saisie dans "InputRequester MultiLigne" - PureBasic Version 4.31 & 4.51
;                                                                 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   ;  qui seraient attribué dynamiquement... 71=La suite du précédent ...
  ;                   ;
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'endroit ou srea traité le Tableau Text(i) et les Recevoir 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.
  ;
  ;  Ou tableau des question à présenter.
  ;
  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...  (ici je pourrais aller jusque 6)
  If Appel>Nombre:Appel=Nombre:EndIf   ; Je m'auto-contrôle il ne  peut-être plus grand que le nombre d'éléments 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 de saisie ---------------------------------------
; **********************************************************************************************
; >>>>>>>>>>                      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 
;**************************************************************************************************************************