IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Comment créer une collection de Label qui pourra être accédée dans un autre module [Débutant]


Sujet :

VB.NET

  1. #1
    Membre régulier

    Profil pro
    Retraité (Travailleur autonome)
    Inscrit en
    Octobre 2008
    Messages
    82
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : Canada

    Informations professionnelles :
    Activité : Retraité (Travailleur autonome)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 82
    Points : 75
    Points
    75
    Billets dans le blog
    1
    Par défaut Comment créer une collection de Label qui pourra être accédée dans un autre module
    J'ai créé plusieurs Labels qui jouent le rôle d'onglets pour faire afficher des pages différentes d'un TabControl. Je sais, j'aurais pu utiliser les onglet du TabControl mais je les trouve trop laids. Je jeux créer une collection formée de ces Onglets (labels) de telle sorte que je puisse coder les événement (MouseEnter, MouseLeave, MouseDown, MouseUp et MouseClick) en un seul endroit c'est-à-dire dans un module. Ceci me permettrait de gérer les Onglets (labels) créés dans différents formulaires sans devoir réécrire le code de gestion des événements dans chaque formulaire. Je dois pouvoir accéder non seulement à l'onglet (label) qui est le "sender" mais aussi aux autres labels sur lesquels je dois pouvoir modifier la taille et la position.

    J'utilise Visual Studio 2013

    Je ne sais pas si cela est possible, mais si ça l'est, j'aimerais savoir comment procéder.

    Merci de vos suggestions.

  2. #2
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Là, je viens juste de changer mon disque dur et de réinstaller VS. Je n'ai pas de code sous la main.

    Mais, en partant, on peut déjà regrouper les mêmes événements des contrôles identiques d'une Form dans la même procédure d'événement en raboutant les noms des contrôles après la clause Handles. et au besoin on utilise le Sender.name pour les cas spéciaux. Cela devrait ressembler à cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub Machin_Click() handles Bouton1_Click, Bouton2_Click
    ' Un programme commun
       JAiCliquéUnBouton
    end sub
    ou bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub Machin_Click() handles Bouton1_Click, Bouton2_Click
    ' Mettre le traitement
       select case Sender.name
          case  "Bouton1"
             messagebox.show("Bouton1")
          case  "Bouton2"
             messagebox.show("Bouton2")
          case else
      end select
    end sub
    Et je te laisse imaginer toutes les autres variantes

    Ou bien, tu te crées une classe personnelle qui hérite de la classe Button, ou Label, plutôt. Mais là comme cela, je ne suis pas encore organisé pour le faire. Mais, à bien y penser, c'est probablement (beaucoup) plus intéressant que le premier truc.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  3. #3
    Membre régulier

    Profil pro
    Retraité (Travailleur autonome)
    Inscrit en
    Octobre 2008
    Messages
    82
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : Canada

    Informations professionnelles :
    Activité : Retraité (Travailleur autonome)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 82
    Points : 75
    Points
    75
    Billets dans le blog
    1
    Par défaut
    Merci pour l'intérêt que tu portes à ma problématique.

    Je suis relativement nouveau au forum et, je l'avoue, je n'ai pas donné toutes les informations pertinentes lors de la rédaction de mon premier message.

    Je suis du genre inventif... J'ai pensé à un système qui me permettra d'ajouter de très nombreuses pages à mes TabControl et par conséquent, je devrai sauver de l'espace pour afficher tous les onglets. Voici ce à quoi j'ai pensé:

    Tous les onglets sont créés dans l'éditeur. Le texte qui s'affiche est constitué d'un numéro. 1, 2, 3, 4, 5... Cependant, le véritable texte de l'onglet est inscrit dans le ToolTip de chaque onglet. Au survol de l'onglet, (MouseEnter), la propriété "Text" est modifié et utilise le texte du ToolTip. Or ce texte est évidemment plus large que seulement un chiffre. Je dois donc déplacer les autres onglets qui suivent (ceux-ci conservent leur numéro) en rapport avec la nouvelle largeur de l'onglet "sender". Je dois aussi procéder à l'inverse au moment de l'événement MouseLeave. Or, je peux facilement, et je le fais déjà, accéder aux événement du sender mais les autres onglets ne sont pas accessible dans la même procédure. C'est pourquoi j'ai pensé à créer une collection de Labels qui serait Publique afin d'accéder à chaque item de la collection (position et taille) quelque soit le formulaire de provenance.

    J'ai cherché sur Internet des instructions pour la création d'une collection publique d'objets mais toutes les informations se sont avérées inapplicables.

    Voilà le noeud du problème.

    Merci encore de l'intérêt.

    Pierre

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    ce que tu veux faire nécessite peut etre plus d'expérience
    ce n'est pas que c'est forcément compliqué à coder, mais c'est plus compliqué de le faire en codant proprement, en pensant à tout et en évitant de réinventer du code qui existe dans déjà le framework

    déjà le tabcontrol on peut modifier son affichage (pas toujours simple mais faisable) et son comportement
    ton système de label c'est peut etre plus simple, mais pour qu'il marche en mode design un peu comme le tabcontrol c'est déjà plus du haut niveau

    après le fait que les labels (headers) soient accessibles en public je ne vois pas l'utilité, ca ressemble plus à un défaut de conception
    normalement c'est le form affichant le "tabcontrol" qui gère celui ci
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre régulier

    Profil pro
    Retraité (Travailleur autonome)
    Inscrit en
    Octobre 2008
    Messages
    82
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : Canada

    Informations professionnelles :
    Activité : Retraité (Travailleur autonome)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 82
    Points : 75
    Points
    75
    Billets dans le blog
    1
    Par défaut
    Merci Pol63.

    Si ce n'est pas compliqué à coder alors je peux le faire. Tout ce dont j'ai besoin, c'est de savoir comment faire pour créer une collection de labels accessibles dans un module standard.

    J'apprécierais un coup de pouce pour me lancer.

    Merci encore.

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    pour faire une collection de label il suffit de faire un List(Of Label)
    et accessible de partout c'est public shared dans une classe ou public dans un module ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre régulier

    Profil pro
    Retraité (Travailleur autonome)
    Inscrit en
    Octobre 2008
    Messages
    82
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : Canada

    Informations professionnelles :
    Activité : Retraité (Travailleur autonome)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 82
    Points : 75
    Points
    75
    Billets dans le blog
    1
    Par défaut
    Grand merci Pol63

    Il ne reste plus qu'à connaître la syntaxe pour incorporer à la Liste, les labels (Onglets) qui sont déjà dans l'interface.

    Dans le module d'objet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Shared Onglets As New List(Of Label)
        Ici, ajouter les labels dans la liste
        ...
    Dans le module standard:

    Il faut aussi savoir comment déterminer la taille et la position des Labels.

    Merci encore

  8. #8
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Bonjour à tous,

    La problématique des ajouts-retraits d'onglets dans un TabControl soulevée dans cette discussion m'a interpellée ...
    Il est certes facile de retirer un onglet et de le remettre mais ça se corse si on veut en retirer plusieurs "expressément" désignés (par leur text ou par leur indice dans le TabControl) et d'en remettre, certains plutôt que d'autres, à des emplacements "expressément" désignés.
    Ma toute première idée était de stocker les pages (onglets) avec leur text et leur indice ..., il n'est malheureusement pas possible de se fier aux indices car ils changent au fur et à mesure des insertions et des retraits.

    J'ai donc réalisé un petit programme, pour voir ..., je mets le code ci-dessous et le dossier de développement complet en ZIP attaché (TabControl.zip).

    A noter que j'utilise-là un tableau "ordinaire" d'objets de type "TabPage", c'est dû à mes méthodes archaïques de programmation ... , mais Pol à raison, l'usage d'une collection de type List(Of TabPage) est tout-à-fait approprié et mon algorithme serait plus simple, notamment parce qu'il ne faut pas gérer la taille d'une List(Of ...).

    Ces codes ne répondent probablement pas à tes besoins mais j'espère qu'ils t'inspireront pour solutionner ton problème.

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
        Private Sub EnleverOuRemettreUnePage(ByVal Choix As Byte, ByRef LesTabs As TabControl, Optional ByVal TextPage As String = "", Optional ByVal IndicePage As Integer = -1) ' 0 = Retrait / 1 = Insertion                                =)
            Static NombrePagesStockees As Integer = -1
            Static Pages() As TabPage
            Dim IdxPages As Integer  'indice pour lestockage dans le tableau Pages()
            Dim i As Integer
     
            Select Case Choix
                Case 0      ' retirer une page du TAbControl et la stocker dans Pages()
                    If LesTabs.RowCount = 0 Then  ' Pas la peine de traiter si TabControl déjà vide
                        Exit Sub
                    End If
                    If NombrePagesStockees < 0 Then  ' Initialisation du tableau Pages pour la première fois.
                        ReDim Pages(0)
                        IdxPages = 0   ' Indice dans le tableau pour le 1er stockage
                        NombrePagesStockees = 0
                    ElseIf NombrePagesStockees >= Pages.Length Then  ' Agrandir le tableau quend nécessaires.
                        ReDim Preserve Pages(Pages.Length)
                        IdxPages = Pages.Length - 1 ' Indice dans le tableau pour ce stockage
                    Else
                        For i = 0 To Pages.Length - 1
                            If Pages(i) Is Nothing Then
                                IdxPages = i    ' Premier posiiton disponible dans le tableau pour ce stockage
                                Exit For
                            End If
                        Next
                    End If
                    If TextPage = "" And IndicePage < 0 Then  ' A-t-on les infos nécessaires ?
                        i = LesTabs.SelectedIndex       'Si aucune info, indice de l'onglet de 1er plan
                    ElseIf TextPage = "" Then
                        i = IndicePage    'Si l'indice de l'onglet est donné
                    Else
                        For i = 0 To LesTabs.TabCount - 1   'Si seul le text de l'ongle est donné, cherchons l'indice
                            If LesTabs.TabPages(i).Text = TextPage Then
                                Exit For
                            End If
                        Next i
                    End If
                    If i = LesTabs.TabCount Or i < 0 Then ' Si pas d'indice trouvé, mieux vaut se tirer de là 
                        Exit Sub
                    End If
                    Pages(IdxPages) = MesTab.TabPages.Item(i) ' Si on estarrikvé ici :D))), stocker la page 
                    NombrePagesStockees += 1    ' Comptabiliser ... 
                    LesTabs.TabPages.RemoveAt(i) ' et retirer la page du TabControl 
     
                Case 1      ' rechercher une page dans Pages(), l'insérer à l'indice donné dans le TAbControl, l'enlever du stock
                    If IndicePage < 0 Then   ' Si la  position d'insertion n'est pas donnée, ce sera la 1ère position (indice 0 du TabControl)
                        IndicePage = 0
                    End If
                    If TextPage = "" Then   ' Si le text de la page à inserrer n'est pas donné, ce sera la dernière page disponible dans le tableau Pages
                        IdxPages = Pages.Length - 1
                        While IdxPages >= 0 AndAlso Pages(IdxPages) Is Nothing  ' Veiller à ce la page evisagée dans le tableauPAges ne soitr pas Nothing
                            IdxPages -= 1
                        End While
                    Else
                        For i = 0 To Pages.Length - 1  ' Si le text de la page à inserrer est donné, charcher cette page dans le tableau Pages
                            If Not (Pages(i) Is Nothing) AndAlso Pages(i).Text = TextPage Then
                                IdxPages = i
                                Exit For
                            End If
                        Next i
                    End If
                    If i = Pages.Length Or IdxPages < 0 Then   'Pour le cas où text n'est pas trouvé ou bien que le tableau Pages n'a plus de pages disponibles
                        Exit Sub
                    End If
                    LesTabs.TabPages.Insert(IndicePage, Pages(IdxPages))  ' Si on estarrikvé ici :D))), placer la page da&nsq le TabControl
                    NombrePagesStockees -= 1  ' Comptabiliser ...                
                    Pages(IdxPages) = Nothing  ' et retirer la page du tab;leau Pages 
            End Select
        End Sub
     
        Private Sub BInsertion_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BInsertion.Click
            If TNomPage.Text > "" And TNumPage.Text > "" Then
                EnleverOuRemettreUnePage(1, MesTab, TNomPage.Text, TNumPage.Text)  ' insertion à la position désignée de la page désignée 
            ElseIf TNomPage.Text > "" Then
                EnleverOuRemettreUnePage(1, MesTab, TNomPage.Text)  ' insertion en première position de la page désignée par son text
            ElseIf TNumPage.Text > "" Then
                EnleverOuRemettreUnePage(1, MesTab, , TNumPage.Text)  ' insertion à la position désignée de la dernière page stockée 
            Else
                EnleverOuRemettreUnePage(1, MesTab)   ' insertion en première position de la dernière page stockée
            End If
        End Sub
     
        Private Sub BRetrait_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BRetrait.Click
            If TNomPage.Text > "" Then
                EnleverOuRemettreUnePage(0, MesTab, TNomPage.Text)  ' retrait de la page désignée par son text
            ElseIf TNumPage.Text > "" Then
                EnleverOuRemettreUnePage(0, MesTab, , TNumPage.Text)  ' retrait de la page désignée par son indice
            Else
                EnleverOuRemettreUnePage(0, MesTab)   ' retrait de la page d'avant-plan
            End If
        End Sub
    Nom : TabControl.jpg
