Bug ou pas sur le déplacemnt d'une image gadget

Archive.
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Bug ou pas sur le déplacemnt d'une image gadget

Message par PAPIPP »

Bonjour à tous
Je viens de recompiler l’un de mes prg en PB450B2
Et l’ imagegadget que je pouvais déplacer dans les versions précédentes
ne se déplace que de quelques pixels en PB450B2
(Appuyez sur le bouton gauche de la souris en même temps que l’on déplace la souris)
J’ai reconstitué le « bug » dans un prg plus simple ci-dessous avec pour initiales
WWE=WaitWindowEvent(0)
EF=EventWindow()
EG=EventGadget()
Et les résultats du « débogage » montrent qu’à la suite d’une tentative de déplacement WWE=512
Dans PB450B2 EG perd le N° de gadget qui revient à 0 après appel de WWE
Alors que l’on garde le bouton gauche appuyé
La cause semble être l’appel à ImageGadget( ….) qui permet de déplacer le gadget(..)
On peut remarquer que sous PB441 tout se passe normalement

Code : Tout sélectionner


A+
Procedure.q nbcycl()
  !RDTSC
  ProcedureReturn
EndProcedure

Macro q_t
  "
EndMacro
Macro ff_n(n)
  q_t#n#=q_t+Str(n)+" "
EndMacro

Macro ff_s(S)
  q_t#S#=q_t+S+" "
EndMacro

Macro ff_f(F,nv=8)
  q_t#F#=q_t+StrF(f,nv)+" "
EndMacro

Macro ff_d(D,nv=8)
  q_t#D#=q_t+StrD(D,nv)+" "
EndMacro

Macro ff_Q(Q)
  q_t#Q#=q_t+StrQ(Q)+" "
EndMacro

Macro ff_H(H)
  q_t#H#=q_t+Hex(H)+" "
EndMacro

Macro ff_U(U,typ=4)
  q_t#U#=q_t+StrU(U,typ)+" "
EndMacro

Macro nl
  "**"+Str(#PB_Compiler_Line)+"** "
EndMacro
Enumeration
  #f1
  #GadgetImage
EndEnumeration
#WM_MOUSEWHEEL=$20A
#WHEEL_DELTA=120
#text=1
If OpenWindow(#f1,10,10,400,400,"Test sur Souris",#PB_Window_SystemMenu)
  ImageGadget(#GadgetImage,125,125,150,150,0,#PB_Image_Border)
EndIf
Repeat
  Debug nl+ff_n(EG)+ff_n(MEG)+ff_n(EventGadget())+ff_n(click_g)+ff_n(WWe)
  WWE=WaitWindowEvent(0)
  ;WE = WindowEvent(); ne pas mettre cette fonction en service sous risque de dysfonctionnement
  EF=EventWindow()
  Debug nl+ff_n(EG)+ff_n(MEG)+ff_n(EventGadget())+ff_n(click_g)+ff_n(WWe)
  EG=EventGadget()
  Debug nl+ff_n(EG)+ff_n(MEG)+ff_n(EventGadget())+ff_n(click_g)+ff_n(WWe)
  ET=EventType()
  EM=EventMenu()
  EWP=EventwParam()
  ELP=EventlParam()
  
  Select WWE
    Case #PB_Event_CloseWindow
        End
    Case #WM_LBUTTONDOWN ;"Bouton gauche appuyé")
;          Debug nl+ff_n(EG)+ff_n(MEG)+ff_n(EventGadget())+ff_n(click_g)
         Gosub SEL_GAD_ENFONCE
    Case #WM_LBUTTONUP ;"Bouton gauche relaché")
;          Debug nl+ff_n(EG)+ff_n(MEG)+ff_n(EventGadget())+ff_n(click_g)
         Gosub SEL_GAD_RELACHE
    Case #WM_LBUTTONDBLCLK ;"Double clic gauche")
    Case #WM_RBUTTONDOWN ;"Bouton droit appuyé")
    Case #WM_RBUTTONUP ;"Bouton droit relaché")
    Case #WM_RBUTTONDBLCLK ;"Double clic droit")
    Case #WM_MBUTTONDOWN ;"Bouton du milieu appuyé"
    Case #WM_MBUTTONUP ;"Bouton du milieu relaché")
    Case #WM_MBUTTONDBLCLK ;"Double clic du milieu")
    Case #WM_MOUSEMOVE
      M_X=WindowMouseX(#f1)
      M_Y=WindowMouseY(#f1)
        If EG>0 And click_g=1
          NG_X=M_X-D_X0
          NG_Y=M_Y-D_Y0
          ImageGadget(EG,(NG_X),(NG_Y),150,150,0,#PB_Image_Border) ; permet de déplacer imagegadget
          UpdateWindow_(WindowID(#f1))
        EndIf
    Case #WM_MOUSEWHEEL
      Molette.l=-(EWP>>16)/#WHEEL_DELTA
      If Molette>0 ;"Molette en avant de
      ElseIf Molette<0 ;"Molette en arrière de
      EndIf
    Case #PB_Event_Gadget
      Select ET
        Case #PB_EventType_LeftClick ;"Image : Bouton gauche appuyé"
            Gosub SEL_GAD_ENFONCE
          Case #PB_EventType_LeftDoubleClick ;"Image : Double clic gauche")
        Case #PB_EventType_RightClick ;"Image : Bouton Droit appuyé"
        Case #PB_EventType_RightDoubleClick ;"Image : Double clic droit")
      EndSelect
    Case #PB_Event_Repaint  
    Case #PB_Event_CloseWindow:End
  EndSelect
  MWWE=WWE
  ;MWE = WE
  MEF=EF
  MEG=EG
  MET=ET
  MEM=EM
  MEWP=EWP
ForEver

; routine qui s'execute seulement a l'appuis du bouton gauche sur le gadget !!
SEL_GAD_ENFONCE:
Debug "***************** Routine  sur l'appuis du bouton gauche ******************"
  G_X=GadgetX(#GadgetImage)
  G_Y=GadgetY(#GadgetImage)
  M_X=WindowMouseX(#f1)
  M_Y=WindowMouseY(#f1)
  D_X0=M_X-G_X
  D_Y0=M_Y-G_Y
  G_larg=GadgetWidth(#GadgetImage)
  G_haut=GadgetHeight(#GadgetImage)
  click_g=1
Return
SEL_GAD_RELACHE:
Debug "***************** routine sur le relachement du bouton gauche ******************"

click_g=0

Return

Résultats sous PB441

Code : Tout sélectionner


**55** EG=0 MEG=0 EventGadget()=0 click_g=0 WWe=0 
**57** EG=0 MEG=0 EventGadget()=0 click_g=0 WWe=0 
**51** EG=0 MEG=0 EventGadget()=0 click_g=0 WWe=0 
**55** EG=0 MEG=0 EventGadget()=1 click_g=0 WWe=13100 
**57** EG=1 MEG=0 EventGadget()=1 click_g=0 WWe=13100 
***************** Routine  sur l'appuis du bouton gauche ******************
**51** EG=1 MEG=1 EventGadget()=1 click_g=1 WWe=13100 
**55** EG=1 MEG=1 EventGadget()=1 click_g=1 WWe=0 
**57** EG=1 MEG=1 EventGadget()=1 click_g=1 WWe=0 
 


**57** EG=1 MEG=1 EventGadget()=1 click_g=1 WWe=0 
**51** EG=1 MEG=1 EventGadget()=1 click_g=1 WWe=0 
**55** EG=1 MEG=1 EventGadget()=1 click_g=1 WWe=512 
**57** EG=1 MEG=1 EventGadget()=1 click_g=1 WWe=512 
**51** EG=1 MEG=1 EventGadget()=1 click_g=1 WWe=512 
**55** EG=1 MEG=1 EventGadget()=1 click_g=1 WWe=15 
**57** EG=1 MEG=1 EventGadget()=1 click_g=1 WWe=15 
**51** EG=1 MEG=1 EventGadget()=1 click_g=1 WWe=15 
**55** EG=1 MEG=1 EventGadget()=1 click_g=1 WWe=13100 
**57** EG=1 MEG=1 EventGadget()=1 click_g=1 WWe=13100 
**51** EG=1 MEG=1 EventGadget()=1 click_g=1 WWe=13100 
**55** EG=1 MEG=1 EventGadget()=1 click_g=1 WWe=512 
**57** EG=1 MEG=1 EventGadget()=1 click_g=1 WWe=512 
**51** EG=1 MEG=1 EventGadget()=1 click_g=1 WWe=512 
**55** EG=1 MEG=1 EventGadget()=1 click_g=1 WWe=15 
**57** EG=1 MEG=1 EventGadget()=1 click_g=1 WWe=15 
**51** EG=1 MEG=1 EventGadget()=1 click_g=1 WWe=15 

**51** EG=1 MEG=1 EventGadget()=1 click_g=1 WWe=15 
**55** EG=1 MEG=1 EventGadget()=1 click_g=1 WWe=512 
**57** EG=1 MEG=1 EventGadget()=1 click_g=1 WWe=512 
**51** EG=1 MEG=1 EventGadget()=1 click_g=1 WWe=512 
**55** EG=1 MEG=1 EventGadget()=1 click_g=1 WWe=15 
**57** EG=1 MEG=1 EventGadget()=1 click_g=1 WWe=15 
**51** EG=1 MEG=1 EventGadget()=1 click_g=1 WWe=15 
**55** EG=1 MEG=1 EventGadget()=1 click_g=1 WWe=514 
**57** EG=1 MEG=1 EventGadget()=1 click_g=1 WWe=514 
***************** routine sur le relachement du bouton gauche ******************
**51** EG=1 MEG=1 EventGadget()=1 click_g=0 WWe=514 
**55** EG=1 MEG=1 EventGadget()=1 click_g=0 WWe=512 
**57** EG=1 MEG=1 EventGadget()=1 click_g=0 WWe=512 
**51** EG=1 MEG=1 EventGadget()=1 click_g=0 WWe=512 
**55** EG=1 MEG=1 EventGadget()=1 click_g=0 WWe=0 
**57** EG=1 MEG=1 EventGadget()=1 click_g=0 WWe=0 
**51** EG=1 MEG=1 EventGadget()=1 click_g=0 WWe=0 
**55** EG=1 MEG=1 EventGadget()=1 click_g=0 WWe=0 

Résultats sous PB450B2

Code : Tout sélectionner

**51** EG=0 MEG=0 EventGadget()=0 click_g=0 WWe=0 
**55** EG=0 MEG=0 EventGadget()=0 click_g=0 WWe=13104 
**57** EG=0 MEG=0 EventGadget()=0 click_g=0 WWe=13104 


**57** EG=0 MEG=0 EventGadget()=0 click_g=0 WWe=0 
**51** EG=0 MEG=0 EventGadget()=0 click_g=0 WWe=0 
**55** EG=0 MEG=0 EventGadget()=1 click_g=0 WWe=13100 
**57** EG=1 MEG=0 EventGadget()=1 click_g=0 WWe=13100 
***************** Routine  sur l'appuis du bouton gauche ******************
**51** EG=1 MEG=1 EventGadget()=1 click_g=1 WWe=13100 
**55** EG=1 MEG=1 EventGadget()=1 click_g=1 WWe=0 
**57** EG=1 MEG=1 EventGadget()=1 click_g=1 WWe=0 


**57** EG=1 MEG=1 EventGadget()=1 click_g=1 WWe=0 
**51** EG=1 MEG=1 EventGadget()=1 click_g=1 WWe=0 
**55** EG=1 MEG=1 EventGadget()=1 click_g=1 WWe=512 
**57** EG=1 MEG=1 EventGadget()=1 click_g=1 WWe=512 
**51** EG=1 MEG=1 EventGadget()=1 click_g=1 WWe=512 
**55** EG=1 MEG=1 EventGadget()=0 click_g=1 WWe=15 
**57** EG=0 MEG=1 EventGadget()=0 click_g=1 WWe=15 
**51** EG=0 MEG=0 EventGadget()=0 click_g=1 WWe=15 
**55** EG=0 MEG=0 EventGadget()=0 click_g=1 WWe=512 
**57** EG=0 MEG=0 EventGadget()=0 click_g=1 WWe=512 
**51** EG=0 MEG=0 EventGadget()=0 click_g=1 WWe=512 
**55** EG=0 MEG=0 EventGadget()=0 click_g=1 WWe=0 
**57** EG=0 MEG=0 EventGadget()=0 click_g=1 WWe=0 
**51** EG=0 MEG=0 EventGadget()=0 click_g=1 WWe=0 
 

**57** EG=0 MEG=0 EventGadget()=0 click_g=1 WWe=0 
**51** EG=0 MEG=0 EventGadget()=0 click_g=1 WWe=0 
**55** EG=0 MEG=0 EventGadget()=0 click_g=1 WWe=0 
**57** EG=0 MEG=0 EventGadget()=0 click_g=1 WWe=0 
**51** EG=0 MEG=0 EventGadget()=0 click_g=1 WWe=0 
**55** EG=0 MEG=0 EventGadget()=0 click_g=1 WWe=514 
**57** EG=0 MEG=0 EventGadget()=0 click_g=1 WWe=514 
***************** routine sur le relachement du bouton gauche ******************
**51** EG=0 MEG=0 EventGadget()=0 click_g=0 WWe=514 
**55** EG=0 MEG=0 EventGadget()=0 click_g=0 WWe=0 
**57** EG=0 MEG=0 EventGadget()=0 click_g=0 WWe=0 
**51** EG=0 MEG=0 EventGadget()=0 click_g=0 WWe=0 
**55** EG=0 MEG=0 EventGadget()=0 click_g=0 WWe=0 

**55** EG=0 MEG=0 EventGadget()=0 click_g=0 WWe=161 
**57** EG=0 MEG=0 EventGadget()=0 click_g=0 WWe=161 
**51** EG=0 MEG=0 EventGadget()=0 click_g=0 WWe=161 
**55** EG=0 MEG=0 EventGadget()=0 click_g=0 WWe=16 
**57** EG=0 MEG=0 EventGadget()=0 click_g=0 WWe=16 

Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: Bug ou pas sur le déplacemnt d'une image gadget

Message par PAPIPP »

Bonjour à tous
Voici une solution permettant de contourner le "bug" tout en gardant une certaine portabilité
Mais le Pb se complique s'il y a plus 52 imagegadgets (jeu de 52 cartes par exemple + dos + etc..)

Code : Tout sélectionner

Procedure.q nbcycl()
  !RDTSC
  ProcedureReturn
EndProcedure

Macro q_t
  "
EndMacro
Macro ff_n(n)
  q_t#n#=q_t+Str(n)+" "
EndMacro

Macro ff_s(S)
  q_t#S#=q_t+S+" "
EndMacro

Macro ff_f(F,nv=8)
  q_t#F#=q_t+StrF(f,nv)+" "
EndMacro

Macro ff_d(D,nv=8)
  q_t#D#=q_t+StrD(D,nv)+" "
EndMacro

Macro ff_Q(Q)
  q_t#Q#=q_t+StrQ(Q)+" "
EndMacro

Macro ff_H(H)
  q_t#H#=q_t+Hex(H)+" "
EndMacro

Macro ff_U(U,typ=4)
  q_t#U#=q_t+StrU(U,typ)+" "
EndMacro

Macro nl
  "**"+Str(#PB_Compiler_Line)+"** "
EndMacro
Enumeration
  #f1
  #GadgetImage
EndEnumeration
#WM_MOUSEWHEEL=$20A
#WHEEL_DELTA=120
#text=1
If OpenWindow(#f1,10,10,400,400,"Test sur Souris",#PB_Window_SystemMenu)
  ImageGadget(#GadgetImage,125,125,150,150,0,#PB_Image_Border)
EndIf
Repeat
  Debug nl+ff_n(EG)+ff_n(MEG)+ff_n(EventGadget())+ff_n(click_g)+ff_n(WWe)
  WWE=WaitWindowEvent(0)
  ;WE = WindowEvent(); ne pas mettre cette fonction en service sous risque de dysfonctionnement
  EF=EventWindow()
  Debug nl+ff_n(EG)+ff_n(MEG)+ff_n(EventGadget())+ff_n(click_g)+ff_n(WWe)
  EG=EventGadget()
  Debug nl+ff_n(EG)+ff_n(MEG)+ff_n(EventGadget())+ff_n(click_g)+ff_n(WWe)
  ET=EventType()
  EM=EventMenu()
  EWP=EventwParam()
  ELP=EventlParam()
  
  Select WWE
    Case #PB_Event_CloseWindow
        End
    Case #WM_LBUTTONDOWN ;"Bouton gauche appuyé")
;          Debug nl+ff_n(EG)+ff_n(MEG)+ff_n(EventGadget())+ff_n(click_g)
         Gosub SEL_GAD_ENFONCE
    Case #WM_LBUTTONUP ;"Bouton gauche relaché")
;          Debug nl+ff_n(EG)+ff_n(MEG)+ff_n(EventGadget())+ff_n(click_g)
         Gosub SEL_GAD_RELACHE
    Case #WM_LBUTTONDBLCLK ;"Double clic gauche")
    Case #WM_RBUTTONDOWN ;"Bouton droit appuyé")
    Case #WM_RBUTTONUP ;"Bouton droit relaché")
    Case #WM_RBUTTONDBLCLK ;"Double clic droit")
    Case #WM_MBUTTONDOWN ;"Bouton du milieu appuyé"
    Case #WM_MBUTTONUP ;"Bouton du milieu relaché")
    Case #WM_MBUTTONDBLCLK ;"Double clic du milieu")
    Case #WM_MOUSEMOVE
      M_X=WindowMouseX(#f1)
      M_Y=WindowMouseY(#f1)
      If EG_CLIK>0 ; And click_g=1
        NG_X=M_X-D_X0
        NG_Y=M_Y-D_Y0
        ImageGadget(EG_CLIK,(NG_X),(NG_Y),150,150,0,#PB_Image_Border) ; permet de déplacer imagegadget
;         UpdateWindow_(WindowID(#f1))
      EndIf
    Case #WM_MOUSEWHEEL
      Molette.l=-(EWP>>16)/#WHEEL_DELTA
      If Molette>0 ;"Molette en avant de
      ElseIf Molette<0 ;"Molette en arrière de
      EndIf
    Case #PB_Event_Gadget
      Select ET
        Case #PB_EventType_LeftClick ;"Image : Bouton gauche appuyé"
          Gosub SEL_GAD_ENFONCE
        Case #PB_EventType_LeftDoubleClick ;"Image : Double clic gauche")
        Case #PB_EventType_RightClick ;"Image : Bouton Droit appuyé"
        Case #PB_EventType_RightDoubleClick ;"Image : Double clic droit")
      EndSelect
    Case #PB_Event_Repaint
    Case #PB_Event_CloseWindow:End
  EndSelect
  MWWE=WWE
  ;MWE = WE
  MEF=EF
  MEG=EG
  MET=ET
  MEM=EM
  MEWP=EWP
ForEver

; routine qui s'execute seulement a l'appuis du bouton gauche sur le gadget !!
SEL_GAD_ENFONCE:
Debug "***************** Routine  sur l'appuis du bouton gauche ******************"
G_X=GadgetX(#GadgetImage)
G_Y=GadgetY(#GadgetImage)
M_X=WindowMouseX(#f1)
M_Y=WindowMouseY(#f1)
D_X0=M_X-G_X
D_Y0=M_Y-G_Y
G_larg=GadgetWidth(#GadgetImage)
G_haut=GadgetHeight(#GadgetImage)
; click_g=1
EG_CLIK=EG
Return
SEL_GAD_RELACHE:
Debug "***************** routine sur le relachement du bouton gauche ******************"

; click_g=0
EG_CLIK=0


Return

Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Répondre