Page 1 sur 1

Avertissement avant fermeture de programme

Publié : jeu. 02/déc./2004 12:48
par Jacobus
:) Salut,

Je souhaiterai sécuriser la fermeture d'un programme, afin qu'en cliquant sur la croix, un requester avertisse l'utilisateur qu'il peut encore revenir à son travail s'il a malencontreusement décidé de fermer son prog sans l'enregistrer.

J'ai donc fait une petite procédure permettant la chose.
Problème : La fenêtre du programme se ferme quand même après environ 1,5 seconde d'attente. Pas vraiment top.

Voilà le code, si vous voyez où ça coince merci de me le signaler.
Code d'exemple d'un programme qui ne fait rien.

Code : Tout sélectionner

Enumeration 
#window = 0
#btn1
#btn2
#Texte
EndEnumeration 

Procedure fermeture()
Fermeture = MessageRequester("ENREGISTREMENT AVANT FERMETURE","ASSUREZ-VOUS D'AVOIR ENREGISTRE LES MODIFICATIONS APPORTEES A VOTRE TRAVAIL  !"+Chr(13)+""+Chr(13)+"Si vous avez modifié un fichier, enregistrez le avant de le refermer,"+Chr(13)+"sinon les modifications ne seront pas prises en compte."+Chr(13)+""+Chr(13)+"Si vous n'avez rien à enregistrer, cliquez sur OUI"+Chr(13)+""+Chr(13)+"Si vous devez enregistrer des modifications, cliquez sur NON",#MB_ICONEXCLAMATION | #PB_MessageRequester_YesNo) 
    If Fermeture = 6
      a$ + "Yes" :Quit = #True
        ElseIf Fermeture = 7
          a$ + "No" :Quit = #False
          If Quit=#False
           EventID = WaitWindowEvent()
        EndIf
       EndIf 
EndProcedure

If OpenWindow(0,100,100,250,150,#PB_Window_SystemMenu| #PB_Window_MinimizeGadget|#PB_Window_TitleBar,"REQUETE DE FERMETURE") 
  If CreateGadgetList(WindowID(0)) 
  
    TextGadget(#Texte,20,20,200,40,"J'aimerais bien fermer cette fenêtre qu'après décision sur Requester !",#PB_Text_Center|#PB_Button_MultiLine)
    ButtonGadget(#btn1,30,100,60,20,"Bouton 1")
    ButtonGadget(#btn2,110,100,60,20,"Bouton 1")

 EndIf 
EndIf 

 Repeat 
    
    EventID = WaitWindowEvent() 
     
    Select EventID 
       Case #PB_EventGadget
          Select EventGadgetID()
          
          Case #btn1; Rien, juste pour exemple
          
          Case #btn2
          
          EndSelect 
     
     Case #PB_Event_CloseWindow :fermeture()
     
    EndSelect   
          
   Until EventID = #PB_Event_CloseWindow      

End

Publié : jeu. 02/déc./2004 13:31
par filperj
Tu as oublié de déclarer la variable EventID comme globale, du coup celle qui est modifiée dans la fproc n'est pas la même que celle testée en fin de boucle.

Publié : jeu. 02/déc./2004 13:55
par Le Soldat Inconnu
Bien complique, ta procedure :roll:

Comme ça, c'est nettement plus simple

Code : Tout sélectionner

Enumeration
  #window = 0
  #btn1
  #btn2
  #Texte
EndEnumeration

Procedure.l fermeture()
  If MessageRequester("ENREGISTREMENT AVANT FERMETURE", "ASSUREZ-VOUS D'AVOIR ENREGISTRE LES MODIFICATIONS APPORTEES A VOTRE TRAVAIL  !" + Chr(13) + "" + Chr(13) + "Si vous avez modifié un fichier, enregistrez le avant de le refermer," + Chr(13) + "sinon les modifications ne seront pas prises en compte." + Chr(13) + "" + Chr(13) + "Si vous n'avez rien à enregistrer, cliquez sur OUI" + Chr(13) + "" + Chr(13) + "Si vous devez enregistrer des modifications, cliquez sur NON", #MB_ICONEXCLAMATION | #PB_MessageRequester_YesNo) = 6
    ProcedureReturn 1
  Else
    ProcedureReturn 0
  EndIf
EndProcedure

If OpenWindow(0, 100, 100, 250, 150, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar, "REQUETE DE FERMETURE")
  If CreateGadgetList(WindowID(0))
    
    TextGadget(#Texte, 20, 20, 200, 40, "J'aimerais bien fermer cette fenêtre qu'après décision sur Requester !", #PB_Text_Center | #PB_Button_MultiLine)
    ButtonGadget(#btn1, 30, 100, 60, 20, "Bouton 1")
    ButtonGadget(#btn2, 110, 100, 60, 20, "Bouton 1")
    
  EndIf
EndIf

Repeat
  
  EventID = WaitWindowEvent()
  
  Select EventID
    Case #PB_EventGadget
      Select EventGadgetID()
          
        Case #btn1 ; Rien, juste pour exemple
          
        Case #btn2
          
      EndSelect
      
    Case #PB_Event_CloseWindow : Quitter = fermeture()
      
  EndSelect
  
Until Quitter

End

Publié : jeu. 02/déc./2004 18:47
par Jacobus
:D Merci à vous deux
@ Filperj :
- En effet, déclarer EventID en Global m'a complètement échappé...
@Régis,LSI
- Pour ce qui est de me compliquer l'existence, c'est courant. Tant que je ne verrai pas ou que je n'aurai pas assimilé les finesses du code, je pense que ça m'arrivera d'autre fois. Ta procédure est sans bavure...clean.

@+ Jacobus