Evenement + Map qui se répète indefiniment.

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Shadow
Messages : 1413
Inscription : mer. 04/nov./2015 17:39

Evenement + Map qui se répète indefiniment.

Message par Shadow »

Salut,

Je ne sais pas trop comment expliquer cela alors je vais faire au mieux.

A la ligne 177 dans mon fichier CreateButtonColor, j'ai essayer d'énumérer ma Map
qui contient toutes les information sur mon bouton, et là, un bug incompréhensible apparait.

Un bug qui semble venir de mon code et non de PB a priori.
Si je commente le code de l'énumération de la Map, évidement aucun problème !

Le fait d'énumérer cette Map fait répété en boucle l'évènement "#PB_EventType_MouseEnter"
de mon Bouton. Chose complètement incompréhensible !

J'ai localisé que le problème venais avec le numéro du Bouton qui vaut 0 dans l'énumération, si 0 = problème.
Impossible de comprendre ni même savoir d’où viens le soucis, j'y comprends rien :?

En quoi le fait d'énumérer une Map fait répéter l'évènement en boucle ?
J'ai essayer de reproduire le problème en vain, ça viens bien de mon code !

Voici un court code qui montre bien que le soucis viens pas de PB mais de mon code:

Code : Tout sélectionner

;{ Enumeration
Enumeration 0
  #Bouton1
  #Bouton2
  #Fenetre
EndEnumeration
;}

;{ Structure
Structure Caracteristiques
  BoutonID.i
  Texte.s
EndStructure  
;}

Global NewMap ArrayButtonColor.Caracteristiques()

Procedure AutoEventBouton()
  
  Select EventType()
      
    Case #PB_EventType_MouseEnter
      
      ForEach ArrayButtonColor()
        Debug EventType()
      Next
      
    Case #PB_EventType_MouseLeave
      
    Case #PB_EventType_MouseMove
      
    Case #PB_EventType_LeftButtonDown
      
    Case #PB_EventType_LeftButtonUp
      
  EndSelect
  
EndProcedure

If OpenWindow(#Fenetre, 327, 177, 500, 300, "Fenêtre windows",  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered | #PB_Window_TitleBar)
  CanvasGadget(#Bouton1, 25, 25, 100, 30)
  CanvasGadget(#Bouton2, 25, 60, 100, 30)
  
  ArrayButtonColor.Caracteristiques(Str(#Bouton1))\BoutonID = #Bouton1
  ArrayButtonColor.Caracteristiques(Str(#Bouton1))\Texte = "Mon Bouton"
  BindGadgetEvent(#Bouton1, @AutoEventBouton())
  
  ArrayButtonColor.Caracteristiques(Str(#Bouton2))\BoutonID = #Bouton2
  ArrayButtonColor.Caracteristiques(Str(#Bouton2))\Texte = "Mon Bouton"
  BindGadgetEvent(#Bouton2, @AutoEventBouton())
  
  Repeat ; Départ des évènements de boucle.
    
    Event = WaitWindowEvent(1) ; Cette ligne attend pendent (Minuteur) qu'un évènement soit recus par la Fenêtre.
    EventWindow = EventWindow(); La Fenêtre oû l'évènement c'est produit.
    EventGadget = EventGadget(); Pour savoir sur quel gadget c'est produis l'évènement.
    EventMenu = EventMenu()    ; Pour savoir sur quel menue c'est produis l'évènement.
    EventType = EventType()    ; Le type d'évènement qui c'est produis sur le gadget.
    
    Select Event 
        
      Case #PB_Event_Gadget
        
        Select EventGadget
            
          Case 0
            
        EndSelect
        
      Case #PB_Event_Menu
        
        Select EventMenu
            
          Case 0
            
        EndSelect
        
    EndSelect
    
  Until Event = #PB_Event_CloseWindow ; Fin des évènements de boucle.
  
EndIf
Alors voici l'archive avec le tous:
http://www.aht.li/3054670/CreateButtonColor_2_tmp.7z

Lancer l'exemple N°6, entrez et sortez du bouton 2, pas de soucis.
Entrez sur le bouton 1, bug !

Maintenant commenté la l'énumération et recommencer, plus de problème !
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Shadow
Messages : 1413
Inscription : mer. 04/nov./2015 17:39

Re: Evenement + Map qui se répète indefiniment.

Message par Shadow »

Bug corrigé, Merci a GallyHC qui ma expliquer pourquoi bien que je comprenne toujours pas le résonnement.

Code : Tout sélectionner

;{ Enumeration
Enumeration 0
  #Bouton1
  #Bouton2
  #Fenetre
EndEnumeration
;}

;{ Structure
Structure Caracteristiques
  BoutonID.i
  Texte.s
EndStructure  
;}

Global NewMap ArrayButtonColor.Caracteristiques()

Procedure AutoEventBouton()
  
  With ArrayButtonColor(Str(EventGadget()))
    
  Select EventType()
      
    Case #PB_EventType_MouseEnter
      
      ForEach ArrayButtonColor()
        Debug \BoutonID
      Next
      
    Case #PB_EventType_MouseLeave
      
    Case #PB_EventType_MouseMove
      
    Case #PB_EventType_LeftButtonDown
      
    Case #PB_EventType_LeftButtonUp
      
  EndSelect
  
EndWith

EndProcedure

If OpenWindow(#Fenetre, 327, 177, 500, 300, "Fenêtre windows",  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered | #PB_Window_TitleBar)
  CanvasGadget(#Bouton1, 25, 25, 100, 30)
  CanvasGadget(#Bouton2, 25, 60, 100, 30)
  
  ArrayButtonColor.Caracteristiques(Str(#Bouton1))\BoutonID = #Bouton1
  ArrayButtonColor.Caracteristiques(Str(#Bouton1))\Texte = "Mon Bouton"
  BindGadgetEvent(#Bouton1, @AutoEventBouton())
  
  ArrayButtonColor.Caracteristiques(Str(#Bouton2))\BoutonID = #Bouton2
  ArrayButtonColor.Caracteristiques(Str(#Bouton2))\Texte = "Mon Bouton"
  BindGadgetEvent(#Bouton2, @AutoEventBouton())
  
  Repeat ; Départ des évènements de boucle.
    
    Event = WaitWindowEvent(1) ; Cette ligne attend pendent (Minuteur) qu'un évènement soit recus par la Fenêtre.
    EventWindow = EventWindow(); La Fenêtre oû l'évènement c'est produit.
    EventGadget = EventGadget(); Pour savoir sur quel gadget c'est produis l'évènement.
    EventMenu = EventMenu()    ; Pour savoir sur quel menue c'est produis l'évènement.
    EventType = EventType()    ; Le type d'évènement qui c'est produis sur le gadget.
    
    Select Event 
        
      Case #PB_Event_Gadget
        
        Select EventGadget
            
          Case 0
            
        EndSelect
        
      Case #PB_Event_Menu
        
        Select EventMenu
            
          Case 0
            
        EndSelect
        
    EndSelect
    
  Until Event = #PB_Event_CloseWindow ; Fin des évènements de boucle.
  
EndIf
C'est cette partie du code qui pose problème:

Code : Tout sélectionner

ForEach ArrayButtonColor()
        Debug \BoutonID
      Next
La bonne syntaxe est:

Code : Tout sélectionner

ForEach ArrayButtonColor()
        Debug ArrayButtonColor()\BoutonID
      Next
Comme dis GallyHC:
ForEach ArrayButtonColor()
ne fait pas reference au with
pour lui c une nouvelle declaration
donc il reste bloquer au with et pas au foreach
c une question de niveau de declaration
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Répondre