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 :

Héritage de MainMenu


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 50
    Par défaut Héritage de MainMenu
    Bonjour à toutes et à tous,

    Je souhaiterais créer une fenêtre MDI de base avec un menu de base (Fichier > Quitter, Fenêtre > Réorganiser, Aide > A propos de) pour ensuite en hériter dans mes autres projets afin d'avoir une structure commune partout.

    Seulement, le designer ne veut pas que j'ajoute de nouveaux éléments de menu dans ma fenêtre héritée :
    Impossible d'ajouter un nouvel élément à ce menu, car il est hérité.
    Je ne comprends pas pourquoi... Mon menu est pourtant défini Protected, je devrais pouvoir le modifier dans la fenêtre enfant.

    Une idée sur ce comportement ?
    Il n'y a vraiment pas moyen de faire d'héritage de MainMenu ?

    Merci.

  2. #2
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour loki9481
    Ce comportement est semblable à celui d'un UserControl car un formulaire herite qu'il soit MDI ou non se comporte de la meme mainiere .
    La technique pour surmonter ce probleme est de "wrapper" les proprietes qu'on veut acceder -une à une- du control depose sur le form MDI par des prop dans le formulaire MDI comme cela se fait pour un UserControl.

    Dans ton cas il suffit de "wrapper" la prop MenuItems de MainMenu dans une simple prop publique de ton form MDI avec un attribut "browsable" pour la voir dans le designer apres avoir cree le form herite.......
    exemple code:
    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
     
    'projet lib(.dll) de ton form MDI 
    'l"attribut protected  bien sur sera mis sur MainMenu
    'nota-bene:la prop ne sera pas visibledans le designer dans projet actuel
    Imports System.ComponentModel
    Imports System.Windows.Forms.Menu
    Public Class frmMDI
     
        Public Sub New()
            ' Cet appel est requis par le Concepteur Windows Form.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
            Me.WindowState = FormWindowState.Maximized
            Me._myMenuItems = Me.MainMenu1.MenuItems
        End Sub
        'propriete de wrapper de la prop collection MenuItems 
        'qu'on veut acceder
        'Attribut :Browsable pour la voir(attention:apres ajout dans ton projet) dans le designer VS
        'et pouvoir ajouter des sous-menus
        Private _myMenuItems As MenuItemCollection
        <Browsable(True)> _
        Public Property MyMenuItems() As MenuItemCollection
            Get
                Return Me._myMenuItems
            End Get
            Set(ByVal value As MenuItemCollection)
                Me._myMenuItems = value
            End Set
        End Property
        'menu item classique de base New
        Private Sub NewMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NewMenuItem.Click
            Dim NewMDIChild As Form = New Form()
            'Set the Parent Form of the Child window.
            NewMDIChild.MdiParent = Me
            NewMDIChild.BackColor = Color.Red
            'Display the new form.
            NewMDIChild.Show()
        End Sub
     
        Private Sub CloseMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CloseMenuItem.Click
            Me.ActiveMdiChild.Close()
        End Sub
    End Class
    bon code.........................

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 50
    Par défaut
    Citation Envoyé par MABROUKI Voir le message
    bonjour loki9481
    Ce comportement est semblable à celui d'un UserControl car un formulaire herite qu'il soit MDI ou non se comporte de la meme mainiere .
    La technique pour surmonter ce probleme est de "wrapper" les proprietes qu'on veut acceder -une à une- du control depose sur le form MDI par des prop dans le formulaire MDI comme cela se fait pour un UserControl.

    Dans ton cas il suffit de "wrapper" la prop MenuItems de MainMenu dans une simple prop publique de ton form MDI avec un attribut "browsable" pour la voir dans le designer apres avoir cree le form herite.......
    exemple code:
    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
     
    'projet lib(.dll) de ton form MDI 
    'l"attribut protected  bien sur sera mis sur MainMenu
    'nota-bene:la prop ne sera pas visibledans le designer dans projet actuel
    Imports System.ComponentModel
    Imports System.Windows.Forms.Menu
    Public Class frmMDI
     
        Public Sub New()
            ' Cet appel est requis par le Concepteur Windows Form.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
            Me.WindowState = FormWindowState.Maximized
            Me._myMenuItems = Me.MainMenu1.MenuItems
        End Sub
        'propriete de wrapper de la prop collection MenuItems 
        'qu'on veut acceder
        'Attribut :Browsable pour la voir(attention:apres ajout dans ton projet) dans le designer VS
        'et pouvoir ajouter des sous-menus
        Private _myMenuItems As MenuItemCollection
        <Browsable(True)> _
        Public Property MyMenuItems() As MenuItemCollection
            Get
                Return Me._myMenuItems
            End Get
            Set(ByVal value As MenuItemCollection)
                Me._myMenuItems = value
            End Set
        End Property
        'menu item classique de base New
        Private Sub NewMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NewMenuItem.Click
            Dim NewMDIChild As Form = New Form()
            'Set the Parent Form of the Child window.
            NewMDIChild.MdiParent = Me
            NewMDIChild.BackColor = Color.Red
            'Display the new form.
            NewMDIChild.Show()
        End Sub
     
        Private Sub CloseMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CloseMenuItem.Click
            Me.ActiveMdiChild.Close()
        End Sub
    End Class
    bon code.........................
    Merci beaucoup pour ton code. Celui-ci fonctionne très bien et me permet de faire mon héritage comme je le souhaitais

    Malgré tout, je ne comprends toujours pas pourquoi il est impossible, de base, de ne pas pouvoir modifier un menu par héritage, même en déclarant les objets Protected ou Public
    Désolé d'insister, mais j'aime comprendre le pourquoi du comment...

  4. #4
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour loki9481
    WinForm ou UserControl ou Panel derivent de Control Container .
    Ce sont des Container universels ce qui les rends capables de contenir une collection de control de tout type.(me.controls.add().....hein)
    TabControl egalement mais bride ,il n'accepte que des conrols TabPpage ou MainMenu.
    Tel n'est pas le cas de Button ou Llabel ou TextBox.

    Le fait qu'un autre control soit heberge dans un container se fait par une declarationde simples variables et l'ajout à sa collecion Controls
    Cela & n'en fait pas une prop du container et c'est important vis-vis du Designer VS.

    Le Designer VS heberge (hoste) le control container racine,
    serialize et deserialise (en utilisant la Reflection) uniquement les prop declares dans le container racine et les affichent .....
    Pourquoi cette limitation?....
    Simplement parce que Mabrouki ou bien ouloki9481
    qui sont des gens avises et utilisent l'API à outrance se sont mis en tete de creer un UserControl Container qui contient un autre Container Panel lequel contient un TabControl lequel contient un autre Panel lequel contient ..............j'arrete la...
    Le Designer VS a ete limite expres laissant au developpeur le soin de choisir les controls ou sous-sous -controls(et leur props) qu'il veut exposer comme proprietes dans le designer...
    Deja de base les proprietes heritees de control pour un winform ou un MainMenu contituent-je m'excuse du terme- une diarrrhee dans le Propertygrid du Designer et laissent perplexe plus d'un...
    bon code................

Discussions similaires

  1. [Postgresql]Héritage
    Par lheureuxaurelie dans le forum PostgreSQL
    Réponses: 13
    Dernier message: 02/10/2008, 09h18
  2. [Héritage] Vos commentaires....
    Par Fyna dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 03/05/2005, 22h10
  3. [XML Schemas]héritage multiple
    Par nicolas_jf dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 10/06/2003, 12h55
  4. [Postgres] Héritage + Clés
    Par k-reen dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 21/05/2003, 16h37
  5. Héritage entre Forms
    Par BarBal dans le forum Composants VCL
    Réponses: 7
    Dernier message: 29/08/2002, 17h44

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