Compter les gadgets d'une fenetre [Résolu]

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Compter les gadgets d'une fenetre [Résolu]

Message par Kwai chang caine »

Bonjour à tous

Y a t' il un moyen de savoir combien on a de "combogadget" par exemple, ou bouton dans une fenetre.
Car je les créé et les supprime dynamiquement, et j'aurais aimé ne pas passer par une variable car cela peut etre cause d'erreur.

En VB, il existe les groupes de controle, il suffit de demander ComboBox.count et l'on sait combien il y a de combo actif sur la form :)

Merci de votre aide
Dernière modification par Kwai chang caine le lun. 04/févr./2008 16:42, modifié 1 fois.
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message par gnozal »

C'est possible avec EnumChildWindows_() et GetClassName_() par exemple.
Mais comme c'est toi qui ajoute et libère les gadgets, je ne vois pas trop l'intérêt ...
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Bonjour GNOZAL

ça fait plaisir de te parler en français de la france :D
J'aime bien le français de l'autre coté, mais je comprend pas toujours tout :oops:

Bah voila, j'ai fait une petite fenetre qui ouvre X lignes de gadgets selon le choix de l'utilisateur.

Mais voila comme à l'accoutumé, et pour ne pas renier à ma splendide réputation, ça merdoie :?

Je voudrais que selon le nombre que je choisi, y'es bien le bon nombre de lignes.

J'ai éssayé avec une variable "MaxBase", mais y'a décalage :?
Je pense que la solution la plus simple est celle que j'ai choisie, heureusement j'arrive déjà pas à faire marche le plus simple :oops:

Mais ma curiosité maladive, m'a fait poser cete question, pour pouvoir etre sur de compter les éléments d'une fenetre

Code : Tout sélectionner

Global Dim IdText(50) 
Global Dim IdCombo(50)
Global Dim IdString(50) 

Global MaxBase
      
#FenetreBase = 1

#LabelNbreBase = 10
#ComboNbreBase = 11

