Un truc bien casse pied avec VB :

Vous avez une application ; dans une fenêtre vous affichez une autre fenêtre avec .ShowDialog

Dans certains cas après que l'utilisateur (ou votre code) ait fermé la fenêtre ouverte avec .ShowDialog, votre fenêtre de départ ne retrouve pas le focus. Pire elle peut être masquée par d'autres applications ouvertes !

Solution : ajouter Me.BringToFront() après l'appel de .ShowDialog :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
            CentrerFenetre(Me, FrmDiag)
            FrmDiag.ShowDialog()
            Me.BringToFront()
Code de la sub de centrage :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    Public Sub CentrerFenetre(FenetreActuelle As Form, FenetreAOuvrir As Form)
        'ATTENTION
        'Pour que ça fonctionne il faut que dans les propriétées de la fenête, StartPosition soit réglé sur Manual
        If FenetreAOuvrir.Width <= FenetreActuelle.Width Then
            FenetreAOuvrir.Left = CInt(FenetreActuelle.Left + (FenetreActuelle.Width - FenetreAOuvrir.Width) * 0.5)
        Else
            FenetreAOuvrir.Left = FenetreActuelle.Left
        End If
        If FenetreAOuvrir.Height <= FenetreActuelle.Height Then
            FenetreAOuvrir.Top = CInt(FenetreActuelle.Top + (FenetreActuelle.Height - FenetreAOuvrir.Height) * 0.5)
        Else
            FenetreAOuvrir.Top = FenetreActuelle.Top
        End If
    End Sub
Parfois, cette manipulation ne fonctionne pas, notamment dans le cas suivant :
- depuis une fenêtre A vous affichez une fenêtre B avec .ShowDialog()
- B correspond à un traitement, avec une barre de progression
- à la fin du traitement :
- en cas d'échec du traitement on ferme B et on revient à A
- en cas de succès du traitement on ferme B, on ferme A et on ouvre la fenêtre C

Ce cas de figure se présente lorsqu'on passe d'une étape à l'autre d'un traitement de données, l'étape 'i' étant la fenêtre A, l'étape 'i+1' étant la fenêtre C, et B étant la barre de progression

La solution consiste à utiliser le code suivant :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
'Dans le code de A :
    CentrerFenetre(Me, B)
    B.ShowDialog
    Me.BringToFront()
 
'Dans le code de B, en cas de succès (on "passe" de A à C) :
    Me.Hide()
    Call TransmettrePositionFenetre(A, C) 'Pour afficher C au même endroit que A
    C.Show()
    A.Hide()
 
'Dans le code de C, utiliser l’événement Shown :
    Private Sub C_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
        Me.BringToFront()
        Me.Focus()
    End Sub
 
'Dans un module :
    Public Sub TransmettrePositionFenetre(FenetreActuelle As Form, FenetreAOuvrir As Form)
        'ATTENTION
        'Pour que ça fonctionne il faut que dans les propriétées de la fenêtre StartPosition soit réglé sur Manual
        FenetreAOuvrir.Top = FenetreActuelle.Top
        FenetreAOuvrir.Left = FenetreActuelle.Left
    End Sub