Le numéro d'objet #Gadget est très élevé (au dessus de 10000

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
François
Messages : 26
Inscription : mar. 14/juin/2016 12:31

Le numéro d'objet #Gadget est très élevé (au dessus de 10000

Message par François »

Bonjour à tous,

Je rencontre un petit problème qui me grattouille.

J'utilise le Form Designer pour créer mon interface (sous Windows) : 2 boutons qui vont basculer de l'état ON à l'état OFF en changeant de couleur.

Pour le changement de couleur, j'utilise un code proposé par Zorro qui consiste à lire les caractéristiques du bouton juste après le click, à le détruire et à le recréer avec une nouvelle couleur de fond.

Mon problème est que quand j'utilise le debugger, le programme s'arrête en m'indiquant une erreur du type :
[ERREUR] Le numéro d'objet #Gadget est très élevé (au dessus de 10000), Êtes-vous sûr ?
Evidement, j'utilise le debugger pour ... débugger. Je devrai m'en sortir en bricolant mais ce n'est pas totalement satisfaisant.
Pas de soucis en revanche après compilation.

Par avance merci pour votre aide.

Les codes sont les suivants :

INTERFACE :

Code : Tout sélectionner

;
; This code is automatically generated by the FormDesigner.
; Manual modification is possible to adjust existing commands, but anything else will be dropped when the code is compiled.
; Event procedures needs to be put in another source file.
;

Global Window_1

Global btn_B1, btn_B2

Enumeration FormFont
  #Font_Window_1_0
EndEnumeration

