Comportement surprenant lorsqu'on clique sur la croix en haut à droite pour fermer une fenêtre
3 réponses
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 ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Fred
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
Dans : news:er2BkXniIHA.944@TK2MSFTNGP05.phx.gbl,
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.
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
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
Dans : news:egybjYoiIHA.3740@TK2MSFTNGP03.phx.gbl,
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.
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
"Fred" a écrit dans le message de news:
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
"Fred" <foleide@free.fr.invalid> a écrit dans le message de news:
Ok0FrpoiIHA.4684@TK2MSFTNGP06.phx.gbl...
Dans : news:egybjYoiIHA.3740@TK2MSFTNGP03.phx.gbl,
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
foleide@free.fr
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.
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.