Page 1 sur 1

SplitterScrolling(Gadget.i)

Publié : sam. 23/mai/2026 10:54
par Jacobus
Hello, voici un petit exemple d'interactions de plusieurs gadgets entre eux.
Ici c'est la commande d'un SplitterGadget() autrement qu'avec la barre de séparation.
Voilà, si ça peut vous servir, faites en bon usage :)

Code : Tout sélectionner

;-TOP
;======================================
; SplitterScrolling(Gadget.i)
;
; Interaction de plusieurs gadgets
; Chacun des 4 gadgets commande les 3 autres
;
; Le programme consiste à commander un SplitterGadget() de plusieurs manières.
; et indirectement à commander TrackBarGadget() et SpinGadget() de plusieurs manières aussi.
;
; Jacobus 23/05/2026 PB 6.40
; Windows 11 64bits
;======================================

Enumeration
  #WIN
  #Bouton1   
  #Bouton2 
  #Separator
  #Adjustmentbar 
  #TextSplit
  #TextLevel
  #TextSpinUnite
  #SpinUnite
  #TextSpinTen
  #SpinTen
EndEnumeration

Procedure SplitterScrolling(Gadget.i)
  ; Dans cette procédure tous les gadgets vont être en interaction
  ; Pour adapter le pourcentage aux autres gadgets
  ; il est nécessaire de diviser la hauteur du SplitterGadegt() par 100
  ; Pour un splitter vertical il faudrait biensûr diviser la largeur par 100
  Height = GadgetHeight(#Separator) 
  Unite.f = Height/100          
  UniteF$ = StrF(Unite, 2) ; important de prendre 2 chiffres après la virgule pour un ajustement précis
  
  If Gadget = #Adjustmentbar
    TrackbarLevel = GetGadgetState(#Adjustmentbar)
    SetGadgetState(#Separator, TrackbarLevel * ValF(UniteF$)) ; on multiplie le niveau de la trackbar par l'unité obtenue
    Splitlevel = GetGadgetState(#Separator)
    SetGadgetText(#TextLevel, "Level = "+Str(TrackbarLevel) + " %")
    SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
    SetGadgetState(#SpinUnite, TrackbarLevel)
    SetGadgetState(#SpinTen, TrackbarLevel)
    
  ElseIf Gadget = #SpinUnite
    Spinlevel = GetGadgetState(#SpinUnite)
    SetGadgetState(#Separator, Spinlevel * ValF(UniteF$)) ; on multiplie le niveau du spingadget par l'unité obtenue
    SetGadgetState(#SpinTen, Spinlevel)
    Splitlevel = GetGadgetState(#Separator)
    SetGadgetText(#TextLevel, "Level = "+Str(Spinlevel) + " %")
    SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
    SetGadgetState(#Adjustmentbar, Spinlevel)
    
  ElseIf Gadget = #SpinTen
    SpinTlevel = GetGadgetState(#SpinTen)
    SetGadgetState(#Separator, SpinTlevel * ValF(UniteF$)) ; on multiplie le niveau du spingadget par l'unité obtenue
    Splitlevel = GetGadgetState(#Separator)
    SetGadgetText(#TextLevel, "Level = "+Str(SpinTlevel) + " %")
    SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
    SetGadgetState(#Adjustmentbar, SpinTlevel)
    SetGadgetState(#SpinUnite, SpinTlevel)
    
  ElseIf Gadget = #Separator
    Splitlevel = GetGadgetState(#Separator)
    SetGadgetState(#SpinUnite, Splitlevel/ValF(UniteF$)) ; par contre ici on est obligé de diviser la valeur du splittergadget par l'unité obtenue
    SetGadgetState(#SpinTen, Splitlevel/ValF(UniteF$))
    SetGadgetState(#Adjustmentbar, Splitlevel/ValF(UniteF$))
    TrackbarLevel = GetGadgetState(#Adjustmentbar)
    SetGadgetText(#TextLevel, "Level = "+Str(TrackbarLevel) + " %")
    SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
  EndIf 

EndProcedure

If OpenWindow(#WIN, 0, 0, 300, 300, "SplitterGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
         
    ButtonGadget(#Bouton1, 0, 0, 0, 0, "Bouton 1") ; Inutile de préciser la taille ou les coordonnées
    ButtonGadget(#Bouton2, 0, 0, 0, 0, "Bouton 2") ; car elles seront déterminées automatiquement
    SplitterGadget(#Separator, 5, 5, 290, 130, #Bouton1, #Bouton2, #PB_Splitter_Separator)
    
    TrackBarGadget(#Adjustmentbar, 5, 140, 290, 20, 0, 100) ;de 0 à 100 pour établir un niveau de pourcentage
    SetGadgetState(#Adjustmentbar, 50) ; mise à 50% au départ
    
    TextGadget(#TextSpinUnite, 5, 170, 45, 20, "Unité :") ;les ajustements seront précis de 1 en 1
    SpinGadget(#SpinUnite, 50, 170, 50, 20, 0, 100, #PB_Spin_Numeric) ;de 0 à 100 pour établir un niveau de pourcentage
    SetGadgetState(#SpinUnite, 50)
    
    TextGadget(#TextSpinTen, 120, 170, 45, 20, "Dizaine :") ;les ajustements seront moins précis mais plus rapide de 10 en 10
    SpinGadget(#SpinTen, 170, 170, 50, 20, 0, 100, #PB_Spin_Numeric) ;de 0 à 100 pour établir un niveau de pourcentage
    SetGadgetState(#SpinTen, 50)
    
    TextGadget(#TextSplit, 5, 200, 290, 20, "Splitter position = ",#PB_Text_Border|#PB_Text_Center)   
    SetGadgetText(#TextSplit, "Splitter position = "+Str(GetGadgetState(#Separator))+ " pixels")
    
    TextGadget(#TextLevel, 5, 225, 290, 20, "Level = ",#PB_Text_Border|#PB_Text_Center)   
    SetGadgetText(#TextLevel, "Level = "+Str(GetGadgetState(#Adjustmentbar))+ " %")
    
    Repeat 
      Event = WaitWindowEvent()
      Select Event
          
        Case #PB_Event_Gadget
          
          Select EventGadget()
              
;             Case #Bouton1 : Debug "Bouton 1 cliqué !"
;               
;             Case #Bouton2 : Debug "Bouton 2 cliqué !"
              
            Case #Separator     : SplitterScrolling(#Separator)
              
            Case #Adjustmentbar : SplitterScrolling(#Adjustmentbar)
              
            Case #SpinUnite     : SplitterScrolling(#SpinUnite)

            Case #SpinTen ;{
              SpinTen = GetGadgetState(#SpinTen)-1      ;on retire 1 du spin auto
              If EventType() = #PB_EventType_Up         ;Le bouton 'Haut' a été pressé.
                SetGadgetState(#SpinTen, SpinTen + 10)  ;on augmente de 10 pour avoir un pas d'une dizaine
              ElseIf EventType() = #PB_EventType_Down   ;Le bouton 'Bas' a été pressé.
                SetGadgetState(#SpinTen, SpinTen - 10)  ;on retire 10
              EndIf 
              SplitterScrolling(#SpinTen) ;application du pourcentage
              ;}
              
          EndSelect
          
        Case #PB_Event_CloseWindow
          Select EventWindow()     
            Case #WIN : Quit = 1                     
          EndSelect
          
      EndSelect
      
    Until Quit = 1
    End 
  EndIf

Re: SplitterScrolling(Gadget.i)

Publié : dim. 24/mai/2026 14:19
par Jacobus
Petite mise à jour du code et ajout de l'option d'utilisation des flèches du clavier pour monter ou descendre le séparateur du SplitterGadget() :)

Code : Tout sélectionner

;;-TOP
;======================================
; SplitterScrolling(Gadget.i)
; Jacobus 23/05/2026 PB 6.40 (x64)
; Windows 11 64bits
;
; Interaction de plusieurs gadgets
; Chacun des 4 gadgets commande les 3 autres
;
; Le programme consiste à commander un SplitterGadget() de plusieurs manières.
; et indirectement à commander TrackBarGadget() et SpinGadget() de plusieurs manières aussi.
;
; 24/05/2026
; Ajout de 2 boutons Up & Down avec icône et raccourcis clavier flèche haut et flèche bas. Unité par unité.
; pour commander la montée et la descente du séparateur + interactions avec les autres gadgets.
; Ajout de 2 boutons Up & Down avec icône et texte pour monter ou descendre complètement le splitter.
;======================================
;-Constantes
Enumeration Fenetres
  #WIN
EndEnumeration

Enumeration Gadgets 
  #Bouton1   
  #Bouton2 
  #Separator
  #Adjustmentbar 
  #TextSplit
  #TextLevel
  #TextSpinUnite
  #SpinUnite
  #TextSpinTen
  #SpinTen
  #Btn_Up
  #Btn_Down
  #Btn_highposition
  #Btn_lowposition
EndEnumeration

Enumeration Menus
  #ShortCut_Menu_Up
  #ShortCut_Menu_Down
EndEnumeration

Procedure SplitterScrolling(Gadget.i)
  ; Dans cette procédure tous les gadgets vont être en interaction
  ; Pour adapter le pourcentage aux autres gadgets
  ; il est nécessaire de diviser la hauteur du SplitterGadegt() par 100
  ; Pour un splitter vertical il faudrait biensûr diviser la largeur par 100
  Height = GadgetHeight(#Separator) 
  Unite.f = (Height-8)/100 ; 1/100 ème de la hauteur du gadget moins les 8 pixels du séparateur       
  UniteF$ = StrF(Unite, 2) ; important de prendre 2 chiffres après la virgule pour un ajustement précis
   
  Select Gadget
      
    Case #Adjustmentbar
      TrackbarLevel = GetGadgetState(#Adjustmentbar)
      SetGadgetState(#Separator, TrackbarLevel * ValF(UniteF$)) ; on multiplie le niveau de la trackbar par l'unité obtenue
      Splitlevel = GetGadgetState(#Separator)
      SetGadgetText(#TextLevel, "Level = "+Str(TrackbarLevel) + " %")
      SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
      SetGadgetState(#SpinUnite, TrackbarLevel)
      SetGadgetState(#SpinTen,   TrackbarLevel)
      
    Case #SpinUnite
      Spinlevel = GetGadgetState(#SpinUnite)
      SetGadgetState(#Separator, Spinlevel * ValF(UniteF$)) ; on multiplie le niveau du spingadget par l'unité obtenue
      SetGadgetState(#SpinTen,   Spinlevel)
      Splitlevel = GetGadgetState(#Separator)
      SetGadgetText(#TextLevel, "Level = "+Str(Spinlevel) + " %")
      SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
      SetGadgetState(#Adjustmentbar, Spinlevel)
      
    Case #SpinTen
      SpinTlevel = GetGadgetState(#SpinTen)
      SetGadgetState(#Separator, SpinTlevel * ValF(UniteF$)) ; on multiplie le niveau du spingadget par l'unité obtenue
      Splitlevel = GetGadgetState(#Separator)
      SetGadgetText(#TextLevel, "Level = "+Str(SpinTlevel) + " %")
      SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
      SetGadgetState(#Adjustmentbar, SpinTlevel)
      SetGadgetState(#SpinUnite,     SpinTlevel)
      
    Case #Separator
      Splitlevel = GetGadgetState(#Separator)
      SetGadgetState(#SpinUnite,     Splitlevel / ValF(UniteF$)) ; par contre ici on est obligé de diviser la valeur du splittergadget par l'unité obtenue
      SetGadgetState(#SpinTen,       Splitlevel / ValF(UniteF$))
      SetGadgetState(#Adjustmentbar, Splitlevel / ValF(UniteF$))
      TrackbarLevel = GetGadgetState(#Adjustmentbar)
      SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
      SetGadgetText(#TextLevel, "Level = "+Str(TrackbarLevel) + " %")
      
    Case #Btn_Up
      Splitlevel = GetGadgetState(#Separator)
      SetGadgetState(#Separator, Splitlevel - ValF(UniteF$)) ; on retire l'unité obtenue pour monter la barre      
      Splitlevel = GetGadgetState(#Separator)                ; vérification de la nouvelle position acceptée par le séparateur
      SetGadgetState(#SpinUnite,     Splitlevel / ValF(UniteF$))   ; ici on est obligé de diviser la valeur du splittergadget par l'unité obtenue
      SetGadgetState(#SpinTen,       Splitlevel / ValF(UniteF$))
      SetGadgetState(#Adjustmentbar, Splitlevel / ValF(UniteF$))
      SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
      SetGadgetText(#TextLevel, "Level = "+Str(GetGadgetState(#Adjustmentbar)) + " %")
      
    Case #Btn_Down      
      Splitlevel = GetGadgetState(#Separator)
      SetGadgetState(#Separator,  Splitlevel + ValF(UniteF$))    ; on ajoute l'unité obtenue pour descendre la barre 
      Splitlevel = GetGadgetState(#Separator)                    ; vérification de la nouvelle position acceptée par le séparateur                  
      SetGadgetState(#SpinUnite,     Splitlevel / ValF(UniteF$)) ; ici on est obligé de diviser la valeur du splittergadget par l'unité obtenue
      SetGadgetState(#SpinTen,       Splitlevel / ValF(UniteF$))
      SetGadgetState(#Adjustmentbar, Splitlevel / ValF(UniteF$))
      SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
      SetGadgetText(#TextLevel, "Level = "+Str(GetGadgetState(#Adjustmentbar)) + " %")
      
    Case #Btn_highposition
      SetGadgetState(#Separator,     0)
      SetGadgetState(#SpinUnite,     0)
      SetGadgetState(#SpinTen,       0)
      SetGadgetState(#Adjustmentbar, 0)
      SetGadgetText(#TextSplit, "Splitter position = "+Str(GetGadgetState(#Separator)) + " pixels")
      SetGadgetText(#TextLevel, "Level = "+Str(GetGadgetState(#Adjustmentbar)) + " %")
      
    Case #Btn_lowposition
      SetGadgetState(#Separator,     100 * ValF(UniteF$))
      SetGadgetState(#SpinUnite,     100) 
      SetGadgetState(#SpinTen,       100)
      SetGadgetState(#Adjustmentbar, 100)
      SetGadgetText(#TextSplit, "Splitter position = "+Str(GetGadgetState(#Separator)) + " pixels")
      SetGadgetText(#TextLevel, "Level = "+Str(GetGadgetState(#Adjustmentbar)) + " %")
      
  EndSelect  

EndProcedure

;-Fenêtre
If OpenWindow(#WIN, 0, 0, 300, 300, "SplitterScrolling", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
         
    ButtonGadget(#Bouton1, 0, 0, 0, 0, "Bouton 1") ; Inutile de préciser la taille ou les coordonnées
    ButtonGadget(#Bouton2, 0, 0, 0, 0, "Bouton 2") ; car elles seront déterminées automatiquement
    SplitterGadget(#Separator, 5, 5, 290, 130, #Bouton1, #Bouton2, #PB_Splitter_Separator)
    
    TrackBarGadget(#Adjustmentbar, 5, 140, 290, 20, 0, 100) ;de 0 à 100 pour établir un niveau de pourcentage
    SetGadgetState(#Adjustmentbar, 50) ; mise à 50% au départ
    
    TextGadget(#TextSpinUnite, 5, 165, 45, 20, "Unité :") ;les ajustements seront précis de 1 en 1
    SpinGadget(#SpinUnite, 50, 165, 50, 20, 0, 100, #PB_Spin_Numeric) ;de 0 à 100 pour établir un niveau de pourcentage
    SetGadgetState(#SpinUnite, 50)
    
    TextGadget(#TextSpinTen, 5, 190, 45, 20, "Dizaine :") ;les ajustements seront moins précis mais plus rapide de 10 en 10
    SpinGadget(#SpinTen, 50, 190, 50, 20, 0, 100, #PB_Spin_Numeric) ;de 0 à 100 pour établir un niveau de pourcentage
    SetGadgetState(#SpinTen, 50)
    
    ButtonImageGadget(#Btn_Up, 133, 160, 35, 25, ExtractIcon_(GetModuleHandle_(#Null), "Shell32.dll",246))
    GadgetToolTip(#Btn_Up,"Monter le séparateur, unité par unité")
    
    ButtonImageGadget(#Btn_Down, 133, 185, 35, 25, ExtractIcon_(GetModuleHandle_(#Null), "Shell32.dll",247))
    GadgetToolTip(#Btn_Down,"Descendre le séparateur, unité par unité")
    
    ButtonGadget(#Btn_highposition,200, 160, 90, 25,Space(2)+"En haut") 
    SetWindowLongPtr_(GadgetID(#Btn_highposition), #GWL_STYLE, GetWindowLongPtr_(GadgetID(#Btn_highposition), #GWL_STYLE) |#BS_LEFT)
    SendMessage_(GadgetID(#Btn_highposition), #BM_SETIMAGE, #IMAGE_ICON, ExtractIcon_(GetModuleHandle_(#Null), "Shell32.dll", 246))
    GadgetToolTip(#Btn_highposition,"Séparateur tout en haut, affichage bouton 2")
    
    ButtonGadget(#Btn_lowposition,200, 185, 90, 25,Space(2)+"En bas") 
    SetWindowLongPtr_(GadgetID(#Btn_lowposition), #GWL_STYLE, GetWindowLongPtr_(GadgetID(#Btn_lowposition), #GWL_STYLE) |#BS_LEFT)
    SendMessage_(GadgetID(#Btn_lowposition), #BM_SETIMAGE, #IMAGE_ICON, ExtractIcon_(GetModuleHandle_(#Null), "Shell32.dll", 247)) 
    GadgetToolTip(#Btn_lowposition,"Séparateur tout en bas, affichage bouton 1")
    
    TextGadget(#TextSplit, 5, 220, 290, 20, "Splitter position = ",#PB_Text_Border|#PB_Text_Center)   
    SetGadgetText(#TextSplit, "Splitter position = "+Str(GetGadgetState(#Separator))+ " pixels")
    
    TextGadget(#TextLevel, 5, 250, 290, 20, "Level = ",#PB_Text_Border|#PB_Text_Center)   
    SetGadgetText(#TextLevel, "Level = "+Str(GetGadgetState(#Adjustmentbar))+ " %")
        
    AddKeyboardShortcut(#WIN, #PB_Shortcut_Up,   #ShortCut_Menu_Up)
    AddKeyboardShortcut(#WIN, #PB_Shortcut_Down, #ShortCut_Menu_Down)
                                            
   
    Repeat 
      Event = WaitWindowEvent()
      Select Event
          
      ;-Event Menus     
        Case #PB_Event_Menu
          
          Select EventMenu()
              
            Case #ShortCut_Menu_Up   : SplitterScrolling(#Btn_Up)
              
            Case #ShortCut_Menu_Down : SplitterScrolling(#Btn_Down)
              
          EndSelect
          
      ;-Event Gadgets     
        Case #PB_Event_Gadget
            
          Select EventGadget()
              
            Case #Bouton1 : Debug "Bouton 1 cliqué !"
              
            Case #Bouton2 : Debug "Bouton 2 cliqué !"
              
            Case #Separator     : SplitterScrolling(#Separator)
              
            Case #Adjustmentbar : SplitterScrolling(#Adjustmentbar)
              
            Case #SpinUnite     : SplitterScrolling(#SpinUnite)

            Case #SpinTen ;{
              SpinTen = GetGadgetState(#SpinTen)-1      ;on retire 1 du spin auto
              If EventType() = #PB_EventType_Up         ;Le bouton 'Haut' a été pressé.
                SetGadgetState(#SpinTen, SpinTen + 10)  ;on augmente de 10 pour avoir un pas d'une dizaine
              ElseIf EventType() = #PB_EventType_Down   ;Le bouton 'Bas' a été pressé.
                SetGadgetState(#SpinTen, SpinTen - 10)  ;on retire 10
              EndIf 
              SplitterScrolling(#SpinTen) ;application du pourcentage
                                          ;}
              
            Case #Btn_Up   : SplitterScrolling(#Btn_Up)
              
            Case #Btn_Down : SplitterScrolling(#Btn_Down)
              
            Case #Btn_highposition : SplitterScrolling(#Btn_highposition)
              
            Case #Btn_lowposition  : SplitterScrolling(#Btn_lowposition)
              
          EndSelect
     ;-Close window     
        Case #PB_Event_CloseWindow
          Select EventWindow()     
            Case #WIN : Quit = 1                     
          EndSelect
          
      EndSelect
      
    Until Quit = 1
    End 
  EndIf

Re: SplitterScrolling(Gadget.i)

Publié : mar. 16/juin/2026 5:35
par venom
Salut Jacobus.

Merci pour le partage je testerai ça :wink:






@++

Re: SplitterScrolling(Gadget.i)

Publié : mar. 16/juin/2026 17:42
par Kwai chang caine
Marche bien ici, ça peu etre utile :idea:
Merci pour le partage 8)

Re: SplitterScrolling(Gadget.i)

Publié : sam. 20/juin/2026 9:54
par Bruce33
Merci Jacobus pour ce bel exemple de programmation.
J'ai constaté un petit souci : quand j'utilise les touches ou les boutons haut/bas (#Btn_Up et #Btn_Down) et que je change de sens, au premier appui on se déplace encore dans le sens précédent sur les différents gadgets alors que le séparateur fonctionne correctement. Il y a un problème de synchronisation des gadgets.
En corrigeant le programme ainsi (pour utiliser la même valeur de Splitlevel partout) ça va mieux :

Code : Tout sélectionner

    Case #Btn_Up
      Splitlevel = GetGadgetState(#Separator) - ValF(UniteF$) ; on retire l'unité obtenue pour monter la barre
      SetGadgetState(#Separator, Splitlevel)
      SetGadgetState(#SpinUnite, Splitlevel/ValF(UniteF$)) ; par contre ici on est obligé de diviser la valeur du splittergadget par l'unité obtenue
      SetGadgetState(#SpinTen, Splitlevel/ValF(UniteF$))
      SetGadgetState(#Adjustmentbar, Splitlevel/ValF(UniteF$))
      SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
      SetGadgetText(#TextLevel, "Level = "+Str(GetGadgetState(#Adjustmentbar)) + " %")
      
    Case #Btn_Down
      Splitlevel = GetGadgetState(#Separator) + ValF(UniteF$) ; on ajoute l'unité obtenue pour descendre la barre
      SetGadgetState(#Separator, Splitlevel)
      SetGadgetState(#SpinUnite, Splitlevel/ValF(UniteF$)) ; par contre ici on est obligé de diviser la valeur du splittergadget par l'unité obtenue
      SetGadgetState(#SpinTen, Splitlevel/ValF(UniteF$))
      SetGadgetState(#Adjustmentbar, Splitlevel/ValF(UniteF$))
      SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
      SetGadgetText(#TextLevel, "Level = "+Str(GetGadgetState(#Adjustmentbar)) + " %")

Re: SplitterScrolling(Gadget.i)

Publié : sam. 20/juin/2026 18:38
par Jacobus
Salut Bruce33, je te remercie.
En corrigeant le programme ainsi (pour utiliser la même valeur de Splitlevel partout) ça va mieux :
Es-tu vraiment sûr de ce que tu avance ? il y a toujours des décalages, sur la trackbar comme sur les spingadget. Il y a aussi une inversion du sens au départ. Je me demande si ce n'est pas dû à la suite des gadgets qui doivent se mettre à jour en même temps...

Re: SplitterScrolling(Gadget.i)

Publié : dim. 21/juin/2026 10:59
par Bruce33
Je suis sûr du problème avec #Btn_Up et #Btn_Down.
Si je reprends la version originale de #Btn_Up :

Code : Tout sélectionner

   Case #Btn_Up
      Splitlevel = GetGadgetState(#Separator)
      SetGadgetState(#Separator, Splitlevel - ValF(UniteF$)) ; on retire l'unité obtenue pour monter la barre      
      SetGadgetState(#SpinUnite, Splitlevel/ValF(UniteF$)) ; par contre ici on est obligé de diviser la valeur du splittergadget par l'unité obtenue
      SetGadgetState(#SpinTen, Splitlevel/ValF(UniteF$))
      SetGadgetState(#Adjustmentbar, Splitlevel/ValF(UniteF$))
      SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
      SetGadgetText(#TextLevel, "Level = "+Str(GetGadgetState(#Adjustmentbar)) + " %")
on réalise dans l'ordre :
- la récupération de la position du séparateur dans la variable Splitlevel
- le repositionnement du séparateur à la valeur Splitlevel - ValF(UniteF$)
- la mise à jour des autres gadgets avec la valeur Splitlevel (et une éventuelle mise à l'échelle par le coefficient UniteF$).
Donc on met à jour les gadgets avec la valeur Splitlevel et non Splitlevel - ValF(UniteF$).
Alors les gadgets ont toujours un coup de retard.
Mais ma correction n'est pas parfaite car je me suis rendu compte que le calcul Splitlevel +/- ValF(UniteF$) ne prenait pas en compte le fait qu'on ait atteint la limite de déplacement.
En relisant la position du séparateur on est donc plus fiable :

Code : Tout sélectionner

   Case #Btn_Up
      Splitlevel = GetGadgetState(#Separator)
      SetGadgetState(#Separator, Splitlevel - ValF(UniteF$)) ; on retire l'unité obtenue pour monter la barre      
      Splitlevel = GetGadgetState(#Separator) ; vérification de la nouvelle position acceptée par le séparateur
      SetGadgetState(#SpinUnite, Splitlevel/ValF(UniteF$)) ; par contre ici on est obligé de diviser la valeur du splittergadget par l'unité obtenue
      SetGadgetState(#SpinTen, Splitlevel/ValF(UniteF$))
      SetGadgetState(#Adjustmentbar, Splitlevel/ValF(UniteF$))
      SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
      SetGadgetText(#TextLevel, "Level = "+Str(GetGadgetState(#Adjustmentbar)) + " %")

Je me suis aussi aperçu qu'au démarrage du programme, le premier déplacement était décalé.
Sur Ubuntu je n'ai pas de problème mais les gadgets ne se comportent pas tout à fait pareil (on ne peut pas "écraser" le texte des boutons, le séparateur a donc moins d'amplitude de mouvement).
Au démarrage on affiche un niveau de 50% avec une position de 62 pixels alors que 50% correspond à 65 pixels.
Je crois que c'est l'épaisseur du séparateur qui crée un décalage. On ne peut pas se déplacer sur 100% de la hauteur du SplitterGadget.

Re: SplitterScrolling(Gadget.i)

Publié : dim. 21/juin/2026 14:07
par Jacobus
Tu as raison en partie, en fait c'est dû au fait que sur les 130 pixels du SplitterGadget(), lorsqu'il est mis au maxi (bouton 1 affiché) soit 100% il y a les 8 pixels du séparateur qui ne sont pas pris. Donc 100% et 122 pixels. C'est ça qui génère des erreurs.
Il faut donc enlever ces 8 pixels de la hauteur pour faire les calculs.

ce qui donne, avec tes corrections :

Code : Tout sélectionner

Procedure SplitterScrolling(Gadget.i)
  ; Dans cette procédure tous les gadgets vont être en interaction
  ; Pour adapter le pourcentage aux autres gadgets
  ; il est nécessaire de diviser la hauteur du SplitterGadegt() par 100
  ; Pour un splitter vertical il faudrait biensûr diviser la largeur par 100
  Height = GadgetHeight(#Separator) 
  Unite.f = (Height-8)/100 ; 1/100 ème de la hauteur du gadget moins les 8 pixels du séparateur       
  UniteF$ = StrF(Unite, 2) ; important de prendre 2 chiffres après la virgule pour un ajustement précis
   
  Select Gadget
      
    Case #Adjustmentbar
      TrackbarLevel = GetGadgetState(#Adjustmentbar)
      SetGadgetState(#Separator, TrackbarLevel * ValF(UniteF$)) ; on multiplie le niveau de la trackbar par l'unité obtenue
      Splitlevel = GetGadgetState(#Separator)
      SetGadgetText(#TextLevel, "Level = "+Str(TrackbarLevel) + " %")
      SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
      SetGadgetState(#SpinUnite, TrackbarLevel)
      SetGadgetState(#SpinTen,   TrackbarLevel)
      
    Case #SpinUnite
      Spinlevel = GetGadgetState(#SpinUnite)
      SetGadgetState(#Separator, Spinlevel * ValF(UniteF$)) ; on multiplie le niveau du spingadget par l'unité obtenue
      SetGadgetState(#SpinTen,   Spinlevel)
      Splitlevel = GetGadgetState(#Separator)
      SetGadgetText(#TextLevel, "Level = "+Str(Spinlevel) + " %")
      SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
      SetGadgetState(#Adjustmentbar, Spinlevel)
      
    Case #SpinTen
      SpinTlevel = GetGadgetState(#SpinTen)
      SetGadgetState(#Separator, SpinTlevel * ValF(UniteF$)) ; on multiplie le niveau du spingadget par l'unité obtenue
      Splitlevel = GetGadgetState(#Separator)
      SetGadgetText(#TextLevel, "Level = "+Str(SpinTlevel) + " %")
      SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
      SetGadgetState(#Adjustmentbar, SpinTlevel)
      SetGadgetState(#SpinUnite,     SpinTlevel)
      
    Case #Separator
      Splitlevel = GetGadgetState(#Separator)
      SetGadgetState(#SpinUnite,     Splitlevel / ValF(UniteF$)) ; par contre ici on est obligé de diviser la valeur du splittergadget par l'unité obtenue
      SetGadgetState(#SpinTen,       Splitlevel / ValF(UniteF$))
      SetGadgetState(#Adjustmentbar, Splitlevel / ValF(UniteF$))
      TrackbarLevel = GetGadgetState(#Adjustmentbar)
      SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
      SetGadgetText(#TextLevel, "Level = "+Str(TrackbarLevel) + " %")
      
    Case #Btn_Up
      Splitlevel = GetGadgetState(#Separator)
      SetGadgetState(#Separator, Splitlevel - ValF(UniteF$)) ; on retire l'unité obtenue pour monter la barre      
      Splitlevel = GetGadgetState(#Separator)                ; vérification de la nouvelle position acceptée par le séparateur
      SetGadgetState(#SpinUnite,     Splitlevel / ValF(UniteF$))   ; ici on est obligé de diviser la valeur du splittergadget par l'unité obtenue
      SetGadgetState(#SpinTen,       Splitlevel / ValF(UniteF$))
      SetGadgetState(#Adjustmentbar, Splitlevel / ValF(UniteF$))
      SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
      SetGadgetText(#TextLevel, "Level = "+Str(GetGadgetState(#Adjustmentbar)) + " %")
      
    Case #Btn_Down      
      Splitlevel = GetGadgetState(#Separator)
      SetGadgetState(#Separator,  Splitlevel + ValF(UniteF$))    ; on ajoute l'unité obtenue pour descendre la barre 
      Splitlevel = GetGadgetState(#Separator)                    ; vérification de la nouvelle position acceptée par le séparateur                  
      SetGadgetState(#SpinUnite,     Splitlevel / ValF(UniteF$)) ; ici on est obligé de diviser la valeur du splittergadget par l'unité obtenue
      SetGadgetState(#SpinTen,       Splitlevel / ValF(UniteF$))
      SetGadgetState(#Adjustmentbar, Splitlevel / ValF(UniteF$))
      SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
      SetGadgetText(#TextLevel, "Level = "+Str(GetGadgetState(#Adjustmentbar)) + " %")
      
    Case #Btn_highposition
      SetGadgetState(#Separator,     0)
      SetGadgetState(#SpinUnite,     0)
      SetGadgetState(#SpinTen,       0)
      SetGadgetState(#Adjustmentbar, 0)
      SetGadgetText(#TextSplit, "Splitter position = "+Str(GetGadgetState(#Separator)) + " pixels")
      SetGadgetText(#TextLevel, "Level = "+Str(GetGadgetState(#Adjustmentbar)) + " %")
      
    Case #Btn_lowposition
      SetGadgetState(#Separator,     100 * ValF(UniteF$))
      SetGadgetState(#SpinUnite,     100) 
      SetGadgetState(#SpinTen,       100)
      SetGadgetState(#Adjustmentbar, 100)
      SetGadgetText(#TextSplit, "Splitter position = "+Str(GetGadgetState(#Separator)) + " pixels")
      SetGadgetText(#TextLevel, "Level = "+Str(GetGadgetState(#Adjustmentbar)) + " %")
      
  EndSelect  

EndProcedure
Merci pour l'aide au debuggage.
Mise à jour du code dans le second post.