OpenWindow(#FenetreBase, 343, 206, 696, 50, "",  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered )
CreateGadgetList(WindowID(#FenetreBase))
TextGadget(#LabelNbreBase, 15, 17, 100, 20, "Nombre de bases ")
ComboBoxGadget(#ComboNbreBase, 110, 15, 90, 300, #PB_ComboBox_Editable)

For i = 1 To 10
 AddGadgetItem(#ComboNbreBase, - 1, Trim(Str(i)))
Next

Repeat  
 
 EvenementFenetre = WaitWindowEvent() 
  
 Select EvenementFenetre
 
  Case #PB_Event_Gadget
   
   Select EventGadget()
    
    Case #ComboNbreBase
     
     If EventType() = #CBN_SELCHANGE 
      
      If Val(GetGadgetText(#ComboNbreBase)) > MaxBase
       
       For MaxBase = 1 To Val(GetGadgetText(#ComboNbreBase))
       
        IdText(MaxBase) = TextGadget(#PB_Any, 10, 30 + (MaxBase * 30), 47, 20, "Base", #PB_Text_Center)
        IdCombo(MaxBase) = ComboBoxGadget(#PB_Any, 50, 30 + (MaxBase * 30), 90, 300, #PB_ComboBox_Editable)
        IdString(MaxBase) = StringGadget(#PB_Any, 150, 30 + (MaxBase * 30), 530, 20, "")
        
        For t = 1 To 115
         AddGadgetItem(IdCombo(MaxBase), - 1, Trim(Str(t)))
        Next
   
       Next
           
      Else
      
       For  o = MaxBase To MaxBase - Val(GetGadgetText(#ComboNbreBase)) + 1 Step - 1
       
        FreeGadget(IdText(o))
        FreeGadget(IdCombo(o))
        FreeGadget(IdString(o))
        
       Next
       
       MaxBase = o
     
      EndIf
       
      ResizeWindow(#FenetreBase, #PB_Ignore, #PB_Ignore, #PB_Ignore, GadgetY(IdText(MaxBase - 1)) + 30) 
     
     EndIf
                 
   EndSelect
    
 EndSelect
  
Until EvenementFenetre = #PB_Event_CloseWindow
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

J'avais posé la question aussi sur le forum US.
Car en ce moment y'a un peu d'echo sur le FR :cry:
Surtout aujourd'hui.

SROD a eu la gentillesse de me donner un code que j'ai aggrandi pour tester plusieurs exemples.
Merci de ton aide GNOZAL.
Et au plaisir d'avoir l'honneur de te reparler 8)

Code : Tout sélectionner

; http://www.purebasic.fr/english/viewtopic.php?t=30961

; Code de SROD
; Agrandi par KCC pour montrer plusieurs exemples

Structure _countgadgets 
  className$ 
  count.l 
EndStructure 

Procedure.l EnumChildWindowProc(hwnd, *cg._countgadgets) 
  Protected buffer$ 
  buffer$=Space(100) 
  GetClassName_(hwnd, @buffer$, 100) 
  If buffer$ = *cg\className$ 
    *cg\count + 1 
  EndIf 
  ProcedureReturn 1 
EndProcedure 

;The following function takes a window handle and a gadget handle and returns a count of the 
;number of similar controls on the given window. 
;This count includes the specified gadget. 

Procedure.l CountSimilarGadgets(winhWnd, gadgethWnd) 
  Protected buffer$ 
  Protected cg._countgadgets 
  If IsWindow_(winhWnd) And IsWindow_(gadgethWnd) 
    buffer$=Space(100) 
    GetClassName_(gadgethWnd, @buffer$, 100) 
    cg\className$ = buffer$ 
    EnumChildWindows_(winhWnd, @EnumChildWindowProc(),@cg) 
  EndIf 
  ProcedureReturn cg\count 
EndProcedure 


If OpenWindow(0, 100, 100, 600, 600, "Count gadgets", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0)) 
  ButtonGadget(0, 10, 10, 200, 20, "Standard Button") 
  ButtonGadget(1, 10, 40, 200, 20, "Left Button", #PB_Button_Left) 
  ButtonGadget(2, 10, 70, 200, 20, "Right Button", #PB_Button_Right) 
  ButtonGadget(3, 10,100, 200, 60, "Multiline Button  (longer text gets automatically wrapped)", #PB_Button_MultiLine) 
  ButtonGadget(4, 10,170, 200, 20, "Toggle Button", #PB_Button_Toggle) 
  StringGadget(5, 10, 200, 100, 20, "Coucou")
  ComboBoxGadget(6, 10,240, 100, 50)
  ComboBoxGadget(7, 10, 300, 100, 50)
  ComboBoxGadget(8, 10, 350, 100, 50)
  ListViewGadget(9, 10, 400, 100, 30)
  ListViewGadget(10, 10, 450, 100, 30)
  
    
  CountButton = CountSimilarGadgets(WindowID(0), GadgetID(4)) 
  CountText = CountSimilarGadgets(WindowID(0), GadgetID(5)) 
  CountBox = CountSimilarGadgets(WindowID(0), GadgetID(6)) 
  CountList = CountSimilarGadgets(WindowID(0), GadgetID(9)) 
  
  Debug "There are " + Str(countButton) + " buttons!" 
  Debug "There are " + Str(countText) + " Texte!" 
  Debug "There are " + Str(countBox) + " ComboBox!" 
  Debug "There are " + Str(countList) + " ListBox!" 

  Repeat 
    event = WaitWindowEvent() 
  Until event = #PB_Event_CloseWindow 
EndIf 
End
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message par gnozal »

Juste une remarque : plusieurs types de gadgets PB partagent la même classe windows !
Par exemple : ButtonGadget / CheckBoxGadget / OptionGadget / Frame3DGadget sont tous de la classe 'Button'. Il faut donc utiliser les styles pour les distinguer ...

Code : Tout sélectionner

Procedure.s GetGadgetClass(GadgetNumber.l) 
  Protected Class.s
  Class = Space(255)
  GetClassName_(GadgetID(GadgetNumber), @Class, 254) 
  ProcedureReturn Class
EndProcedure
;
Procedure GetGadgetStyle(GadgetNumber.l)
  ProcedureReturn GetWindowLong_(GadgetID(GadgetNumber), #GWL_STYLE) 
EndProcedure
;
If OpenWindow(0, 0, 0, 150, 200, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
  If CreateGadgetList(WindowID(0)) 
    ButtonGadget(0, 0, 10, 150, 20, "ButtonGadget") 
    Frame3DGadget(1, 0, 60, 150, 20, "Frame3DGadget") 
    CheckBoxGadget(2, 0, 110, 150, 20, "CheckBoxGadget") 
    OptionGadget(3, 0, 160, 150, 20, "OptionGadget") 
    ;
    For GadgetNumber = 0 To 3 
      GadgetStyle = GetGadgetStyle(GadgetNumber)
      Select GetGadgetClass(GadgetNumber)
        Case "Button"
          If (GadgetStyle & #BS_CHECKBOX) And (GadgetStyle & #WS_TABSTOP) 
            Debug "Le gadget '" + GetGadgetText(GadgetNumber) + "' est un CheckboxGadget" 
          ElseIf (GadgetStyle & #BS_AUTORADIOBUTTON) And (GadgetStyle & #WS_TABSTOP) 
            Debug "Le gadget '" + GetGadgetText(GadgetNumber) + "' est un OptionGadget" 
          ElseIf (GadgetStyle & #BS_GROUPBOX) And (GadgetStyle ~ #WS_TABSTOP) 
            Debug "Le gadget '" + GetGadgetText(GadgetNumber) + "' est un Frame3DGadget" 
          Else 
            Debug "Le gadget '" + GetGadgetText(GadgetNumber) + "' est un ButtonGadget" 
          EndIf 
      EndSelect 
    Next 
    ;
    Repeat 
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf
EndIf
Répondre