LoadFont(#Font_Window_1_0,"Bodoni MT Condensed", 10)

Declare P_B1(EventType)
Declare P_B2(EventType)

Procedure OpenWindow_1(x = 0, y = 0, width = 150, height = 170)
  Window_1 = OpenWindow(#PB_Any, x, y, width, height, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  btn_B1 = ButtonGadget(#PB_Any, 20, 10, 110, 40, "ON")
  SetGadgetFont(btn_B1, FontID(#Font_Window_1_0))
  btn_B2 = ButtonGadget(#PB_Any, 20, 60, 110, 40, "ON")
EndProcedure

Procedure Window_1_Events(event)
  Select event
    Case #PB_Event_CloseWindow
      ProcedureReturn #False

    Case #PB_Event_Menu
      Select EventMenu()
      EndSelect

    Case #PB_Event_Gadget
      Select EventGadget()
        Case btn_B1
          P_B1(EventType())          
        Case btn_B2
          P_B2(EventType())          
      EndSelect
  EndSelect
  ProcedureReturn #True
EndProcedure
PROGRAMME

Code : Tout sélectionner

Declare SetButtonColor(hGadget, coul_ecriture, coul_fond)

XIncludeFile("frm_Bouton.pbf")                    ; Inclusion IHM.

OpenWindow_1()                                    ; Démarrage de l'interface.

coul_fond = RGB(110, 110, 110)                    ; Couleur du fond.
coul_ecriture=RGB(255,255,255)                    ; Couleur du texte.

;--------------------------------------:
;   Changement couleur bouton btn_B1   :
;--------------------------------------:
SetButtonColor(btn_B1, coul_ecriture, coul_fond)  ; Appel fonction.
SetGadgetText(btn_B1, "ON")                       ; Récriture du texte (sinon, pas de texte)µ

;--------------------------------------:
;   Changement couleur bouton btn_B2   :
;--------------------------------------:
SetButtonColor(btn_B2, coul_ecriture, coul_fond) 
SetGadgetText(btn_B2, "ON")

;------------------------------------------------------------------------------------:
;                   ---            Boucle principale            ---                  :
;------------------------------------------------------------------------------------:
Repeat
  event = WaitWindowEvent()
Until Window_1_Events(event) = #False

End


;------------------------------------------------------------------------------------:
;                          ---   SetButtonColor   ---                                :
;------------------------------------------------------------------------------------:
Procedure SetButtonColor(Id, coul_ecriture, coul_fond)
         ; by Zorro
         ; en clair on transforme un bouton normal en bouton image ...
    Txt.s = GetGadgetText(Id)         ; Récupération du texte du bouton.
    Larg  = GadgetWidth(Id)           ; Récupération de la largeur du bouton.
    Haut  = GadgetHeight(Id)          ; Récupération de la hauteur du bouton.
    x     = GadgetX(Id)               ; Récupération de la position en X du bouton.
    y     = GadgetY(Id)               ; Récupération de la position en Y du bouton.
    FreeGadget(Id)                    ; Effacement du bouton.

;-----------------------------------------------------------------:
;   Si une police a été définie pour le gadget : on la supprime   :
;-----------------------------------------------------------------:                 
    If IsFont(Id)
        FreeFont(Id)
    EndIf
;------------------------------------------------------------:
;   Si une image est associée au gadget  : on l'a supprime   :
;------------------------------------------------------------:
    If IsImage(Id)
        FreeImage(Id)
    EndIf

;--------------------------------------:
;   Chargement de la nouvelle police   :
;--------------------------------------:         
    ;LoadFont(Id, "Century Gothic", 14, #PB_Font_Bold)

;--------------------------------------------------:
;   Création du graphisme pour le nouveau bouton   :
;--------------------------------------------------:    
    If CreateImage(Id, larg, haut)                        
        StartDrawing(ImageOutput(Id))
            DrawingMode(#PB_2DDrawing_Transparent)                  
            Box(0, 0,larg, haut, coul_fond)               ; Création de la Box.
            DrawingFont(FontID(Id))                       ; Affectation de la nouvelle police.
            FrontColor(coul_ecriture)                     ; Affectation de la couleur de la police.
            DrawText((Larg-TextWidth(txt))/2,(Haut-TextHeight(txt))/2,Txt.s)  ; Ecriture du texte.
            
        StopDrawing()
    EndIf   

;---------------------------:
;   Re-création du bouton   :
;---------------------------:
    ButtonImageGadget(Id,x,y,larg,Haut,ImageID( Id), #PB_Button_Toggle )   
       
    ProcedureReturn result
EndProcedure

;------------------------------------------------------------------------------------:
;                ---            Gestion du bouton btn_B1            ---              :
;------------------------------------------------------------------------------------:
Procedure P_B1(EventType)  
    If GetGadgetText(btn_B1) = "OFF"
        SetGadgetText(btn_B1, "ON")                     ; Ecriture du texte une première fois ...
        SetButtonColor(btn_B1, 0, RGB(110,110,100))        
        SetGadgetText(btn_B1, "ON")                     ; ... et une seconde fois, sinon, pas de texte.
    Else
        SetGadgetText(btn_B1, "OFF")
        SetButtonColor(btn_B1, RGB(2255,255,255), 3091137) 
        SetGadgetText(btn_B1, "OFF")
    EndIf
   
EndProcedure ; -----------------------------------------< Fin de la procédure "P_B1" >


;------------------------------------------------------------------------------------:
;                ---            Gestion du bouton btn_B2            ---              :
;------------------------------------------------------------------------------------:
Procedure P_B2(EventType)
    If GetGadgetText(btn_B2) = "OFF"
        SetGadgetText(btn_B2, "ON")
        SetButtonColor(btn_B2, 0, RGB(110,110,100))      
        SetGadgetText(btn_B2, "ON")
    Else
        SetGadgetText(btn_B2, "OFF")
        SetButtonColor(btn_B2, RGB(2255,255,255), 3091137)  
        SetGadgetText(btn_B2, "OFF")
    EndIf

EndProcedure ; -----------------------------------------< Fin de la procédure "P_B2" >
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Le numéro d'objet #Gadget est très élevé (au dessus de 1

Message par Ar-S »

Quelque chose me chiffonne dans la procedure SetButtonColor..
C'est "ID" qui est utilisé autant pour la font que pour le gadget que pour l'image...

Je trouve ça bien compliqué par rapport au Canvas qui te permet de gérer les event facilement et je contenu graphique.

Essaye de te creer tes CanvasButton, il y a plein d'exemple sur le forum :
Vite fait :

Code : Tout sélectionner

UsePNGImageDecoder()
Declare CreaImage()

Enumeration
#WIN
#CANVAS
#I1
#I2
EndEnumeration

; Création 1 fois de tes images
Procedure CreaImage()
  Text.s="Clic Me"
  CreateImage(#I2,200,40,32,$0)
  StartDrawing(ImageOutput(#I2))
  Box(0,0,200,40,$0)
  DrawText(100 - TextWidth(Text)/2, 15, text, #Red) 
  StopDrawing()
  
  CreateImage(#I1,200,40,32,$0)
  StartDrawing(ImageOutput(#I1))
  Box(0,0,200,40,$0)
  DrawText(100 - TextWidth(Text.s)/2, 15, text, #Yellow) 
  StopDrawing()
  
  Global Li = ImageWidth(#I1)
  Global Hi = ImageHeight(#I1)
  
EndProcedure



; CREATION DES ButtonCanvasImage
Procedure DrawCanvasBT(image)
Shared FirstLaunch
   
   StartDrawing(CanvasOutput(#Canvas))
      DrawImage(ImageID(image),0,0)
   StopDrawing()
EndProcedure


;/////////////// PROGRAMME ////////////////

CreaImage()
If OpenWindow(#WIN, 0, 0, 400, 200, "Exemple...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

   SetWindowColor(#win,$171717)
  CanvasGadget  (#CANVAS, 1, 1, Li, Hi)
   DrawCanvasBT(#i2)
   Repeat
     Event = WaitWindowEvent()
     
     Select Event
     
       Case #PB_Event_Gadget
         Select EventGadget()
           Case #CANVAS
              Select EventType()
               Case #PB_EventType_MouseEnter
                  DrawCanvasBT(#I1)
                 
               Case #PB_EventType_MouseLeave
                  DrawCanvasBT(#I2)
               
               Case #PB_EventType_LeftClick
               Debug "Clic"
                 
              EndSelect

         EndSelect
           
     EndSelect
   Until Event = #PB_Event_CloseWindow
EndIf
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

Re: Le numéro d'objet #Gadget est très élevé (au dessus de 1

Message par Zorro »

tu as posté dans la mauvaise rubrique du forum , il fallait etre dans "Debutant" pour les question de programmation ...


ceci dit le probleme vient de ta ligne :

Code : Tout sélectionner

btn_B1 = ButtonGadget(#PB_Any, 20, 10, 110, 40, "ON")
qui genere un numero enorme ... 36371176 chez moi !!!

je pense que c'est le #Pb_any qui met le bazard !!! (et c'est pas normal !! a signaler a Fred )

je te conseille plutot la programmation standard, sans utiliser le #pb_any
mais en imposant tes propre numero d'iD (via une enumeration style :
enumeration
#btn_B1
#btn_B2
Endenumeration

comme ça t'es sur de ne pas avoir d'id trop grand !!!

ton code corrigé

Code : Tout sélectionner

;
; This code is automatically generated by the FormDesigner.
; Manual modification is possible to adjust existing commands, but anything else will be dropped when the code is compiled.
; Event procedures needs to be put in another source file.
;

Global Window_1



Enumeration FormFont
		#Font_Window_1_0
EndEnumeration

Enumeration
#btn_B1
#btn_B2
EndEnumeration

LoadFont(#Font_Window_1_0,"Bodoni MT Condensed", 10)

Declare P_B1(EventType)
Declare P_B2(EventType)

Procedure OpenWindow_1(x = 0, y = 0, width = 150, height = 170)
		Window_1 = OpenWindow(#PB_Any, x, y, width, height, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
		 ButtonGadget(#btn_B1, 20, 10, 110, 40, "ON")
		
		SetGadgetFont(#btn_B1, FontID(#Font_Window_1_0))
		 ButtonGadget(#btn_B2, 20, 60, 110, 40, "ON")
EndProcedure

Procedure Window_1_Events(event)
		Select event
				Case #PB_Event_CloseWindow
				ProcedureReturn #False
				
				Case #PB_Event_Menu
				Select EventMenu()
				EndSelect
				
				Case #PB_Event_Gadget
				Select EventGadget()
						Case #btn_B1
						P_B1(EventType())         
						Case #btn_B2
						P_B2(EventType())         
				EndSelect
		EndSelect
		ProcedureReturn #True
EndProcedure 

Declare SetButtonColor(hGadget, coul_ecriture, coul_fond)

;XIncludeFile("frm_Bouton.pbf")                    ; Inclusion IHM.

OpenWindow_1()                                    ; Démarrage de l'interface.

coul_fond = RGB(110, 110, 110)                    ; Couleur du fond.
coul_ecriture=RGB(255,255,255)                    ; Couleur du texte.

;--------------------------------------:
;   Changement couleur bouton btn_B1   :
;--------------------------------------:
SetButtonColor(#btn_B1, coul_ecriture, coul_fond)  ; Appel fonction.
SetGadgetText(#btn_B1, "ON")                       ; Récriture du texte (sinon, pas de texte)µ

;--------------------------------------:
;   Changement couleur bouton btn_B2   :
;--------------------------------------:
SetButtonColor(#btn_B2, coul_ecriture, coul_fond)
SetGadgetText(#btn_B2, "ON")

;------------------------------------------------------------------------------------:
;                   ---            Boucle principale            ---                  :
;------------------------------------------------------------------------------------:
Repeat
		event = WaitWindowEvent()
Until Window_1_Events(event) = #False

End


;------------------------------------------------------------------------------------:
;                          ---   SetButtonColor   ---                                :
;------------------------------------------------------------------------------------:
Procedure SetButtonColor(Id, coul_ecriture, coul_fond)
		; by Zorro
		; en clair on transforme un bouton normal en bouton image ...
		
		Txt.s = GetGadgetText(Id)         ; Récupération du texte du bouton.
		Larg  = GadgetWidth(Id)           ; Récupération de la largeur du bouton.
		Haut  = GadgetHeight(Id)          ; Récupération de la hauteur du bouton.
		x     = GadgetX(Id)               ; Récupération de la position en X du bouton.
		y     = GadgetY(Id)               ; Récupération de la position en Y du bouton.
	
				FreeGadget(Id)                    ; Effacement du bouton.
	
		;-----------------------------------------------------------------:
		;   Si une police a été définie pour le gadget : on la supprime   :
		;-----------------------------------------------------------------:                 
		If IsFont(Id)
				FreeFont(Id)
		EndIf
		;------------------------------------------------------------:
		;   Si une image est associée au gadget  : on l'a supprime   :
		;------------------------------------------------------------:
		If IsImage(Id)
				FreeImage(Id)
		EndIf
		
		;--------------------------------------:
		;   Chargement de la nouvelle police   :
		;--------------------------------------:   
      fonte_Id=id
		LoadFont(fonte_Id, "Century Gothic", 14, #PB_Font_Bold)
		
		;--------------------------------------------------:
		;   Création du graphisme pour le nouveau bouton   :
		;--------------------------------------------------:   
		If CreateImage(Id, larg, haut)                       
				StartDrawing(ImageOutput(Id))
						DrawingMode(#PB_2DDrawing_Transparent)                 
						Box(0, 0,larg, haut, coul_fond)               ; Création de la Box.
						DrawingFont(FontID(fonte_Id))                       ; Affectation de la nouvelle police.
						FrontColor(coul_ecriture)                     ; Affectation de la couleur de la police.
						DrawText((Larg-TextWidth(txt))/2,(Haut-TextHeight(txt))/2,Txt.s)  ; Ecriture du texte.
						
				StopDrawing()
		EndIf   
		
		;---------------------------:
		;   Re-création du bouton   :
		;---------------------------:
		ButtonImageGadget(Id,x,y,larg,Haut,ImageID( Id), #PB_Button_Toggle )   
		
		ProcedureReturn result
EndProcedure

;------------------------------------------------------------------------------------:
;                ---            Gestion du bouton btn_B1            ---              :
;------------------------------------------------------------------------------------:
Procedure P_B1(EventType) 
		If GetGadgetText(#btn_B1) = "OFF"
				SetGadgetText(#btn_B1, "ON")                     ; Ecriture du texte une première fois ...
				SetButtonColor(#btn_B1, 0, RGB(110,110,100))       
				SetGadgetText(#btn_B1, "ON")                     ; ... et une seconde fois, sinon, pas de texte.
		Else
				SetGadgetText(#btn_B1, "OFF")
				SetButtonColor(#btn_B1, RGB(255,255,255), 3091137)
				SetGadgetText(#btn_B1, "OFF")
		EndIf
		
EndProcedure ; -----------------------------------------< Fin de la procédure "P_B1" >


;------------------------------------------------------------------------------------:
;                ---            Gestion du bouton btn_B2            ---              :
;------------------------------------------------------------------------------------:
Procedure P_B2(EventType)
		If GetGadgetText(#btn_B2) = "OFF"
				SetGadgetText(#btn_B2, "ON")
				SetButtonColor(#btn_B2, 0, RGB(110,110,100))     
				SetGadgetText(#btn_B2, "ON")
		Else
				SetGadgetText(#btn_B2, "OFF")
				SetButtonColor(#btn_B2, RGB(255,255,255), 3091137) 
				SetGadgetText(#btn_B2, "OFF")
		EndIf
		
EndProcedure ; -----------------------------------------< Fin de la procédure "P_B2" >

Dernière modification par Zorro le mar. 04/juil./2017 17:52, modifié 2 fois.
Marc56
Messages : 2197
Inscription : sam. 08/févr./2014 15:19

Re: Le numéro d'objet #Gadget est très élevé (au dessus de 1

Message par Marc56 »

Utilise des boutons à bascule (#PB_Button_Toggle) et selon leur état, charge une image ou une autre.
Exemple avec des boutons texte (le boutonimage a aussi un mode #PB_Button_Toggle)

Code : Tout sélectionner

EnableExplicit

Enumeration FormWindow
     #Window_0
EndEnumeration

Enumeration FormGadget
     #Btn_1
     #Btn_2
EndEnumeration


OpenWindow(#Window_0, 0, 0, 200, 300, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ButtonGadget(#Btn_1, 10, 10, 100, 25, "B1 ON", #PB_Button_Toggle)
ButtonGadget(#Btn_2, 10, 45, 100, 25, "B1 ON", #PB_Button_Toggle)

Repeat
     Select WaitWindowEvent()
          Case #PB_Event_CloseWindow
               End
               
          Case #PB_Event_Gadget
               Select EventGadget()
                    Case #Btn_1
                         If GetGadgetState(#btn_1) = 1 ; Pressé  
                              SetGadgetText(#btn_1, "B1 OFF")
                         Else
                              SetGadgetText(#btn_1, "B1 ON")
                         EndIf
                         
                    Case #Btn_2
                         If GetGadgetState(#btn_2) = 1 ; Pressé  
                              SetGadgetText(#btn_2, "B2 OFF")
                         Else
                              SetGadgetText(#btn_2, "B2 ON")
                         EndIf
               EndSelect
     EndSelect
ForEver
À la place de SetGadgetText() tu charges une image "On" ou "Off" (créée dynamiquement une seule fois en début de programme)
Si tu ne veux pas voir l'état enfoncé, utilise un flag à 0 ou 1

:wink:
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

Re: Le numéro d'objet #Gadget est très élevé (au dessus de 1

Message par Zorro »

Ar-S a écrit :Quelque chose me chiffonne dans la procedure SetButtonColor..
C'est "ID" qui est utilisé autant pour la font que pour le gadget que pour l'image...

Je trouve ça bien compliqué par rapport au Canvas qui te permet de gérer les event facilement et je contenu graphique.
Pour le changement de couleur, j'utilise un code proposé par Zorro qui consiste à lire les caractéristiques du bouton juste après le click, à le détruire et à le recréer avec une nouvelle couleur de fond.
j'avais du faire ça pour faire des boutons coloré a l'epoquele canvas n'existait peut etre pas..?
puis le canvas c'est quand meme lourd a gerer pour un simple bouton ....

je ne me souviens plus de la raison de ce code ... en fait .. :)
Avatar de l’utilisateur
François
Messages : 26
Inscription : mar. 14/juin/2016 12:31

Re: Le numéro d'objet #Gadget est très élevé (au dessus de 1

Message par François »

Bonsoir,

Merci à tous pour vos réponses. Je vais de ce pas approfondir çà.

Pardon pour le classement dans "Trucs et Astuces" : je me suis gouré (besoin de vacances).
Répondre