REDIMENSIONNEMENT AUTOMATIQUE DU CONTENU D'UN FORM EN VB.NET

Messages postés
379
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
20 avril 2011
- - Dernière réponse : cs_claudetom
Messages postés
115
Date d'inscription
jeudi 11 octobre 2001
Statut
Membre
Dernière intervention
15 octobre 2012
- 19 juil. 2012 à 10:58
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/36148-redimensionnement-automatique-du-contenu-d-un-form-en-vb-net

scortex84
Messages postés
379
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
20 avril 2011
1 -
Hello.
C'est pas mal, le ptit plus c'est le redimensionnement des polices (qui marche pas terrible chez moi...).

Je veux pas faire mon rabajoie, mais en utilisant les encres (proprieté anchor des composants), on arrive au meme résultat...

Remarquez moi j'avais codé des lignes et des lignes de codes il y a quelques années tout ça pour découvrir que "instr" faisait la meme chose... ;-) On en apprend tous les jours !

Bonne programmation à toutes (y'en a ?) et à tous !
Seb.
chris_brabant
Messages postés
64
Date d'inscription
dimanche 24 juillet 2005
Statut
Membre
Dernière intervention
29 septembre 2014
-
j'aimerais bien que tu me montres un exemple de Form COMPLEXE, c'est à dire avec des onglets, avec des Panels, des GroupBoxes, des DataGrids, etc.... et dont le redimensionnement fonctionne nickel avec les Anchor, ca m'intéresse. Dans mon cas, j'ai 5 onglets, avec au total environ 200 contôles...

J'ai trouvé des exemples sur Internet, mais d'une part, il faut bidouiller avec le Concepteur du projet, ce qui n'est pas génial, l'ORDRE dans lequel on positionne les Anchor sur les objets est apparemment important, et de plus, si tu décides pour une raison X ou Y de rajouter un Conteneur en plein milieu de ta Form, ca chamboule toute l'interaction entre les Anchor. Il faut alors tout reprendre à zéro pour prendre en compte le conteneur ajouté.

qu'en penses-tu ?
scortex84
Messages postés
379
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
20 avril 2011
1 -
Hello,
J'ai l'impression que tu as mal pris ma critique. Je ne voulais pas te vexer, tu as fait du bon boulot !

Perso je n'ai pas de form aussi complexe que la tienne (elle met combien de temps à se charger ? 30 secondes ?!), mais j'utilise les encres sur des forms pas mal complexes tout de meme (comme toi plusieurs onglets, etc, etc). Et entre les panels, les onglets, et tous les conteneurs qui existent je m'en sors bien. Evidement, il faut pour chaque control définir l'encre dans le concepteur, ce qui peut etre galère quand on en a 200 (200?! wahou j'en reviens pas...). Par contre le fait d'ajouter un conteneur, ou meme l'ordre dans lequel tu définis les encres n'influe en rien sur la mise en page.
Par contre je voudrais savoir une chose : pour tes onglets, tu utilises des "tabcontrol" ? Si oui, rencontres-tu le fameux bug de la réorganisation des tabs aléatoirement (bug référencé par microsoft, sans aucun correctif à priori) ? Ou as-tu trouvé une solution ?
Seb.
chris_brabant
Messages postés
64
Date d'inscription
dimanche 24 juillet 2005
Statut
Membre
Dernière intervention
29 septembre 2014
-
non non, je n'ai pas mal pris ta critique qui n'en est pas vraiment une en plus...
simplement je ne vois pas comment utiliser les Anchor dans mon cas.

Pour ce qui est de la quantité de controles, pour une interface de base de données ou il y a des masques de saisie avec pas mal de champs, les 200 controles sont vite atteints (textBox, Combobox, Labels pour chaque champ)

J'utilise bien les tabControls, mais je n'ai pas constaté de bug particulier. Quel est ce bug exactement ?

Chris
scortex84
Messages postés
379
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
20 avril 2011
1 -
Re
Le bug fait que le tabcontrol change l'ordre des tabs aléatoirement. Autant tu vas ouvrir le concepteur 10 fois sans aucun soucis, puis la 11 ieme fois, toutes les tabs vont changer de sens. Ca agace !

Voilou !
Seb.
chris_brabant
Messages postés
64
Date d'inscription
dimanche 24 juillet 2005
Statut
Membre
Dernière intervention
29 septembre 2014
-
ah oui, je vois c'est en effet très pénible, mais j'en ai pris mon parti maintenant.
amsa44
Messages postés
1
Date d'inscription
jeudi 9 mars 2006
Statut
Membre
Dernière intervention
7 avril 2006
-
salam comment va je te remercie et te felicite
Utilisateur anonyme -
Contre le prob de tabescontrols qui changent de place tu peux n'ajouter les Tabs qu'au moment du form_load en les mettant dasn l'ordre exemple :
Me.TabStrip.Controls.Add(Me.Tab1) 1er
Me.TabStrip.Controls.Add(Me.Tab2) 2è
Me.TabStrip.Controls.Add(Me.Tab3) 3è
Me.TabStrip.Controls.Add(Me.Tab4) 4è
LeWolf
Messages postés
32
Date d'inscription
mardi 14 août 2001
Statut
Membre
Dernière intervention
29 décembre 2008
-
Super source,
Mais le resize n'aime pas trop mes listbox.
Après réduction de la feuille et réagrandissement pfuit ....

Sinon super boulot
capuccino_fr
Messages postés
113
Date d'inscription
vendredi 5 mars 2004
Statut
Membre
Dernière intervention
11 février 2008
-
Et ben voila c'est tres bon
2 minutes et j'ai tout compris, ca fonctionne du 1er coup. Magique !!
Merci man, 10/10

@++
swan94
Messages postés
255
Date d'inscription
jeudi 29 juillet 2004
Statut
Membre
Dernière intervention
2 avril 2010
-
Bravo et merci de fournir une telle source.

Cependant, une question : Comment faire quand tu créée des contrôles dynamiquement ?

Merci à toi
thepoe
Messages postés
30
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
1 juin 2011
-
Salut à tous.

en .net, il suffit d'organiser sa form avec des tableaux et la propriété dock des objets en fill, les redimensionnement se font tout seul.

Bonne continuation
capuccino_fr
Messages postés
113
Date d'inscription
vendredi 5 mars 2004
Statut
Membre
Dernière intervention
11 février 2008
-
Problème: quand je réduis la fenêtre, et que je la rends visible de nouveau. J'ai cette fenêtre mais avec juste le coin haut gauche. On a l'impression d'un zoom sur un carré en haut à gauche de la fentre... Est-ce déjà arrivé à quelqu'un ?
cs_bidouille007
Messages postés
257
Date d'inscription
jeudi 11 septembre 2008
Statut
Membre
Dernière intervention
22 décembre 2012
1 -
Bien dommage que cette source ne fonctionne pas en VB NET 2008. snif
SgtKabukinan
Messages postés
106
Date d'inscription
lundi 20 septembre 2004
Statut
Membre
Dernière intervention
23 janvier 2010
-
Si si ça marche très bien après import sous Visual Studio 2008

Par contre il ne faut absolument pas réduire la fenêtre dans la barre des taches puis la réafficher.

En tout cas très bon code, je vais essayer de voir ou est le problème.
bon alors

j'ai rajouté une propriété à ta classe :
Public lastFormState As Windows.Forms.FormWindowState

et ensuite dans le resize :

If Me.WindowState <> Windows.Forms.FormWindowState.Minimized And Me.Created And Me.IsHandleCreated And formSizer.lastFormState <> FormWindowState.Minimized Then
' mettre False dans DoResize pour que les polices gardent leur taille initiale
formSizer.DoResize(Me, True, facteur_redim_datagrids)
End If
If formSizer.lastFormState = FormWindowState.Minimized Then
formSizer.InitResize(Me)
End If
formSizer.lastFormState = Me.WindowState

et j'ai supprimé le code dans l'évènement size_changed.

Et je n'ai plus ce problème.

Bon coding à tous
cs_claudetom
Messages postés
115
Date d'inscription
jeudi 11 octobre 2001
Statut
Membre
Dernière intervention
15 octobre 2012
-
Bonjour,
Intéressant mais je me suis permis juste pour le plaisir de le modifier légèrement
Maintenant juste la création du composant est nécessaire sur la form plus besoin de spécifier d'autres choses
donc dans la form juste :
Private formSizer As ControlsResize = New ControlsResize(True, Me, True, ValueForDatagrid) doit être présent.
Possibilité de passer chaque valeurs, d'activer ou non le resize des composants

Imports System.Windows.Forms
Imports System.Collections
Imports System.Drawing

Public Class ControlsResize
    Inherits System.ComponentModel.Component

#Region "Variables locales"
    ' Variable nécessaire au concepteur.
    Private components As System.ComponentModel.Container = Nothing

    Public WithEvents Cont As Control
    Private FormParent As Form
    Public LastFormState As Windows.Forms.FormWindowState
    Public Facteur_redim_datagrids As Integer = 0
    Public AjustementPolice As Boolean
    Public ResizeActived As Boolean = False

    ' Structure pour mémoriser les dimensions
    Private Structure ControlProperties
        Public Top, Left, Height, Width, ContHeight, ContWidth As Integer
        Public FntSize As Single
        Public ctl As control
    End Structure

    ' Variable de mémorisation des dimensions de départ
    Private MemoSize As ArrayList = New ArrayList
#End Region

#Region " Constructeurs "
    Public Sub New(ByVal container As System.ComponentModel.IContainer)
        ' Requis pour la prise en charge du Concepteur de composition de classes Windows.Forms
        container.Add(Me)
        components = New System.ComponentModel.Container
    End Sub

    Public Sub New()
        ' Requis pour la prise en charge du Concepteur de composition de classes Windows.Forms
        components = New System.ComponentModel.Container
    End Sub

    Public Sub New(ByVal ResizeActived As Boolean, ByVal cc As Control, ByVal Ajuste_Polices As Boolean, ByVal facteur_redim_datagrids As Integer)
        MyBase.New()
        InitResize(ResizeActived, cc, Ajuste_Polices, facteur_redim_datagrids)
    End Sub

#End Region

#Region " Initialisation "
    ' paramètre "Ajuste_Polices" : Ajustement optionnel des polices
    ' mettre False pour que les polices gardent leur taille initiale
    Public Sub InitResize(ByVal ResizeActived As Boolean, ByVal cc As Control, ByVal Ajuste_Polices As Boolean, ByVal facteur_redim_datagrids As Integer)
        Me.ResizeActived = ResizeActived
        Me.Cont = cc
        Me.AjustementPolice = Ajuste_Polices
        Me.Facteur_redim_datagrids = facteur_redim_datagrids
        Me.MemoSize.Clear()
        Me.Init(Me.Cont)
    End Sub

    ' Sauvegarde valeurs de départ
    Private Sub Init(ByVal cc As Control)
        Dim ctl As Control
        Dim tCtlProp As ControlProperties = New ControlProperties

        For Each ctl In cc.Controls
            tCtlProp.Height = ctl.Height
            tCtlProp.Width = ctl.Width
            tCtlProp.Top = ctl.Top
            tCtlProp.Left = ctl.Left
            tCtlProp.FntSize = ctl.Font.Size
            tCtlProp.ContHeight = cc.Height
            tCtlProp.ContWidth = cc.Width
            tCtlProp.ctl = ctl
            Me.MemoSize.Add(tCtlProp)
            ' Appel récursif pour les contrôles enfants sauf pour les DataGrids
            If ctl.Controls.Count > 0 AndAlso Not TypeOf ctl Is DataGrid Then
                Me.Init(ctl)
            End If
        Next
    End Sub
#End Region

#Region "Méthodes publiques"

    ' Redimensionnement des contrôles
    Public Sub DoResize()
        If Me.ResizeActived Then Me.Resize()
    End Sub

    Private Sub Resize()
        Dim tCtlProp As ControlProperties
        Dim dProportionateHeight, dProportionateWidth As Single
        Dim i As Integer

        Try
            If Not Me.ResizeActived Then Exit Sub

            ' Redimensionnement des contrôles
            For i = 0 To MemoSize.Count - 1
                ' Récupération des valeurs initiales
                tCtlProp = MemoSize(i)
                ' Calcul des proportions largeur et hauteur
                dProportionateHeight = tCtlProp.ctl.Parent.Height / tCtlProp.ContHeight
                dProportionateWidth = tCtlProp.ctl.Parent.Width / tCtlProp.ContWidth

                ' Calcul des nouvelles dimensions
                tCtlProp.ctl.SetBounds(CType((tCtlProp.Left * dProportionateWidth), Integer), _
                            CType((tCtlProp.Top * dProportionateHeight), Integer), _
                            CType((tCtlProp.Width * dProportionateWidth), Integer), _
                            CType((tCtlProp.Height * dProportionateHeight), Integer))

                If Me.AjustementPolice Then  ' Ajustement des polices optionnelle sauf pour DataGrid
                    If Not TypeOf tCtlProp.ctl Is DataGrid Then
                        tCtlProp.ctl.Font = New Font(tCtlProp.ctl.Font.FontFamily, _
                            tCtlProp.FntSize * dProportionateHeight, _
                            tCtlProp.ctl.Font.Style)
                    End If
                End If
            Next

        Catch ex As Exception
            'on lève l'exception qui vient d'être interceptée
            ' pour la faire remonter au programme appelant
            Throw ex
        End Try
    End Sub

#End Region

    Private Sub Cont_HandleCreated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Cont.HandleCreated
        FormParent = Cont.FindForm 'Récupère la form conteneur
        Me.InitResize(ResizeActived, Cont, AjustementPolice, Facteur_redim_datagrids)
    End Sub

    Private Sub Cont_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Cont.Resize
        If Not FormParent Is Nothing Then
            If FormParent.WindowState <> Windows.Forms.FormWindowState.Minimized And Cont.Created And Cont.IsHandleCreated And LastFormState <> FormWindowState.Minimized Then
                Me.DoResize()
            End If
        End If

        If Me.LastFormState = FormWindowState.Minimized Then
            Me.InitResize(ResizeActived, Cont, AjustementPolice, Facteur_redim_datagrids)
        End If

        If Not FormParent Is Nothing Then LastFormState = FormParent.WindowState
    End Sub
End Class