Bug ou pas ?

Sujets variés concernant le développement en PureBasic
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Bug ou pas ?

Message par Anonyme2 »

Voilà, j'ai un problème et je pense que c'est un bug.

Le code suivant fonctionne bien sous PB 4.41 mais avec la 4.60 beta 2, il y a un problème.
Le code utilise une toolbar avec les API (subclassée) et lorsque l'on clique sur le bouton de la toolbar, une fenêtre s'ouvre et si on la referme avec la croix ou avec la combinaison Alt F4, les 2 fenêtres se ferment.

Ce code fonctionne bien sous PB 4.41, 4.50 je ne sais pas je ne l'ai pas.
L'erreur se produit avec PB 4.60 beta 2 sous Seven, XP home edition, Vista home edition.

Si on ajoute un While WindoEvent() WEND dans la procedure A_Propos_De() juste après CloseWindow(#A_Propos_De), seule la fenêtre A propos de se ferme, ce qui est normal.
J'ai mis While WindoEvent() WEND en commentaire lignes 43-44

Il y a peut-être un truc qui m'échappe. Le subclassing est fait avec SetProp_ et GetProp_ mais avec l'ancienne manière ont a toujours le problème.

Vous avez une idée avant que je balance sur le forum de anglais ?


Code : Tout sélectionner

EnableExplicit

#TBSTYLE_AUTOSIZE = $10
#Option_Fenetre =  #PB_Window_SystemMenu | #PB_Window_MaximizeGadget| #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered
#OriginProc_MainToolBar = "OriginProc_MainToolBar"

#MainWindow = 0
#A_Propos_De = 1
#Button_Ok_About = 0
#Bouton_Apropos = 500

Global Old_Window_Proc, ImageList_Toolbar, h_Main_ToolBar
Global Image, Mask, hMainWindow
Global Item.TBBUTTON

Procedure A_Propos_De()
     Protected  eventGadget
     
     If OpenWindow(#A_Propos_De, 0, 0, 518+1+60, 350+30, "essai" , #PB_Window_SystemMenu|#PB_Window_ScreenCentered, WindowID(#MainWindow))
          If ButtonGadget(#Button_Ok_About, WindowWidth(#A_Propos_De)-80, WindowHeight(#A_Propos_De)-40, 50, 20, "Ok", #PB_Button_Default)
               
               Repeat
                    Select WaitWindowEvent()
                         Case #PB_Event_Gadget
                              eventGadget = EventGadget()
                              Select eventGadget
                                        
                                   Case #Button_Ok_About
                                        Break
                              EndSelect
                              
                         Case #PB_Event_CloseWindow
                              Debug "#PB_Event_CloseWindow"
                              If EventWindow() = #A_Propos_De
                                   Debug "EventWindow() = #A_Propos_De"
                                   Break
                              EndIf
                    EndSelect
               ForEver
               
          EndIf
          CloseWindow(#A_Propos_De)
;           While WindowEvent()
;           Wend
     EndIf
EndProcedure

Procedure CleanUp()
     ;// détruit la ListImage si existe
     If ImageList_Toolbar
          ImageList_Destroy_(ImageList_Toolbar)
          Debug "Image_List détruite"
     EndIf
     
     If h_Main_ToolBar
          ;// destruction de la fenêtre ToolBar
          DestroyWindow_(h_Main_ToolBar)
          Debug "h_Main_ToolBar détruite"
     EndIf
     
     If Old_Window_Proc
          If IsWindow(#MainWindow)
               SetWindowLongPtr_(WindowID(#MainWindow), #GWL_WNDPROC, Old_Window_Proc)
          EndIf
     EndIf
EndProcedure

Procedure.i MainToolBarCallBack(Window, Message, wParam, lParam)
     Protected ReturnValue = GetProp_(WindowID(#MainWindow), #OriginProc_MainToolBar)
     ReturnValue = CallWindowProc_(ReturnValue, WindowID(#MainWindow), Message, wParam, lParam)
     
     Select Message
          Case #WM_COMMAND
               Select (wParam & $FFFF) ; l'identifiant statique du bouton
                         
                    Case #Bouton_Apropos
                         A_Propos_De()
                         ProcedureReturn 0
               EndSelect
     EndSelect
     ProcedureReturn ReturnValue
EndProcedure

Image=CreateImage(#PB_Any,25,25,24)
StartDrawing(ImageOutput(Image))
Box(1,1,25,25,$FF0000)
StopDrawing()

Mask=CreateImage(#PB_Any,25,25,24)
If Mask And StartDrawing(ImageOutput(Mask))
     Box(0,0,24,24,0)
     StopDrawing()
EndIf

hMainWindow = OpenWindow(#MainWindow, 0, 0, 980, 650, "Essai", #Option_Fenetre)


#Flag=#WS_CHILD|#TBSTYLE_AUTOSIZE|#CCS_NODIVIDER|#TBSTYLE_TRANSPARENT|#WS_VISIBLE|#TBSTYLE_FLAT
h_Main_ToolBar=CreateWindowEx_(0,"ToolbarWindow32",0, #Flag,0,0,0,0,hMainWindow,0,0,0)

;// subclass la toolbar (fenêtre principale pour les événements comme WM_COMMAND etc)
Old_Window_Proc = SetWindowLongPtr_(hMainWindow, #GWL_WNDPROC, @MainToolBarCallBack())
If Old_Window_Proc
     SetProp_(hMainWindow, #OriginProc_MainToolBar, Old_Window_Proc)
EndIf


SendMessage_(h_Main_ToolBar, #TB_BUTTONSTRUCTSIZE, SizeOf(TBBUTTON), 0)

ImageList_Toolbar = ImageList_Create_(25,25,#ILC_MASK|#ILC_COLOR24,1,1)

ImageList_Add_(ImageList_Toolbar,ImageID(Image),ImageID(Mask))
SendMessage_(h_Main_ToolBar,#TB_SETIMAGELIST,0,ImageList_Toolbar)

Item\iBitmap=0
Item\idCommand=#Bouton_Apropos
Item\fsState=#TBSTATE_ENABLED
Item\dwData=0
Item\fsStyle=0
Item\iString=0

SendMessage_(h_Main_ToolBar,#TB_INSERTBUTTON,0,Item)

;- Boucle
Repeat
     
     Select WaitWindowEvent()
               
          Case #PB_Event_CloseWindow
               If EventWindow() = #MainWindow
                    CleanUp()
                    Break
               EndIf
     EndSelect
     
ForEver
End
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Bug ou pas ?

Message par Le Soldat Inconnu »

en tous cas, avec la 4.51 x32, aucun soucis sur le code. (sur 7 x64)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Re: Bug ou pas ?

Message par Jacobus »

Bizarre... avec PB 4.51 x86 sur Win7 64bit, j'ai le même problème que Denis.
T'as rien changé à son code LSI ??
Je verrais bien un problème parental entre les fenêtres moi.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Bug ou pas ?

Message par Le Soldat Inconnu »

je n'ai absolument rien touché, mais je crois que je viens de piger le bug, c'était plutôt cela le soucis :mrgreen:
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Bug ou pas ?

Message par Le Soldat Inconnu »

et comme ça, c'est corrigé.

Code : Tout sélectionner

EnableExplicit

#TBSTYLE_AUTOSIZE = $10
#Option_Fenetre =  #PB_Window_SystemMenu | #PB_Window_MaximizeGadget| #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered
#OriginProc_MainToolBar = "OriginProc_MainToolBar"

#MainWindow = 0
#A_Propos_De = 1
#Button_Ok_About = 0
#Bouton_Apropos = 500

Global Old_Window_Proc, ImageList_Toolbar, h_Main_ToolBar
Global Image, Mask, hMainWindow, Event
Global Item.TBBUTTON

Procedure A_Propos_De()
	Protected  eventGadget
	
	If OpenWindow(#A_Propos_De, 0, 0, 518+1+60, 350+30, "essai" , #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
		ButtonGadget(#Button_Ok_About, WindowWidth(#A_Propos_De)-80, WindowHeight(#A_Propos_De)-40, 50, 20, "Ok", #PB_Button_Default)
	EndIf
EndProcedure

Procedure CleanUp()
	;// détruit la ListImage si existe
	If ImageList_Toolbar
		ImageList_Destroy_(ImageList_Toolbar)
		Debug "Image_List détruite"
	EndIf
	
	If h_Main_ToolBar
		;// destruction de la fenêtre ToolBar
		DestroyWindow_(h_Main_ToolBar)
		Debug "h_Main_ToolBar détruite"
	EndIf
	
	If Old_Window_Proc
		If IsWindow(#MainWindow)
			SetWindowLongPtr_(WindowID(#MainWindow), #GWL_WNDPROC, Old_Window_Proc)
		EndIf
	EndIf
EndProcedure

Procedure.i MainToolBarCallBack(Window, Message, wParam, lParam)
	Protected ReturnValue = GetProp_(WindowID(#MainWindow), #OriginProc_MainToolBar)
	ReturnValue = CallWindowProc_(ReturnValue, WindowID(#MainWindow), Message, wParam, lParam)
	
	Select Message
		Case #WM_COMMAND
			Select (wParam & $FFFF) ; l'identifiant statique du bouton
					
				Case #Bouton_Apropos
					A_Propos_De()
					ProcedureReturn 0
			EndSelect
	EndSelect
	ProcedureReturn ReturnValue
EndProcedure

Image=CreateImage(#PB_Any,25,25,24)
StartDrawing(ImageOutput(Image))
	Box(1,1,25,25,$FF0000)
StopDrawing()

Mask=CreateImage(#PB_Any,25,25,24)
If Mask And StartDrawing(ImageOutput(Mask))
		Box(0,0,24,24,0)
	StopDrawing()
EndIf

hMainWindow = OpenWindow(#MainWindow, 0, 0, 980, 650, "Essai", #Option_Fenetre)


#Flag=#WS_CHILD|#TBSTYLE_AUTOSIZE|#CCS_NODIVIDER|#TBSTYLE_TRANSPARENT|#WS_VISIBLE|#TBSTYLE_FLAT
h_Main_ToolBar=CreateWindowEx_(0,"ToolbarWindow32",0, #Flag,0,0,0,0,hMainWindow,0,0,0)

;// subclass la toolbar (fenêtre principale pour les événements comme WM_COMMAND etc)
Old_Window_Proc = SetWindowLongPtr_(hMainWindow, #GWL_WNDPROC, @MainToolBarCallBack())
If Old_Window_Proc
	SetProp_(hMainWindow, #OriginProc_MainToolBar, Old_Window_Proc)
EndIf


SendMessage_(h_Main_ToolBar, #TB_BUTTONSTRUCTSIZE, SizeOf(TBBUTTON), 0)

ImageList_Toolbar = ImageList_Create_(25,25,#ILC_MASK|#ILC_COLOR24,1,1)

ImageList_Add_(ImageList_Toolbar,ImageID(Image),ImageID(Mask))
SendMessage_(h_Main_ToolBar,#TB_SETIMAGELIST,0,ImageList_Toolbar)

Item\iBitmap=0
Item\idCommand=#Bouton_Apropos
Item\fsState=#TBSTATE_ENABLED
Item\dwData=0
Item\fsStyle=0
Item\iString=0

SendMessage_(h_Main_ToolBar,#TB_INSERTBUTTON,0,Item)

;- Boucle
Repeat
	
	
	
	Event =  WaitWindowEvent()
	Select EventWindow()
		Case #MainWindow
			Select Event
				Case #PB_Event_CloseWindow
					CleanUp()
					Break
			EndSelect
		Case  #A_Propos_De
			Select Event
				Case #PB_Event_Gadget
					Select EventGadget()
						Case #Button_Ok_About
							Break
					EndSelect
				Case #PB_Event_CloseWindow
					CloseWindow(#A_Propos_De)
			EndSelect
			
	EndSelect
	
ForEver
End
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: Bug ou pas ?

Message par Anonyme2 »

Salut LSI,

oui ça marche mais tu as regroupé dans la boucle principale.

Ce problème, je l'ai dans PureIconManager, et je gère chaque fenêtre avec une boucle propre, pas tout dans la boucle principale.

Ca a toujours marché avec les précédentes versions de PB, mais plus maintenant.

Tout comme Jacobus, je pense que la callback retourne le message et la fenêtre parent puisque la fenêtre a été détruite, ou quelque chose dans ce goût là.

J'espère que Fred va regarder si c'est mon code qui merde ou si c'est un bug.

Je te remercie :D

A+
Répondre