Objektverweis wurde nicht auf eine Objektinstanz festgelegt

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von VB1963.

    Objektverweis wurde nicht auf eine Objektinstanz festgelegt

    Ich versuche bei der Anmeldung einzelne Menü-Punkte zur Laufzeit sichtbar bzw. unsichtbar zu machen.

    VB.NET-Quellcode

    1. dim menuepunkt as string = "Stammdaten"
    2. Dim MenuStrip1 as new MenuStrip
    3. MenuStrip1.items.item(menuepunkt).visible = true


    In Zeile 3 kommt der Fehler: Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
    Dann gibt es wohl kein solches Item und das gibt Dir ​Nothing zurück, was wiederrum eine ​NullReferenceException wirft, da Du versuchst, damit zu arbeiten.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    vbanfaenger schrieb:

    zur Laufzeit
    Sieh Dir an was der Designer macht und empfinde dies nach.
    Leg im Designer ein Menü mit Submenüs an und sieh Dir die Prozedur InitializeComponents() dieser Form an.
    Danach lösch die Menüdinger wieder.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @vbanfaenger
    Ich täte so ein Menü sowieso über den Designer mit ordentlicher Benennung sämtlicher MenüObjekte erstellen...
    Solle während der Laufzeit etwas geändert werden, dann greife auf die übersichtlich benannten MenüObjekte zu...
    msdn.microsoft.com/de-de/libra….MenuStrip(v=vs.110).aspx
    hmm?

    Imo sollter er nix tun, und v.a. den Code aus post#1 löschen.

    Und dann soll er halt das MenuItem seiner Wahl Visible False setzen, mw. im Form_Load-Event

    also angenommen, es gebe ein MenustripItem namens StammDatenMenustripItem - dann folgender Code:

    VB.NET-Quellcode

    1. StammDatenMenustripItem.Visible = False
    Done.
    Ok, es ist offensichtlich so, dass MenuStrip1 und ToolStripMenuItem nichts gemein haben.

    Wenn ich jetzt den Namen eines Elementes aus ToolStripMenuItem in einem String stehen habe,
    wie kann ich dann auf das entsprechende Element zugreifen?

    VB.NET-Quellcode

    1. me.ToolStripMenueItem(mystring)


    funktioniert schon mal nicht.
    Du musst halt wissen, wie dein ToolStripMenuItem heisst.
    angenommen, es heisse StammDatenMenustripItem - dann folgender Code:

    VB.NET-Quellcode

    1. StammDatenMenustripItem.Visible = False

    Heisst es aber StammDatenToolMenustripItem - dann folgender Code:

    VB.NET-Quellcode

    1. StammDatenToolMenustripItem.Visible = False
    Das kann ich jetzt endlos fortsetzen, denn ich weiß nicht, wie dein MenuItem heisst.
    Da muss du schon selber mal draufklicksen im Designer, und gugge in PropertyFenster, wie das heisst.

    vbanfaenger schrieb:

    funktioniert schon mal nicht.
    Was wird Dir angeboten, wenn Du
    ToolStripMenueItem . eingibst? (der Punkt ist wichtig!)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @vbanfaenger
    Du kannst so ein Menü über den Form-Designer erstellen und es dort vollständig nach deinen Wünschen designen...

    Im Eigenschaftenfenster benennst du dein ausgewähltes Objekt um (Name-Eigenschaft - siehe z.B. unten 'testHallo')...

    Der Designer generiert dir folgenden Code in DeineFormDesigner.vb:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. 'Wird vom Windows Form-Designer benötigt.
    2. Private components As System.ComponentModel.IContainer
    3. 'Hinweis: Die folgende Prozedur ist für den Windows Form-Designer erforderlich.
    4. 'Das Bearbeiten ist mit dem Windows Form-Designer möglich.
    5. 'Das Bearbeiten mit dem Code-Editor ist nicht möglich.
    6. <System.Diagnostics.DebuggerStepThrough()> _
    7. Private Sub InitializeComponent()
    8. Me.MenuStrip1 = New System.Windows.Forms.MenuStrip()
    9. Me.testHallo = New System.Windows.Forms.ToolStripMenuItem()
    10. Me.StammdatenToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
    11. Me.MenuStrip1.SuspendLayout()
    12. Me.SuspendLayout()
    13. '
    14. 'MenuStrip1
    15. '
    16. Me.MenuStrip1.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.testHallo, Me.StammdatenToolStripMenuItem})
    17. Me.MenuStrip1.Location = New System.Drawing.Point(0, 0)
    18. Me.MenuStrip1.Name = "MenuStrip1"
    19. Me.MenuStrip1.Size = New System.Drawing.Size(284, 24)
    20. Me.MenuStrip1.TabIndex = 0
    21. Me.MenuStrip1.Text = "MenuStrip1"
    22. '
    23. 'testHallo
    24. '
    25. Me.testHallo.Name = "testHallo"
    26. Me.testHallo.Size = New System.Drawing.Size(47, 20)
    27. Me.testHallo.Text = "Hallo"
    28. '
    29. 'StammdatenToolStripMenuItem
    30. '
    31. Me.StammdatenToolStripMenuItem.Name = "StammdatenToolStripMenuItem"
    32. Me.StammdatenToolStripMenuItem.Size = New System.Drawing.Size(87, 20)
    33. Me.StammdatenToolStripMenuItem.Text = "Stammdaten"

    Und so greifst du dann auf dein MenüObjekt in deiner Form zu und kannst es dynamisch ändern:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown
    3. Me.testHallo.Visible = False
    4. End Sub
    5. End Class

    Also mit den DropDown-Einträgen komme ich noch nicht zurecht.

    VB.NET-Quellcode

    1. Me.Stammdaten.DropDownItems.Item(eintrag1).visible = false


    Obige Zeile funktioniert. Stammdaten ist ein MenuItem aus dem Hauptmenü.

    Mein Problem ist, dass der Name Stammdaten variabel gehalten muss, der Wert wird aus einer Datei eingelesen. In dieser steht der String "Stammdaten". Wie konvertiere ich diesen String in das MenuItem Stammdaten?

    vbanfaenger schrieb:

    Wie konvertiere ich diesen String in das MenuItem Stammdaten?
    Per Index.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    vbanfaenger schrieb:

    Mein Problem ist, dass der Name Stammdaten variabel gehalten muss
    Einen Namen kann man nicht variabel halten.
    Angenommen ein MenuItem namens mnuStammDaten, und du schreibst Code dafür.
    Stell dir vor, es wäre möglich, nu nachträglich den Namen mnuStammDaten zu ändern, auf mnuWurzelDaten.
    Dann könnte der Code, der für mnuStammDaten geschrieben wurde, doch gar nimmer kompilieren - verstehst du das?

    Hingegen die Text-Property von mnuStammDaten kann man natürlich jederzeit ändern, und dann steht halt was anneres drauf - aber das ändert ja auch nicht den Namen.

    vbanfaenger schrieb:

    Mein Problem ist, dass der Name Stammdaten variabel gehalten muss
    Schaue dir dazu einmal die Me.Stammdaten.Text-Eigenschaft an, damit kannst du den MenuItem umtexten (der Name bleibt dabei immer Stammdaten)
    ...wenn du das oben damit meinst
    Edit: EDR war schneller...

    vbanfaenger schrieb:

    Thema erledigt. Weiß nur nicht, wo ich das markieren muss
    Direkt rechts neben deinem Thementitel ist ein kleines rotes Quadratchen - das musst du anhacken...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VB1963“ ()