Problème d'enregistrement avant de quitter

julien_boss Messages postés 165 Date d'inscription samedi 4 juin 2005 Statut Membre Dernière intervention 24 octobre 2007 - 17 févr. 2006 à 13:32
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011 - 18 févr. 2006 à 02:36
Un problème assez chiant il faut dire. Voilà, je vous explique :

le client quitter sur la pitite croix rouge, direction message WM_CLOSE :

case WM_CLOSE:

if(nbDroite>0 && bModified==true)
if(!SaveBeforeDo(hwnd)) //si SaveBeforeDo() retourne faux (=ne pas quitter)
return 0;

DestroyWindow(hwnd);
return 0;

Voici la fonction SaveBeforeDo() :

bool SaveBeforeDo(HWND hwnd)
{
int mess;

mess = MessageBox(hwnd, "Voulez-vous enregistrer les modifications ?",
"Enregistrer ?", MB_YESNOCANCEL | MB_ICONQUESTION);

if(mess == IDYES)
{
SendMessage(hwnd, WM_COMMAND,(WPARAM)IDM_SAVE, 0);
return TRUE;
}
else if(mess == IDNO)
return TRUE;
else
return FALSE;
}

Les fonctions marchent, seulement voilà comment ca se passe : le client veut enregistrer avant de quitter (admettons...), il clique sur "oui" dans la MessageBox(); qui est alors censé envoyer un message à IDM_SAVE, mais au lieu de cela, le compilateur exécute déjà les instructions à la suite dans WM_CLOSE, soit DestroyWindow()... puis elle envoie un message à IDM_SAVE.
Donc ca va pas quoi. Comment je peux interverdire cet ordre ?

6 réponses

olbal Messages postés 20 Date d'inscription vendredi 16 mai 2003 Statut Membre Dernière intervention 29 septembre 2006
17 févr. 2006 à 13:50
Il faudrait voir le code de traitement du message IDM_SAVE car SendMessage ne se termine qu'a la fin du traitement du message contrairement à PostMessage donc pas de problème. Si le code gérant IDM_SAVE lance la sauvegarde dans un autre thread, c'est sur par contre que ça doit aller au crash si t'attends pas la fin du thread...
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
17 févr. 2006 à 13:51
Si j'ai bien compris ce que tu veux, devrait aller ainsi:

case WM_CLOSE:
if(nbDroite>0 && bModified) {
switch(MessageBox(hwnd, "Voulez-vous enregistrer les modifications ?",
"Enregistrer ?", MB_YESNOCANCEL | MB_ICONQUESTION)) {
case IDYES:
// APPEL TA FONCTION ENREGISTREMENT ICI
// ET ON LAISSE ALLER DESSOUS, PAS DE BREAK
case IDNO:
goto goDESTROY;
}
return 0;
}
goDESTROY:
DestroyWindow(hwnd);
return 0;

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
julien_boss Messages postés 165 Date d'inscription samedi 4 juin 2005 Statut Membre Dernière intervention 24 octobre 2007
17 févr. 2006 à 14:07
En effet olbal, dans IDM_SAVE, il y a un autre SendMessage, à IDM_SAVEAS (si le client n'a pas déjà sauvegardé).
Donc en fait ca marche seulement si l'utilisateur avait sauvegardé avant, sinon nan.

BruNews ca me fait un peu chier d'écrire ma fonction qui demande d'enregistrer ou non ici, vu que je l'utilise plusieurs fois dans le programme
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
17 févr. 2006 à 14:15
Justement si est appelée plusieurs fois tu l'écris en fontion et ainsi juste un appel aux différents endroits.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
julien_boss Messages postés 165 Date d'inscription samedi 4 juin 2005 Statut Membre Dernière intervention 24 octobre 2007
17 févr. 2006 à 14:27
ca ne marche pas plus en faite. J'ai mieux ciblé le problème : dans IDM_SAVE, on envoie un mess à IDM_SAVEAS si on a pas enregistrer au préalable. Or le compilateur, on y revient, exécute d'abord DestroyWindow() avant d'aller voir IDM_SAVEAS
0
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
18 févr. 2006 à 02:36
à ce niveau, plutot que faire un envoi de message,

préférer plutot un appel de fonction

___________________________________________________________
Magicalement
Nono
0
Rejoignez-nous