Page 1 sur 1

j'ai besoin d'aide svp svp

Publié : dim. 03/oct./2004 13:58
par jbernard13
bonjour
voila je recoontre un petit probleme
suivant
j'ai creer ce petit example
ce que je voudrais faire c'est quand on choisi dans la barre de menu
une fenetre de message s'ouvre et quand je clique sur Ok je veux faire cette fenetre le probleme suivant j'ai reussi a la fermer avec Closewindow
mais quand je veux aller dans mon menu pour la reouvrir
j'ai plus de fenetre .
qui peux m'aider svp a ressoudre ce probleme.

merci

Code : Tout sélectionner


;declaration des constante des fenetres 

Enumeration
  #Window_0
  #Window_1
EndEnumeration



;declaration du menu de la fenetre principale 0
Enumeration
  #menu_about
EndEnumeration
 
;declaration du boutaon Ok de la fenetre 1 
Enumeration
 #Button_ok
  #Text_0
  #Text_1
EndEnumeration


;Procedure de la fenetre 1 


Procedure Open_Window_1()
  If OpenWindow(#Window_1, 366, 218, 299, 263,  #PB_Window_TitleBar | #PB_Window_WindowCentered , "A propos de  ")

    If CreateGadgetList(WindowID())
    ButtonGadget(#Button_ok, 210, 210, 70, 30, "OK")
      TextGadget(#Text_0, 40, 40, 220, 80, "Test en purebasic  ", #PB_Text_Center)
        EndIf
  EndIf
Repeat
  Select WaitWindowEvent()
  Case#wm_close:Break
  Case#pb_event_gadget
  Select EventGadgetID()
  Case #Button_ok:CloseWindow(#Window_1)
   EndSelect
 EndSelect
  ForEver
 EndProcedure


;Procedure de la fenetre principale 0 

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 224, 17, 768, 593,  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_WindowCentered , "ma fenetre  ")
    
     If CreateMenu(0,WindowID(#Window_0))
     MenuTitle( "?")
   MenuItem(#menu_about,"A  Propos")
  EndIf


  EndIf

Repeat
  Select WaitWindowEvent()
  Case#wm_close:Break
  
  Case#pb_eventmenu
  Select EventMenuID()
 Case#menu_about:Open_Window_1()

    
 EndSelect
 EndSelect
  ForEver

EndProcedure

;Demarage du programme  
Open_Window_0()


Publié : dim. 03/oct./2004 14:26
par julien
Ton code est mal écrit, il est sujet à des erreurs, et peu facile à lire, je l'ai réécrit :

Code : Tout sélectionner

Enumeration
  #Window_0
  #Window_1
EndEnumeration


Enumeration
  #MenuBar_0
EndEnumeration

Enumeration
  #MENU_1
EndEnumeration


Enumeration
  #Button_0
  #Text_0
EndEnumeration


Procedure Open_Window_0()
  If OpenWindow(#Window_0, 257, 162, 602, 302,  #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered , "Test")
    If CreateMenu(#MenuBar_0, WindowID())
      MenuTitle("?")
      MenuItem(#MENU_1, "A propos")
    EndIf
    
    If CreateGadgetList(WindowID())
      
    EndIf
  EndIf
EndProcedure


Procedure Open_Window_1()
  If OpenWindow(#Window_1, 295, 192, 251, 216,  #PB_Window_TitleBar , "A propos")
    If CreateGadgetList(WindowID())
      ButtonGadget(#Button_0, 190, 180, 50, 30, "OK", #PB_Button_Default)
      TextGadget(#Text_0, 110, 50, 60, 20, "PureBasic!")
      
    EndIf
  EndIf
EndProcedure

Open_Window_0()


Repeat
  
  Event = WaitWindowEvent()
  
  If Event = #PB_EventMenu
    
        
    MenuID = EventMenuID()
    
    If MenuID = #MENU_1
     Open_Window_1()
      
    EndIf
    
  EndIf
  
  If Event = #PB_EventGadget
    
   
    
    GadgetID = EventGadgetID()
    
    If GadgetID = #Button_0
      CloseWindow(#Window_1)
      
    EndIf
    
  EndIf
  
Until Event = #PB_EventCloseWindow

End
;

Publié : dim. 03/oct./2004 14:40
par nico
Jbernad13 voudrait faire des Gadgets de couleurs et il ne sait pas ouvrir et fermer une fenêtre :lol:

Publié : dim. 03/oct./2004 15:01
par Anonyme2
JBernard13, il faut éviter d'utiliser des boucles repeat forever tant que c'est pas bien assimilé d'autant plus que pour en sortir il faut un break et là aussi, c'est à éviter le plus possible.

L'exemple de Julien est bien.

Lorsque tu gère la possibilité d'ouvrir plusieurs fenêtre, il faut que tu pense à ceci.

L'événement #wm_Close (il vaut mieux utiliser les constantes Purebasic (ici #PB_EventCloseWindow) se produit sur une fenêtre avec une croix en haut à droite ou par l'appui simultané de ALT F4.

Il faut absolument tester sur quelle fenêtre s'est produit cet événement avant d'en fermer une. On ferme celle sur qui cet événement arrive.

dans la boucle avec le #wm_close (ou plutôt #PB_EventCloseWindow) il faut utiliser EventWindowID()

Voici ton exemple réécrit par Julien que j'ai partiellement réécrit. La procédure de la fenetre à propos a sa propre boucle d'événement

Code : Tout sélectionner

Enumeration
  #Window_0
  #Window_1
EndEnumeration


Enumeration
  #MenuBar_0
EndEnumeration

Enumeration
  #MENU_1
EndEnumeration


Enumeration
  #Button_0
  #Text_0
EndEnumeration


Procedure Open_Window_0()
  If OpenWindow(#Window_0, 257, 162, 602, 302, #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered, "Test")
    If CreateMenu(#MenuBar_0, WindowID())
      MenuTitle("?")
      MenuItem(#MENU_1, "A propos")
    EndIf
  EndIf
EndProcedure


Procedure Open_Window_1()
  If OpenWindow(#Window_1, 295, 192, 251, 216, #PB_Window_SystemMenu | #PB_Window_TitleBar, "A propos")
    If CreateGadgetList(WindowID())
      ButtonGadget(#Button_0, 190, 180, 50, 30, "OK", #PB_Button_Default)
      TextGadget(#Text_0, 110, 50, 60, 20, "PureBasic!")
      
      Repeat
        
        Event = WaitWindowEvent()
        
        Select Event
          Case #PB_EventCloseWindow
            Fenetre = EventWindowID() ; on teste quelle fenetre a produit l'événement de fermeture
            If fenetre = #Window_1 ; si c'est sur la fenêtre #Window_1, alors on ferme cette fenetre
              Fermer_Window_1 = 1 ; on met cette variable à 1 pour quitter la boucle repeat en cours
            EndIf
            
          Case #PB_EventGadget
            GadgetID = EventGadgetID()
            If GadgetID = #Button_0
              Fermer_Window_1 = 1 ; on met cette variable à 1 pour quitter la boucle repeat en cours
            EndIf
        EndSelect
        
      Until Fermer_Window_1 = 1
      ; on ferme cette fenetre et pas la principale
      CloseWindow(#Window_1)
    EndIf
  EndIf
EndProcedure

Open_Window_0()


Repeat
  
  Event = WaitWindowEvent()
  Select Event
    Case #PB_EventMenu
      MenuID = EventMenuID()
      If MenuID = #MENU_1
        Open_Window_1()
      EndIf
      
    Case #PB_EventCloseWindow ; on teste quelle fenetre a produit l'événement de fermeture
      Fenetre = EventWindowID()
      If fenetre = #Window_0
        Fermer_Window_0 = 1 ; on met cette variable à 1 pour quitter la boucle repeat en cours
      EndIf
  EndSelect
Until Fermer_Window_0 = 1



End


; il n'y a pas besoin de mettre closewindow(#Window_0) pour la fenêtre principale car
; on quitte le programme et purebasic va fermer cette fenetre automatiquement

Publié : dim. 03/oct./2004 15:28
par jbernard13
merci pour votre aide

mais c'est quoi la difference entre forever et until

Publié : dim. 03/oct./2004 15:46
par Anonyme2
forever ca veut pour toujours c'est-à-dire que ca boucle sans arrêt c'est donc pour ca que l'on utilise un break pour sortir de là

until ca veut jusqu'à ce que


repeat

until a = 3

veut dire répeter (tout ce qu'il y a dans la boucle) jusqu'à ce que a = 3. Si a = 3 on passe à la ligne suivante du code sinon on répete tout ce qu'il y a dans la boucle repeat until

Publié : dim. 03/oct./2004 15:47
par Le Soldat Inconnu
repeat
forever
=
répète tout le temps

repeat
until
=
répète jusqu'à ce que ...

Publié : dim. 03/oct./2004 19:26
par jbernard13
merci pour votre aide


Vive PureBasic