Précédent   Forum des professionnels en informatique > Dotnet > Langages > VB.NET
VB.NET Forum d'entraide sur la programmation Visual Basic .NET. Avant de poster -> FAQ VB.NET, Articles VB.NET, Sources VB.NET
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/02/2012, 15h35   #1
Membre à l'essai
 
Homme
Développeur informatique
Inscription : août 2004
Messages : 44
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 31
Localisation : Belgique

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : août 2004
Messages : 44
Points : 20
Points : 20
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 :
Citation:
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.
loki9481 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 02h01   #2
Membre Expert
 
mebarek
Inscription : avril 2008
Messages : 828
Détails du profil
Informations personnelles :
Nom : mebarek
Âge : 52

Informations forums :
Inscription : avril 2008
Messages : 828
Points : 1 196
Points : 1 196
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 :
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.........................
MABROUKI est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 09h14   #3
Membre à l'essai
 
Homme
Développeur informatique
Inscription : août 2004
Messages : 44
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 31
Localisation : Belgique

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : août 2004
Messages : 44
Points : 20
Points : 20
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 :
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...
loki9481 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 15h42   #4
Membre Expert
 
mebarek
Inscription : avril 2008
Messages : 828
Détails du profil
Informations personnelles :
Nom : mebarek
Âge : 52

Informations forums :
Inscription : avril 2008
Messages : 828
Points : 1 196
Points : 1 196
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................
MABROUKI est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h37.


 
 
 
 
Partenaires

Hébergement Web