Avertissement avant fermeture de programme

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Avertissement avant fermeture de programme

Message 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
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.
filperj
Messages : 395
Inscription : jeu. 22/janv./2004 1:13

Message 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.
Le chaos l'emporte toujours sur l'ordre
parcequ'il est mieux organisé.
(Ly Tin Wheedle)
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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
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 :

Message 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
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.
Répondre