(et donc de #PB_Any) je viens d'écrire un petit code qui peut-être utile...
Aussi pour comprendre les affectations des ID...
Voici, voilà...
Code : Tout sélectionner
; ==============================================================================
; - Saisie dans "InputRequester MultiLigne" - PureBasic Version 4.31 & 4.40
; ----------------------------------------------------- 29-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... ===> OU FENETRE qui se forme seule :-))
;
; 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 Quest.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) longueur maxi etc.
;
; ==============================================================================
; Mais l'intérêt PRINCIPAL ICI est de montrer l'aspect dynamique des affectations 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
Nombre=6 ; Nombre d'éléments MAXIMUM du tableau des données pouvant-être saisie...
Dim Quest.s(Nombre) ; Table des Questions
Dim Rep.s(Nombre) ; Table des Réponses correspondante
;-------------------------------------------------------------------------------------------------------------------------------------------------------
Declare PointFenetre(NomEntete$, IniX , IniY , Array Quest.s(1) , Array Rep.s(1) ,Nombre)
;-------------------------------------------------------------------------------------------------------------------------------------------------------
; ------------ Question ? --------------< On pourrait aussi avec une deuxième dimension et le point 0 >-----------------
; Le tableau des questions ou libellé...
Quest(0) = "Nom prenom" ; Quest(0,0) = Type parmis ceux ci ou plus limité...
Quest(1) = "Adresse +N°" ; Type =0 => Alphanumérique
Quest(2) = "Code Postal" ; Type =1 => Numérique ENTIER Long
Quest(3) = "Localité" ; Type =2 => Numérique Quad
Quest(4) = "Pays" ; Type =3 => Numérique Double/Flottant
Quest(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=3 ; Nombre d'élément du tableau à utiliser... C'EST ICI QU'ON DIT COMBIEN
;
If Appel>Nombre:Appel=Nombre:EndIf ; Je m'auto-contrôle :-))
; ---------------------------------------------------------------------------------------------------------------
; Appel de la procedure <<===============
Resultat=PointFenetre(NomEntete$, IniX ,IniY, Quest.s() , Rep.s() , Appel) ; Appel de la procédure....
; Retour des réponses... <<===============
Debug "Retour Procedure : "+Str(Resultat):Debug "--------------------------------"
; ---------------------------------------------------------------------------------------------------------------
; Affichage des réponses saises en fonction de "Appel"
For i=0 To Nombre:Debug Rep(i):Next i
;
End
; *************************************** FIN *************************************************
;
; *********************************************************************************************
; >>>>>>>>>> Fenêtre Commune de question <<<<<<<<<<
;
; *********************************************************************************************
Procedure PointFenetre(Titre$, IniX , IniY , Array Quest.s(1) , Array Rep.s(1) ,Nombre)
For i=0 To Nombre ; Determination du champs le plus long
If Lmax<Len(Quest(i)):Lmax=Len(Quest(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(Quest(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
SetActiveGadget(#AutrePoint+1) ; Active le premier champs
; -----------------------------------------------------------------------------------------------
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
;**************************************************************************************************************************