IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PureBasic Discussion :

Multi Box Requester ?


Sujet :

PureBasic

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2008
    Messages : 39
    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 : 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 
    ;**************************************************************************************************************************

  2. #2
    Responsable Purebasic

    Avatar de comtois
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 310
    Billets dans le blog
    8
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    WaitWindowEvent(#Fenetre_Champ)
    - En faisant ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  3. #3
    Membre averti
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2008
    Messages : 39
    Par défaut
    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 : 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
    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 : 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
    ; 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 !

  4. #4
    Membre averti
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2008
    Messages : 39
    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 : 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
    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 ;}
    ; *************************************************************************************************************

Discussions similaires

  1. Réponses: 3
    Dernier message: 28/03/2014, 22h43
  2. Mise en page multi check box
    Par nathalie16 dans le forum Zend_Form
    Réponses: 2
    Dernier message: 03/05/2011, 21h55
  3. multi combo box
    Par ph_anrys dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 12/01/2010, 12h15
  4. [A-03] Affichage multi résultats dans un text box
    Par julien_ott dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 10/10/2008, 18h45
  5. Unselect Multi line text box
    Par olibara dans le forum C#
    Réponses: 3
    Dernier message: 01/04/2008, 10h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo