InputRequester Multiligne...
Publié : mar. 13/oct./2009 10:25
Bonjour,
Un petit code simple et qui peut s'avérer pratique à intégrer dans n'importe quoi...
Comme je l'indique il permet de saisir plusieurs lignes de réponses pour autant de questions
posées. Les directives sont simple et dans les commentaires !
Le Point intéressant c'est l'affectation et le contrôle dynamique des ID des gadgets !
Ou comment se passer de "#PB_Any" quand ce n'est pas indispensable !
Voilà, si ça peut servir :
Tant mieux !
Un petit code simple et qui peut s'avérer pratique à intégrer dans n'importe quoi...
Comme je l'indique il permet de saisir plusieurs lignes de réponses pour autant de questions
posées. Les directives sont simple et dans les commentaires !
Le Point intéressant c'est l'affectation et le contrôle dynamique des ID des gadgets !
Ou comment se passer de "#PB_Any" quand ce n'est pas indispensable !
Code : Tout sélectionner
; ==========================================================
; - Saisie dans "InputRequester MultiLigne" - PureBasic Version 4.31 & 4.40
; 28-08-2009
; OU Fenetre à champs variable... ; GeBonet
;================================================================
; Le BUT ici est de disposer d'un moyen d'appeler une fenêtre qui se dimensionne SEULE en fonction du
; nombre d'éléments demandé... Et évidement qui renvois les réponses correspondantes aux points envoyés.
;
; Soit un espèce de "InputRequester" multiple...
;
; Pour lequel on donne : Un titre, une position d'affichage (x,y) la table de question, la tabe
; pour les réponses et le nombre de point à montrer et à remplir....
;
; SOIT comme ci-après => PointFenetre(NomEntete$ ,IniX ,IniY , Array Text.s(1), Array Rep.s(1), A_Remplir)
;
; On pourrait y ajouter des exigeances comme demander la couleur de fond, des caractères, la police ou encore
; le type à saisir (Alpha ou Numérique, voir réponse visible ou non (mots de passe)...
;
;===========================================================
; Mais l'intérêt PRINCIPAL ICI est de montrer l'aspect dynamique des affectation de Gadget !!!
; ---------
; AUSSI avec l'utilisation exclusive d'instructions PureBasic...
;===========================================================
Enumeration
#Fenetre_Champ ; Constante de la fenêtre qui sera utilisé...
#DebutChamps ; Constante de Base pour le 1er Gadget d'affichage de la table des questions.
; CETTE CONSTANTE SERVIRA de BASE d'incrémentation pour fournir
; le n° unique des questions suivantes s'il y a lieu.
;
#AutrePoint=50 ; Constante de départ d'un AUTRE POINT de constante dynamique !!!
; **************************************************************
;#bouton_valide ; Ne serons pas utilisé comme tels car comme les gadgets suivants seront affectés
;#bouton_annule ; dynamiquement ils risquent alors de prendre une valeur de constante existante et
; donc de ne pas être affiché... d'ou !!!
;
; LA REGLE : Lorsque l'on attribue des ID de gadget dynamiquement ils doivent
; commencer à un point connu (ici "#DebutChamps") puis rester sous contrôle du
; programme jusqu'a l'autre Constante identifié qui servirait de départ d'un autre point.
; Comme par exemple ICI : "#AutrePoint"
; -------------------------------------------------------------------------------------
#bouton_valide =70 ; Ou alors une Affectation qui dans ce cas ci ne risque pas d'entrer en contact d'autres...
#bouton_annule=71 ; Idem ...
;
EndEnumeration ; Les problèmes sont souvent issus de détails... Ou de manque d'info claire !!!
;------------------------------------------------------------------------------------------
Define Nombre.i, IniX.i, IniY.i, Appel
Nombre=6 ; Nombre d'éléments MAXIMUM du tableau des données pouvant-être saisie...
Dim Text.s(Nombre) ; Table des Questions
Dim Rep.s(Nombre) ; Table des Réponses correspondante
;------------------------------------------------------------------------------------------
Declare PointFenetre(NomEntete$, IniX , IniY , Array Text.s(1) , Array Rep.s(1) ,Nombre)
;
;------ Debut Programme ou d'endrit ou srea traité le Tableau Text(i) et les Recoir les réponses Rep(i) >-----------------
;
; ; ------------ Question ? ------------< On pourrait aussi avec une deuxième dimension et le point 0 >-------------------
;
; Questions qui peuvent venir d'une ligne de DATA ou d'un fichier annexe.
;
Text(0) = "Nom prenom" ; Text(0,0) = Type parmis ceux ci ou plus limité...
Text(1) = "Adresse +N°" ; Type =0 => Alphanumérique
Text(2) = "Code Postal" ; Type =1 => Numérique ENTIER Long
Text(3) = "Localité" ; Type =2 => Numérique Quad
Text(4) = "Pays" ; Type =3 => Numérique Double/Flottant
Text(5) = "Adresse Email" ; Type =4 => Mots de Passe (Invisible (*******))
;
; -----------------------------------------------------------------------------------------
For i=0 To Nombre:Rep(i) = "":Next i ; Mise à zéro de la table des réponses..
; ----------------------------------------------------------------------------------
NomEntete$="Identification" ; Titre de la fenetre
IniX=400:IniY=200 ; Position sur l'écran
;
Appel=4 ; Nombre d'élément du tableau à utiliser...
If Appel>Nombre:Appel=Nombre:EndIf ; Je m'auto-contrôle il ne peut-être plus grand que le nombre d'élémnts du tableau :-))
; ------------------------------------------------------------------------------------
Resultat=PointFenetre(NomEntete$, IniX ,IniY, Text() , Rep() , Appel) ; Appel de la procédure....
Debug "Retour Procedure : "+Str(Resultat)
; ----------------------------------------------------------------------------------
For i=0 To Nombre:Debug Rep(i):Next i ; Affichage des données saises en fonction de "Appel"
;
; A partir d'ici ou ceci Rep(n) peut être utilisé pour être classé dans liste chainée ou un Tableau deux dimensions
; type Table_Adresse(i,n) les Rep(n) sont les lignes de Table_Adresse(i,n)...
;
End
;
; ***************************************************************
;
;----------------------- Procedure ------------------------------------------------
; ****************************************************************
; >>>>>>>>>> Fenêtre Commune de question <<<<<<<<<<
; ****************************************************************
Procedure PointFenetre(Titre$, IniX , IniY , Array Text.s(1) , Array Rep.s(1) ,Nombre)
Taille=ArraySize(Text())
For i=0 To Nombre ; Determination du champs le plus long
If Lmax<Len(Text(i)):Lmax=Len(Text(i)):EndIf
Next i
;----------------------------- Calcul des dimensions -------------------------------------
HauteurBouton = 20
Largeur_fenetre = (100+Lmax)*2+20 ; Largeur de la fenêtre
Hauteur_Fenetre= Nombre*30+HauteurBouton+50 ; Hauteur de la fenêtre (50 = 30 titre + 20 interligne avant boutons ! )
PosYBouton =Hauteur_Fenetre-30 ; Position Y des boutons
; ---------------------------------------------------------------------------------------------------
;
WindWid=Largeur_fenetre : WindHigh=Hauteur_Fenetre : Cas=0
; Fenetre d'interrogation multibox ...
If OpenWindow(#Fenetre_Champ,IniX,IniY,WindWid,WindHigh,"",#PB_Window_BorderLess)
SetWindowColor(#Fenetre_Champ,$0AFAF5) ; Colorier la fenêtre
StickyWindow(#Fenetre_Champ, 1)
;
Milieu=WindWid/2 ; Milieu de la Largeur_fenetre
PosYDep=35 ; Position départ
PosY=PosYDep ; Position Y
; ------------------------------------- Titres ------------------------------------------------
TextGadget(#DebutChamps,40, 5, Milieu+50,25,Titre$)
SetGadgetFont(#DebutChamps+j,LoadFont(#DebutChamps+j, "Arial", 18))
SetGadgetColor(#DebutChamps+j,#PB_Gadget_BackColor, $0AFAF5)
SetGadgetColor(#DebutChamps+j,#PB_Gadget_FrontColor, $E25048)
; --------------------------------- Question et champs pour réponses --------------
For j=1 To Nombre
Texte$=Trim(Text(j-1))
TextGadget(#DebutChamps+j,10, PosY, Milieu-15,20,Texte$) ; Attention ici les ID sont attribué dynamiquement !
StringGadget(#AutrePoint+j, Milieu, PosY,Milieu-10,20,"") ; Attention ici les ID sont attribué dynamiquement !
;
SetGadgetFont(#DebutChamps+j,LoadFont(#DebutChamps+j, "Arial", 12))
SetGadgetColor(#DebutChamps+j,#PB_Gadget_BackColor, $0AFAF5)
SetGadgetColor(#DebutChamps+j,#PB_Gadget_FrontColor, $E25048)
PosY+30
Next j
; -----------------------------------------------------------------------------------------------
BoutonVal=#AutrePoint+j ; ICI j'affecte au "Bouton" une ID Dynamique pour l'exemple
;
ButtonGadget(BoutonVal,10,PosYBouton,100,20,"Valider",#PB_Button_Toggle)
ButtonGadget(#bouton_annule,Largeur_fenetre-120,PosYBouton,100,20,"Annuler",#PB_Button_Toggle)
; Et ICI c'est "#bouton_annule"
; -----------------------------------------------------------------------------------------------
EndIf
; ********************************************************************************************
Repeat
Select WaitWindowEvent (#Fenetre_Champ) ; Traite les boutons....
Case #PB_Event_Gadget
Select EventGadget () ; Selectionne en fonction de ....???
; -----------------------------------------------------------------------------------
Case BoutonVal ; VALIDE pour MODIF ou AJOUT
;
For j=1 To Nombre ; Récupère les données dans le tableau
Rep(j-1)=GetGadgetText (#AutrePoint+j)
Next j
Fermer_window1=1 :Cas=1
; --------------------------------------------------------------------------------
Case #bouton_annule ;BoutonAnul ; Annule l'entrée
Fermer_window1=1 :Cas=9
; --------------------------------------------------------------------------------
EndSelect
EndSelect
Until Fermer_window1=1
StickyWindow(#Fenetre_Champ,0)
CloseWindow (#Fenetre_Champ) ; Fermeture de la fenêtre ajoute...
; ---------------------------------
ProcedureReturn Cas
;
EndProcedure
;*******************************************************