Affichages : 375
Taille : 25,2 Ko

  9. #9
    Membre régulier

    Profil pro
    Retraité (Travailleur autonome)
    Inscrit en
    Octobre 2008
    Messages
    82
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : Canada

    Informations professionnelles :
    Activité : Retraité (Travailleur autonome)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 82
    Points : 75
    Points
    75
    Billets dans le blog
    1
    Par défaut
    Merci Phil Rob,

    En effet, ça ne répond pas à mes besoins mais je te montre l'effet recherché. Jusqu'ici, le code pour faire ça est dans le module du formulaire. L'idée consiste à le mettre dans un module standard de sorte qu'il puisse être exécuté pour tout formulaire comportant un ou plusieurs TabControl.

    Ici, le pointeur de la souris provoque un MouseEnter sur le label qui sert d'onglet au TabControl. Le texte du ToolTip servira à afficher le texte du Label. Un calcul est fait pour repositionner les autres onglets sur la base de la largeur de l'onglet #4

    Nom : Onglets.jpg
Affichages : 341
Taille : 9,3 Ko

    Une fois le Click effectué, voici la nouvelle disposition des onglets.
    Nom : Onglets2.jpg
Affichages : 328
Taille : 7,2 Ko

    Cela servira à sauver de l'espace quand il y aura plus d'onglets qu'il n'est possible d'en afficher. De plus, je trouve ça plus agréable à regarder que les onglets du TabControl.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 26/01/2016, 20h54
  2. Comment créer une collection d'objets logiques ?
    Par Ehjoe dans le forum VB.NET
    Réponses: 3
    Dernier message: 05/03/2011, 17h12
  3. Réponses: 2
    Dernier message: 22/02/2008, 16h14
  4. Réponses: 2
    Dernier message: 16/05/2007, 16h13
  5. Comment créer une collection d'objet ?
    Par ced600 dans le forum VBScript
    Réponses: 3
    Dernier message: 11/09/2006, 10h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo