Précédent   Forum des professionnels en informatique > Autres langages > Autres langages > Basic > PureBasic
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/03/2011, 17h00   #1
Nouveau Membre du Club
 
Homme Gerhard
Consultant informatique
Inscription : juin 2008
Messages : 36
Détails du profil
Informations personnelles :
Nom : Homme Gerhard
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique
Secteur : Conseil

Informations forums :
Inscription : juin 2008
Messages : 36
Points : 25
Points : 25
Envoyer un message via MSN à GeBonet
Par défaut Multi Box Requester ?

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 :
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 
;**************************************************************************************************************************
GeBonet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2011, 22h49   #2
Responsable Purebasic
 
Avatar de comtois
 
Inscription : avril 2003
Messages : 810
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 810
Points : 1 856
Points : 1 856
Petites remarques :
- Pourquoi mettre le numéro de la fenêtre en paramètre de WaitWindowEvent ? C'est la durée d'une tempo qui est attendue, ou rien.
Code :
WaitWindowEvent(#Fenetre_Champ)
- En faisant ça :
Code :
TextGadget(#DebutChamps+j,10, PosY, Milieu-15,20,Texte$)  ; Attention ici les ID sont attribué dynamiquement !
Tu crées un gadget indexé, et non dynamique. Voir la doc pour l'explication entre indexé et dynamique.

Pourquoi tu n'utilises pas #Pb_Any pour tes gadgets ?
Comme ça c'est PureBasic qui gère les numéros dynamiques.
Avec des objets dynamiques, tu peux intégrer ton bout de code dans un gros projet, sans risque d'écraser les éventuels objets indexés déjà créés.
__________________
Vous souhaitez participer à la rubrique PureBasic (tutoriels, FAQ, sources) ? Contactez-moi par MP.
comtois est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/03/2011, 18h00   #3
Nouveau Membre du Club
 
Homme Gerhard
Consultant informatique
Inscription : juin 2008
Messages : 36
Détails du profil
Informations personnelles :
Nom : Homme Gerhard
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique
Secteur : Conseil

Informations forums :
Inscription : juin 2008
Messages : 36
Points : 25
Points : 25
Envoyer un message via MSN à GeBonet
Bonjour,
@Comtois : Tout à fait exact tes remarques
Mais ce morceau de code je l'ai retrouvé et me suis dit qu'il pourrait être utile pour ce qu'il fait et pas forcément pour la forme !

De plus si #Pb_Any est une solution très souple, par contre ce que je donne comme explication dans l'énumération des constantes de base c'est la réponse à ta question.
Et c'est justement pour avoir le contrôle de l'indexation de la fenêtre et des gadgets qu'elle contient qui ne dépend que de ce qu'on lui demande d'afficher au moment de l'appel. Si a la fin de l'exemple on envoyait une nouvelle demande à la procédure avec une autre quantité de champs avec d'autres intitulés qui pourrait être créer par le programme lui même en réponse à une réaction de l'utilisateur. Et ça fonctionne toujours et le contenu sera bien différent et donc modifié dynamiquement (variable, affecté par le programme lui même mais dans des limites que je veux définies au départ et raison qui fait que je n'utilise pas #PB_Any).
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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        ;
Alors ce bout de code, c'est surtout une "procédure" et le reste n'est que la manière de l'initailiser et l'appeler !
Sa fonction est de pouvoir poser un certains nombre de questions en une fois et d'avoir les réponses correspondantes le tout présenté dans une fenêtre qui va s'ajuster au nombre de questions. Soit un "InputRequester()" multi-lignes et pas plus !

Autre détails je rappelle le bout de code
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
; 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 :-))
  ;  ======================================================
 ; Appel de la procédure....  
  Resultat=PointFenetre(NomEntete$, IniX ,IniY, Text() , Rep() , Appel)  ; 
  ;  ===============================================================================================
qui explique que le tableau Text$(i) pris en exemple pourrait tout aussi bien venir d'un fichier avec son entête "NomEntete$" sa position etc.
Fichier qui pourrait être issus d'une action ou création par l'utilisateur !
Exemple : un "prof" qui crée des questions et dans un autre crée les réponses correspondant aux questions crées... et que son programme contrôle les fichiers des "n" questions fournis avec les "n" réponses attendues...
Voilà, mais bon, ce n'est qu'une manière de faire !
GeBonet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2011, 12h04   #4
Nouveau Membre du Club
 
Homme Gerhard
Consultant informatique
Inscription : juin 2008
Messages : 36
Détails du profil
Informations personnelles :
Nom : Homme Gerhard
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique
Secteur : Conseil

Informations forums :
Inscription : juin 2008
Messages : 36
Points : 25
Points : 25
Envoyer un message via MSN à GeBonet
Par défaut Version plus étendue

Bonjour,
Voilà une version un peu plus étendue qui permet l'usage des flèches pour monter et descendre de même que ENTER pour passer au champs suivant.
Ne fonctionne plus en modification après ESC, mais oui si annule.

Comme le précédent il livre une forme de travaille...
Quelques procédures et contrôle du clavier.
A votre bon usage.
Gerhard
Code :
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 ;}
; *************************************************************************************************************
GeBonet est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h35.


 
 
 
 
Partenaires

Hébergement Web