Page 1 sur 1

[Résolu] Faire des StringGadgets à la volée

Publié : jeu. 08/oct./2015 9:50
par Micoute
Bonjour à tous,

j'essaies de faire un module où on pourrait entrer le nombre de champs que comportera une base de données qu'on souhaite créer pour pouvoir la remplir ultérieurement.
Mais là où je buttes, c'est quand on a entré le nombres de champs à inscrire avec des StringGadget à l'aide d'une boucle définie par le nombre d'éléments à saisir.

Si vous pouviez m'aider, j'en serais très heureux et je vous en remercie à l'avance.

Code : Tout sélectionner

;{- Enumerations / DataSections
;{ Windows
Enumeration
  #Fenetre_Prorietes_Creation
  #Fenetre_Champs
EndEnumeration
;}
;{ Gadgets
Enumeration
  #Txt_Fichier_de_donnees
  #Txt_Nombre_Champs
  #Str_Fichier_de_donnees
  #Str_Nombre_Champs
  #Btn_Valider
  #Btn_Valider_Champs
EndEnumeration
;}
Structure Champ
  Nom.s
  Type.i
EndStructure

Define Evenement, Nombre_Champs, Type_du_champ
Define.s Fichier_de_donnees, Nom_du_champ

Global NewList Champs.Champ()
;}
Procedure Ouvrir_Fenetre_Prorietes_Creation()
  Protected Flags = #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar|#PB_Window_ScreenCentered
  If OpenWindow(#Fenetre_Prorietes_Creation, 0, 0, 420, 75, "Propriétés Création Base de données", Flags)
    TextGadget(#Txt_Fichier_de_donnees, 15, 15, 95, 20, "Fichier de données")
    StringGadget(#Str_Fichier_de_donnees,110, 15, 280, 20, "", #PB_String_BorderLess)
    ButtonGadget(#Btn_Valider, 170, 45, 60, 20, "Valider")
    SetActiveGadget(#Str_Fichier_de_donnees)
  EndIf
EndProcedure

Procedure Creation_Champs()
  Protected Flags = #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar|#PB_Window_ScreenCentered
  If OpenWindow(#Fenetre_Champs, 0, 0, 303, 45, "Création des champs", Flags)
    TextGadget(#Txt_Nombre_Champs, 10, 10, 100, 20, "Nombres de champs : ")
    StringGadget(#Str_Nombre_Champs, 120, 10, 100, 20, "")
    ButtonGadget(#Btn_Valider_Champs, 230, 10, 60, 20, "Valider")
  EndIf  
EndProcedure

Procedure Construction_Champs()
  For i = 1 To Nombre_Champs
    AddElement(Champs())
    Champs()\Nom = Nom_du_champ
    Champs()\Type = Type_du_champ
EndProcedure  
  
Ouvrir_Fenetre_Prorietes_Creation()

;{- Boucle événementielle
Repeat
  Evenement = WaitWindowEvent()
  Select Evenement
      ; ///////////////////
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #Btn_Valider
          If GetGadgetText(#Str_Fichier_de_donnees) <> ""
            Fichier_de_donnees = GetGadgetText(#Str_Fichier_de_donnees) + "SQLite"
            Creation_Champs()
          EndIf
        Case #Btn_Valider_Champs
          Nombre_Champs = GetGadgetText(#Str_Nombre_Champs)
      EndSelect
      ; ////////////////////////
    Case #PB_Event_CloseWindow
      Select EventWindow()
        Case #Fenetre_Prorietes_Creation
          CloseWindow(#Fenetre_Prorietes_Creation)
          Break
      EndSelect
  EndSelect
ForEver
;
;}

Re: Faire des StringGadgets à la volée

Publié : jeu. 08/oct./2015 10:05
par microdevweb
Bonjour Micoute,

Pour créer des StringGadget à la volée tu doit utilisé comme Id #Pb_Any

Code : Tout sélectionner

monChamp=StringGadget(#PB_Any,X,Y,W,H,"")
MonChamp peu'être un tableau, ou l'élément d'une structure

Voici une petit exemple que j'utilise dans mon RAD

Code : Tout sélectionner

 ForEach \myFormItem()
                        N+1
                        ; Un champ string
                        If \myFormItem()\myString\DbItem$<>""
                              label$=\myFormItem()\myString\Label$
                              ; Regarde si le champ est requis
                              If InputRequiered(\DbTable$,\myFormItem()\myString\DbItem$)
                                    label$+" (*)"
                              EndIf
                              tmp=TextGadget(#PB_Any,X,Y,\ItemWith,\ItemHeight,label$)
                              SetGadgetFont(tmp,FontID(\ItemFont))
                              Y+\ItemHeight
                              \myFormItem()\myString\id=StringGadget(#PB_Any,X,Y,\ItemWith,\ItemHeight,"")
                              ; Place une limite de saisie si varchar
                              FindMapElement(myAna\myDb\myTable(),\DbTable$)
                              FindMapElement(myAna\myDb\myTable()\myItem(),\myFormItem()\myString\DbItem$)
                              Select myAna\myDb\myTable()\myItem()\type
                                    Case spd::#TP_Varchar
                                          SetGadgetAttribute( \myFormItem()\myString\id,#PB_String_MaximumLength,myAna\myDb\myTable()\myItem()\myLen)
                              EndSelect
                              
                              SetGadgetFont(\myFormItem()\myString\id,FontID(\ItemFont))
                              ; Si un masque place le callback
                              If \myFormItem()\myString\InputMask<>spd::#Mask_None
                                    BindGadgetEvent(\myFormItem()\myString\id,@EventMask())
                              EndIf    
                        EndIf
                        ; Un combo link
                        If \myFormItem()\myComboLink\DbItem$<>""
                              label$=\myFormItem()\myComboLink\Label$
                              If InputRequiered(\DbTable$,\myFormItem()\myComboLink\DbItem$)
                                    label$+" (*)"
                              EndIf
                              tmp=TextGadget(#PB_Any,X,Y,\ItemWith,\ItemHeight,label$)
                              SetGadgetFont(tmp,FontID(\ItemFont))
                              Y+\ItemHeight
                              Protected WCB
                              If \myFormItem()\myComboLink\ButtonSelect
                                    WCB=\ItemWith-(30+#Margin)
                                    \myFormItem()\myComboLink\ButtonSelectId=ButtonGadget(#PB_Any,X+#Margin+WCB,Y,30,\ItemHeight,"...")
                                    BindGadgetEvent(\myFormItem()\myComboLink\ButtonSelectId,@OpenSheetLinkSelect())
                              Else
                                    WCB=\ItemWith
                              EndIf
                              \myFormItem()\myComboLink\id=ComboBoxGadget(#PB_Any,X,Y,WCB,\ItemHeight)
                              SetGadgetFont(\myFormItem()\myComboLink\id,FontID(\ItemFont))
                              FildComboLink()
                        EndIf
                        If N<ListSize(\myFormItem())
                              ; Passe à la colonne suivante
                              CurrentColumn+1
                              If CurrentColumn>\NumberColumn
                                    CurrentColumn=1
                                    ; Passe à la ligne suivante
                                    Y+\ItemHeight+#Margin
                              Else
                                    Y-\ItemHeight
                              EndIf
                              X=((\ItemWith+#Margin) *(CurrentColumn-1))+#Margin
                        EndIf
                  Next

Re: Faire des StringGadgets à la volée

Publié : jeu. 08/oct./2015 11:10
par Micoute
Merci microdevweb, c'est splendide !