none
vererbung Fenster... RRS feed

  • Frage

  • Hallo,

    eine Frage noch mal zum Vererben von Windowsform´s ...

    Habe eine Basisfensterklasse erstellt und dem ein Contextmenü verpasst.
    Jetzt erstellte ich ein neues Form und ändere im Code das INHERIT dann manuell ab.
    Soweit alles schickt, nur leider erbt das neue Fenster das contextmenü nicht mit.
    Muss ich das ebenfalls irgendwie manuell nachsteuern ?

    Danke !

    Mario

    Mittwoch, 30. Juni 2010 09:12

Antworten

  • Hallo Mario,

    Habe eine Basisfensterklasse erstellt und dem ein Contextmenü verpasst.
    Jetzt erstellte ich ein neues Form und ändere im Code das INHERIT dann manuell ab.
    Soweit alles schickt, nur leider erbt das neue Fenster das contextmenü nicht mit.

    Damit das geerbte ContextMenu(Strip) im Designer des erbenden Formulars auftaucht, musst Du die Modifiers Eigenschaft für das ContextMenu(Strip) im Basisformular auf [Protected] bzw. [Protected Friend] setzen. Hast Du das gemacht?


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Mittwoch, 30. Juni 2010 09:42
  • Hallo Mario,

    beende ggf. die Entwicklungsumgebung. Durch Cachen von Informationen im Designer
    kommt es dort schnell zu Merkwürdigkeiten. Weswegen ich i. a. eher von Vererbung
    auf Formular/UserControl Ebene absehen würde.

    Hinzukommen einige Einschränkungen, was den Designer angeht.
    Wenn Du bei einem vererbten Formular versuchst ein [Context]MenuStrip zu erweitern,
    so erzeugt der Designer zwar den Code fürs Erzeugen des MenuStripItems -
    findet man wenn man sich InitializeComponent oder die Auflistung im Eigenschaftsfenster anschaut.
    Er ist aber nicht in der Lage, es an das bereits bestehende MenuStrip Auflistung anzufügen,
    womit am Ende nur eine Menge "Leichen" im Code entstehen.
    (Gerade noch .NET 4.0/VS 2010 getestet und immer noch verkehrt ;-((

    Gesünder ist es im allgmeinen auf die Vererbung dort zu verzichten
    und sich daran zumachen das weitere via Code zu erstellen - was auch kein Hexenwerk ist:

    Public Class FormInherited
    
      Private WithEvents eineMessageBoxToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem
    
      Private Sub FormInherited_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
        Me.eineMessageBoxToolStripMenuItem = New ToolStripMenuItem("Noch eine MessageBox") With
           {.Name = "eineMessageBoxToolStripMenuItem"}
    
        ' Der ContextMenuStrip im geerbten Formular
        MyBase.mainContextMenuStrip.Items.Add(Me.eineMessageBoxToolStripMenuItem)
      End Sub
    
      Private Sub NochEineMessageBoxToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles eineMessageBoxToolStripMenuItem.Click
        MessageBox.Show(Me, "Noch eine MessageBox")
      End Sub
    End Class
    

    Mehr siehe Visuelle Vererbung in Windows Forms

    Gruß Elmar

     

    Mittwoch, 30. Juni 2010 16:32

Alle Antworten

  • Hallo Mario,

    Habe eine Basisfensterklasse erstellt und dem ein Contextmenü verpasst.
    Jetzt erstellte ich ein neues Form und ändere im Code das INHERIT dann manuell ab.
    Soweit alles schickt, nur leider erbt das neue Fenster das contextmenü nicht mit.

    Damit das geerbte ContextMenu(Strip) im Designer des erbenden Formulars auftaucht, musst Du die Modifiers Eigenschaft für das ContextMenu(Strip) im Basisformular auf [Protected] bzw. [Protected Friend] setzen. Hast Du das gemacht?


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Mittwoch, 30. Juni 2010 09:42
  • Hallo Thorsten,

    nein hatte ich nicht, aber selbst wenn ich die Modifiers Eigenschaft auf Protected oder Protected Friend setze ( neu erstellt habe ich dannach ), dann taucht nix im geerbten Fenster auf.

    Muss ich im geerbten Fenster denn noch was einstellen oder anpassen ?

    bye,

    Mario

     

    Mittwoch, 30. Juni 2010 11:48
  • Hallo Mario,

    nein hatte ich nicht, aber selbst wenn ich die Modifiers Eigenschaft auf Protected oder Protected Friend setze ( neu erstellt habe ich dannach ), dann taucht nix im geerbten Fenster auf.

    ich habe es hier getestet und es funktioniert, wie beschrieben. Kannst Du ein Beispiel bereitstellen (Download via Skydrive z.B.), wo dies nachvollziehbar ist?


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Mittwoch, 30. Juni 2010 16:14
  • Hallo Mario,

    beende ggf. die Entwicklungsumgebung. Durch Cachen von Informationen im Designer
    kommt es dort schnell zu Merkwürdigkeiten. Weswegen ich i. a. eher von Vererbung
    auf Formular/UserControl Ebene absehen würde.

    Hinzukommen einige Einschränkungen, was den Designer angeht.
    Wenn Du bei einem vererbten Formular versuchst ein [Context]MenuStrip zu erweitern,
    so erzeugt der Designer zwar den Code fürs Erzeugen des MenuStripItems -
    findet man wenn man sich InitializeComponent oder die Auflistung im Eigenschaftsfenster anschaut.
    Er ist aber nicht in der Lage, es an das bereits bestehende MenuStrip Auflistung anzufügen,
    womit am Ende nur eine Menge "Leichen" im Code entstehen.
    (Gerade noch .NET 4.0/VS 2010 getestet und immer noch verkehrt ;-((

    Gesünder ist es im allgmeinen auf die Vererbung dort zu verzichten
    und sich daran zumachen das weitere via Code zu erstellen - was auch kein Hexenwerk ist:

    Public Class FormInherited
    
      Private WithEvents eineMessageBoxToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem
    
      Private Sub FormInherited_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
        Me.eineMessageBoxToolStripMenuItem = New ToolStripMenuItem("Noch eine MessageBox") With
           {.Name = "eineMessageBoxToolStripMenuItem"}
    
        ' Der ContextMenuStrip im geerbten Formular
        MyBase.mainContextMenuStrip.Items.Add(Me.eineMessageBoxToolStripMenuItem)
      End Sub
    
      Private Sub NochEineMessageBoxToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles eineMessageBoxToolStripMenuItem.Click
        MessageBox.Show(Me, "Noch eine MessageBox")
      End Sub
    End Class
    

    Mehr siehe Visuelle Vererbung in Windows Forms

    Gruß Elmar

     

    Mittwoch, 30. Juni 2010 16:32