Comportement surprenant lorsqu'on clique sur la croix en haut à droite pour fermer une fenêtre

Le
Gilbert Tordeur
Bonjour,

Ceci est une application simpliste pour mettre en évidence le comportement
que je trouve étrange.

Je crée une application Windows Form en VB2005. J'ajoute une textbox et je
programme son événement Validating pour refuser quasi toute entrée :
If Me.TextBox1.Text > " " Then e.Cancel = True

Je programme l'événement FormClosing pour détecter quand j'y passe:
MessageBox.Show("FormClosing")

Je lance l'application. J'entre une valeur erronée "a" dans ma textbox puis
je clique en haut à droite sur la croix pour fermer la fenêtre. Je passe
bien dans ma routine FormClosing, mais la fenêtre ne se ferme pas et je
reste sur ma textbox.

Pour moi il y a incohérence de comportement : ou bien le clic sur la croix
déclenche un événement de validation (CausesValidation = True) (ce qui est
effectivement le cas) et je ne devrais pas exécuter FormClosing, ou bien il
n'en déclenche pas et le formulaire devrait se fermer.

Qu'en pensez-vous ? Où le clic sur la croix est-il documenté dans .NET ?

Merci d'avance,
Gilbert
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Fred
Le #12208481
Dans : news:,
Gilbert Tordeur disait :
Bonjour,



Bonjour,

Ceci est une application simpliste pour mettre en évidence le
comportement que je trouve étrange.

Je crée une application Windows Form en VB2005. J'ajoute une textbox
et je programme son événement Validating pour refuser quasi toute
entrée : If Me.TextBox1.Text > " " Then e.Cancel = True

Je programme l'événement FormClosing pour détecter quand j'y passe:
MessageBox.Show("FormClosing")

Je lance l'application. J'entre une valeur erronée "a" dans ma
textbox puis je clique en haut à droite sur la croix pour fermer la
fenêtre. Je passe bien dans ma routine FormClosing, mais la fenêtre
ne se ferme pas et je reste sur ma textbox.

Pour moi il y a incohérence de comportement : ou bien le clic sur la
croix déclenche un événement de validation (CausesValidation = True)
(ce qui est effectivement le cas) et je ne devrais pas exécuter
FormClosing, ou bien il n'en déclenche pas et le formulaire devrait
se fermer.



Cela me paraît cohérent.
L'évènement Validating est traité.
Puis FormClosing est appelé avec le Cancel positionné à True.
S'il en était autrement, on n'aurait pas de possibilité de forcer la
fermeture de la fenêtre.

--
Fred

Fred
Le #12208471
Dans : news:,
Fred disait :

L'évènement Validating est traité.
Puis FormClosing est appelé avec le Cancel positionné à True.



Plus de détails :
Lorsque la fenêtre reçoit le message de fermeture, la boucle de
traitement des messages (WndProc) appelle la méthode WmClose de la Form.
Cette procédure valide tous les contrôles en récupérant les éventuelles
annulations, puis, en dernier lieu, appelle la méthode OnFormClosing en
lui passant (dans le e.Cancel) le résultat de ces validations.
Ensuite, selon le retour dans e.Cancel, la Form est effectivement fermée
ou non.

--
Fred

Gilbert Tordeur
Le #12208461
"Fred"
Dans : news:,
Fred disait :

L'évènement Validating est traité.
Puis FormClosing est appelé avec le Cancel positionné à True.



Plus de détails :
Lorsque la fenêtre reçoit le message de fermeture, la boucle de traitement
des messages (WndProc) appelle la méthode WmClose de la Form.
Cette procédure valide tous les contrôles en récupérant les éventuelles
annulations, puis, en dernier lieu, appelle la méthode OnFormClosing en
lui passant (dans le e.Cancel) le résultat de ces validations.
Ensuite, selon le retour dans e.Cancel, la Form est effectivement fermée
ou non.

--
Fred




Merci Fred.

Donc si je te comprends bien, le fait d'appeler quand même la procédure
correspondant au bouton sur lequel je clique est exceptionnel, et ne
concerne que les boutons situés dans la barre de titre. A moi, dans
FormClosing, de conserver la valeur de e.Cancel ou de la modifier selon ce
que je souhaite.

Bonne journée,
Gilbert
Publicité
Poster une réponse
Anonyme