Héritage ToolStripMenuItem et InvalidCastException

Signaler
Messages postés
6
Date d'inscription
mercredi 19 février 2003
Statut
Membre
Dernière intervention
3 juin 2008
-
Messages postés
6
Date d'inscription
mercredi 19 février 2003
Statut
Membre
Dernière intervention
3 juin 2008
-

7 réponses

Messages postés
6
Date d'inscription
mercredi 19 février 2003
Statut
Membre
Dernière intervention
3 juin 2008

Bonjour.

J'essaie de créer un ToolStripMenuItem avec une nouvelle propriété "Fonction" (de type String).
Messages postés
6
Date d'inscription
mercredi 19 février 2003
Statut
Membre
Dernière intervention
3 juin 2008

Je vais y arriver, si si...

Bonjour.
J'essaie de créer un ToolStripMenuItem avec une nouvelle propriété "Fonction" (de type String).

Public Class MyMenuItem

    Inherits ToolStripMenuItem

    Private mvarFonction As String

    Public Property Fonction() As String

        Get

            Return mvarFonction

        End Get

        Set(ByVal value As String)

            mvarFonction = value

        End Set

    End Property

    Public Sub New(ByVal texte As String, ByVal Fonction As String)

        MyBase.New(texte)

        mvarFonction = Fonction

    End Sub

    Public Sub New(ByVal texte As String)

        MyBase.New(texte)

    End Sub

End Class

Au chargement de mon formulaire, je crée le MenuStrip et le premier item :

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim MyMenu As New MenuStrip
        Dim MyItem As MyMenuItem

        'MyItem = New MyMenuItem("Mon premier menu", "Test")
        'MyMenu.Items.Add(MyItem)

        MyItem = MyMenu.Items.Add("Mon premier menu")
        MyItem.Fonction = "Test"

        Me.MainMenuStrip = MyMenu
        Me.Controls.Add(MyMenu)

    End Sub

J'obtiens une erreur "InvalidCastException" sur la ligne MyItem = MyMenu.Items.Add

(Message="Impossible d'effectuer un cast d'un objet de type 'System.Windows.Forms.ToolStripMenuItem' en type 'TestMenu.MyMenuItem'.")

En revanche, le code suivant fonctionne :
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim MyMenu As New MenuStrip

        Dim MyItem As MyMenuItem

        MyItem = New MyMenuItem("Mon premier menu", "Test")

        MyMenu.Items.Add(MyItem)

        'MyItem = MyMenu.Items.Add("Mon premier menu")

        'MyItem.Fonction = "Test"

        Me.MainMenuStrip = MyMenu

        Me.Controls.Add(MyMenu)

    End Sub

Et donc, je me demandais pourquoi ca marche dans un cas et pas dans l'autre ?!
Si quelqu'un pouvait m'éclairer de ces lumières et éventuellement me dire comment faire pour que la 1ere méthode fonctionne, je lui en serais très reconnaissant.
Messages postés
840
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2009
8
Salut,

Oui c'est normal. La fonction MyMenu.Items.Add retourne un ToolStripMenuItem, mais un simple ToolStripMenuItem ne peut pas être "transformé" en MyMenuItem.
MyItem = MyMenu.Items.Add("Mon premier menu")
' On essaie de "tranformer" un ToolStripMenuItem en MyMenuItem -> impossible

Si tu veux créer un MyMenuItem, tu dois utiliser son constructeur pour le créer, c'est pourquoi ceci fonctionne:

MyItem = New MyMenuItem("Mon premier menu", "Test")
MyMenu.Items.Add(MyItem)
Messages postés
6
Date d'inscription
mercredi 19 février 2003
Statut
Membre
Dernière intervention
3 juin 2008

Donc :
MyMenuItem => ToolStripMenuItem : possible
ToolStripMenuItem => MyMenuItem : pas possible

A première vue ca me fait bizarre; car la première conversion est possible (du fait que mon objet hérite de ToolStripMenuItem je suppose).

En fait, il faudrait une méthode sur ToolStripMenuItem capable de le "transformer" en MyMenuItem ?

Il n'y a pas moyen de créer une méthode ou un convertisseur sur MyMenuItem ? Du genre "ConvertToToolStripMenuItem" ?

Je me casse bien la tête pour pas grand chose...
Messages postés
840
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2009
8
MyMenuItem => ToolStripMenuItem : possible
ToolStripMenuItem => MyMenuItem : pas possible

A première vue ca me fait bizarre; car la première conversion est possible (du fait que mon objet hérite de ToolStripMenuItem je suppose).


Pour que ça fasse moins bizarre, prenons un autre exemple équivalent. On sait par exemple que toutes les classes héritent de Object dans .NET. Donc:

ToolStripMenuItem => Object : Possible
Object => ToolStripMenuItem : Forcément impossible

C'est plus clair non?
Il n'y a pas moyen de créer une méthode ou un convertisseur sur MyMenuItem ? Du genre "ConvertToToolStripMenuItem" ?
Si je crois bien, mais je ne sais pas le faire
Je me casse bien la tête pour pas grand chose...
Effectivement, l'utilisation du contructeur de ton MyMenuItem te rajoute une seule ligne dans ton code
Mais en plus, si tu veux accéder aux fonctions ajoutées de tes MyMenuItem dans ton menu par la suite, tu devra faire un cast ToolStripMenuItem => MyMenuItem (dans ce cas ça fonctionnera, car ToolStripMenuItem est en fait un MyMenuItem)

Espérant que tu m'as compris
Messages postés
6
Date d'inscription
mercredi 19 février 2003
Statut
Membre
Dernière intervention
3 juin 2008

Yep, je pense t'avoir compris ;)

Sinon, une solution serait de créer un MyMenuStrip qui hérite de MenuStrip auquel j'ajouterais une méthode Add avec un paramètre MyMenuItem. Non ?

Je vais jeter un oeil quand même un oeil sur les conversions de type, par curiosité.

Enfin, merci pour les réponses ;)
Messages postés
6
Date d'inscription
mercredi 19 février 2003
Statut
Membre
Dernière intervention
3 juin 2008

Après quelques recherches, on peut définir dans une classe un opérateur (Operator), notamment un opérateur de conversion avec CType :
http://msdn.microsoft.com/fr-fr/library/hddt295a.aspx

Donc, j'ai essayé ceci :
Public Shared Widening Operator CType(ByVal e As ToolStripMenuItem) As MyMenuItem

End Operator

J'ai une erreur :
"Les opérateurs de conversion ne peuvent pas convertir à partir d'un type de base."

L'inverse n'est pas possible également :
Public Shared Widening Operator CType(ByVal e As MyMenuItem) As ToolStripMenuItem

End Operator
Erreur : "Les opérateurs de conversion ne peuvent pas convertir d'un type en son type de base."

Il a été jugé bon de nous interdire de définir (ou redéfinir) les conversions entre parents et enfants. Surement à raison =)