Form MDI Child qui ne retourne pas à sa taille d'origine s'il est le seul ouvert

Fermé
Leon_1998 Messages postés 4 Date d'inscription mardi 17 mars 2020 Statut Membre Dernière intervention 18 mars 2020 - 17 mars 2020 à 12:00
yg_be Messages postés 22717 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 avril 2024 - 18 mars 2020 à 11:40
Bonjour,

J'ai un formulaire principal qui est un MDIParent et plusieurs formulaires qui sont des MDIChild.

J'aimerai que lorsqu'un MDIChild est ouvert, qu'il vérifie s'il est le seul d'ouvert et donc si c'est le cas qu'il s'ouvre à sa taille d'origine.
Si plusieurs MDIChild sont ouverts alors je fais appelle à la méthode LayoutMdi pour placer les formulaires enfants de sorte à remplir le parent.

J'ai plus ou moins réussi mais au bout d'un certains nombre de formulaires ouverts/fermer ça ne fonctionne plus. Le dernier enfant encore ouvert ne reprend pas sa taille d'origine.

Voici le code du formulaire parent :
Public Class FormPrincipal
    ' Code principal :
    Public Form_Fermer As Boolean ' Déclaration d'une variable booléen publique, prendra la valeur "True" lorsqu'un formulaire est fermer.
    Public Form_Ouvert As Boolean ' Déclaration d'une variable booléen publique, prendra la valeur "True" lorsqu'un formulaire est ouvert.
    Public Nb_Form_Ouvert As Integer ' Déclaration d'une variable entier publique, incrémenter de 1 à chaque fois qu'un formulaire fille est actif.
    Public Alone_Form As New Form
    Public Alone_Form_Last_Known_Width, Alone_Form_Last_Known_Height As Integer
    Private Sub FormPrincipal_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Form_Fermer = False ' Le booléen Form_Fermer prend la valeur "False" puisqu'aucun formulaires filles est actifs au lancement de l'application.
        Form_Ouvert = False ' Le booléen Form_Fermer prend la valeur "False" puisqu'aucun formulaires filles est actifs au lancement de l'application.
        TimerCheckForAloneForm.Enabled = True ' Activation du Timer.
        'Me.IsMdiContainer = True
        Alone_Form.MdiParent = Me
        Nb_Form_Ouvert = 0
    End Sub
    Public Sub Redimensionnement() ' Méthode publique qui redimensionne tous les formulaires filles actifs à l'orizontal de gauche à droite.
        LayoutMdi(MdiLayout.TileVertical) ' Méthode définissant la disposition des formulaires enfants MDI (ici à la verticale).
    End Sub
    Private Sub TimerCheckForAloneForm_Tick(sender As Object, e As EventArgs) Handles TimerCheckForAloneForm.Tick
        If Form_Fermer Or Form_Ouvert Then
            If Nb_Form_Ouvert = 1 Then
                Alone_Form.Size = New Size(Alone_Form_Last_Known_Width, Alone_Form_Last_Known_Height)
            Else
                Redimensionnement() ' Appel de la méthode Redimensionnement() pour redimensionner les formulaires filles actifs.
            End If
            Form_Fermer = False
            Form_Ouvert = False
        End If
    End Sub
End Class


Et voici le code de l'un des enfants :
Public Class Form1
    Dim OriginW As Integer
    Dim OriginH As Integer
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        OriginW = 816
        OriginH = 489
        TimerCheckIfHeIsAlone.Enabled = True
        FormPrincipal.Nb_Form_Ouvert += 1
        FormPrincipal.Form_Ouvert = True

        For Each Control In Me.Controls ' Ancrage des contrôles du formulaire au centre du formulaire
            Control.Anchor = AnchorStyles.None
        Next
    End Sub
    Private Sub Form1_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
        FormPrincipal.Nb_Form_Ouvert -= 1
        FormPrincipal.Form_Fermer = True
    End Sub
    Private Sub TimerCheckIfHeIsAlone_Tick(sender As Object, e As EventArgs) Handles TimerCheckIfHeIsAlone.Tick
        If FormPrincipal.Nb_Form_Ouvert = 1 Then
            FormPrincipal.Alone_Form_Last_Known_Width = OriginW
            FormPrincipal.Alone_Form_Last_Known_Height = OriginH
            FormPrincipal.Alone_Form = Me
        End If
    End Sub
End Class


C'est pas du grand art mais c'est censé fonctionner.

Est-ce qu'il y aurait une erreur que je n'ai pas vu ? Merci.

Bien à vous, Léon.

3 réponses

yg_be Messages postés 22717 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 avril 2024 1 476
17 mars 2020 à 14:16
bonjour, moi j'essaierais d'afficher FormPrincipal.Nb_Form_Ouvert dans un contrôle du formulaire principal, de façon à vérifier si la valeur est correcte.
n'est-il pas possible aussi d'afficher quelque chose dans les formulaires enfants, qui indique que le timer est actif?
0
Leon_1998 Messages postés 4 Date d'inscription mardi 17 mars 2020 Statut Membre Dernière intervention 18 mars 2020
17 mars 2020 à 21:42
J'ai déjà essayé et tous marche correctement.
0
yg_be Messages postés 22717 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 avril 2024 1 476
17 mars 2020 à 21:49
vérifions donc que le code en lignes 21 à 23 du code d'un enfant est bien exécuté, par exemple en y ajoutant un msgbox.
0
Leon_1998 Messages postés 4 Date d'inscription mardi 17 mars 2020 Statut Membre Dernière intervention 18 mars 2020
18 mars 2020 à 09:01
Effectivement le problème vient de là, les variables Width et Height prennent bien les valeurs de tailles d'origine du formulaire.

Mais ce dernier garde pour taille celle de lorsqu'il était repositionné par la méthode LayoutMdi(MdiLayout.TileVertical).
0
yg_be Messages postés 22717 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 avril 2024 1 476
18 mars 2020 à 09:55
toute cette logique me semble foireuse, tu as de la chance que cela fonctionne souvent.
à quoi sert le timer des formulaires filles? pourquoi ne pas faire ce qu'il fait quand un formulaire s'ouvre ou se ferme?
0
Leon_1998 Messages postés 4 Date d'inscription mardi 17 mars 2020 Statut Membre Dernière intervention 18 mars 2020 > yg_be Messages postés 22717 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 avril 2024
18 mars 2020 à 10:41
Le timer vérifie chaque milliseconde le nombre de formulaires ouverts et s'il y en a qu'un, alors ce dernier et considéré comme le seul. Je comprend ta deuxième question mais je ne visualise pas comment mettre ça en place.
0
yg_be Messages postés 22717 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 avril 2024 1 476 > Leon_1998 Messages postés 4 Date d'inscription mardi 17 mars 2020 Statut Membre Dernière intervention 18 mars 2020
18 mars 2020 à 11:40
je pense que tu n'as pas réfléchi à la séquence des opérations. que se passe-t'il si tu fermes un formulaire fils, et que le timer du formulaire parent déclenche avant le timer du formulaire fils?
pourquoi ne pas faire une fonction qui remplace le timer du formulaire fils, et appeler cette fonction quand un formulaire fils s'ouvre ou se ferme?
ensuite, quand tout fonctionnera, ce serai bien de supprimer le timer du formulaire parent.
0