Problem mit Objektinstanz

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Niko Ortner.

    Problem mit Objektinstanz

    Hallo !

    Ich habe in meinem Programm zwei Fenster. Das Eine dient dazu, Daten einzugeben, das Andere, sie anzuzeigen. Nach der Eingabe der Daten im Eingabeform sollen diese im Ausgabeform angezeigt werden.

    Das Anzeigefenster ist kein Child, da man es auf einen anderen Monitor ziehen können muss, z.B. um es auf einen Beamer zu legen.

    Besonderheit: Im Load-Event des Anzeigefensters werden die Labels dynamisch erzeugt. Die Labels habe ich direkt in der Klasse des Forms dimensioniert

    VB.NET-Quellcode

    1. Dim lbName(anzahl) as label
    .

    Im Load-Event erzeuge ich die jeweiligen Instanzen:

    VB.NET-Quellcode

    1. For i = 1 To anzahl
    2. lbName(i) = New Label


    Im Anzeigefenster habe ich eine Sub geschrieben (anzeigeaktualisieren()) und als public definiert, damit das andere Fenster darauf zugreifen kann. Diese Sub befüllt die Labels mit den Werten.

    Es funktioniert nicht. Beim Debuggen sah ich, dass in der Methode anzeigeaktualisieren() an folgender Stelle ein Fehler auftrat:

    VB.NET-Quellcode

    1. lbName(i).Text = read.GetString("name")

    Fehler: Der Verweis wurde nicht auf eine Objektinstanz festgelegt.

    Hat jemand einen Tipp für mich, was ich falsch mache ? Hoffe, ich konnte mich verständlich ausdrücken.


    Beim normalen Ausführen des Anzeigefensters funktioniert alles, nur eben das Aktualisieren nicht.
    Da hab' ich auch schon dran gedacht, aber die Labels werden genau so erzeugt, wie sie später beschrieben werden. Also im Load-Event habe ich auch die Indexierung mit 1 angefangen.

    Zudem würde der Fehler ja dann auch beim öffnen des Fensters auftreten, da wird die Methode nämlich auch ausgeführt.

    Habe Deinen Vorschlag dennoch ausprobiert und jetzt bekomme ich den Fehler schon direkt beim Öffnen der Forms. Daran lag's also irgendwie nicht.
    Hallo,
    geh doch ma in der Zeile,wo der Fehler ausgelöst wird über die einzelnen Variablen. Es kann auch sein, dass dein reader.GetString() nothing ist. Hat vielleicht ganix mit den Labels zum tun.
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    Wenn der Fehler wie beschrieben in der angegebenen Zeile lbName(i).Text = read.GetString("name") auftritt, ist entweder das Label nicht instanziert oder reader. Eines der beiden Objekte ist Nothing. Das mußt du im Debug austesten (Mauszeiger drüberhalten und ma schan, was da so angezeigt wird. Da ich nicht weiß, was reader für ein Objekt ist, kann ich dir auch nix anderes sagen.
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    Auf welcher Form sind die Labels?
    Wie hast du sie zu welcher Form hinzugefügt?
    In welcher Form ist das Array gespeichert?
    Hast du mal mit Debug nachgeschaut? (Irgendwie nicht erreichbar klingt ...)
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    Erstmal Danke für Deine Mühe.

    Das Listing ist sehr lang, daher kopiere ich die wesentlichen Parts mal raus und zeige es nur an dem einen Beispiel des Feldes Name, das ist das erste Feld und da bricht er auch schon ab.

    Übrigens Debuggen: Wenn ich über den Feldnamen lbName(i) fahre, kommt als Tooltip eine Liste in der 10 mal lbName vorkommt (0-10), also scheint es sie tatsächlich zu geben.

    Also Form Hauptanzeige:

    VB.NET-Quellcode

    1. Public Class HauptanzeigeDim anzeigen As Short = 9
    2. Dim lbName(anzeigen) As Label
    3. [...]


    Load-Event:

    VB.NET-Quellcode

    1. Private Sub Hauptanzeige_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LoadFor i = 1 To anzeigen
    2. lbName(i) = New Label
    3. [...]
    4. With lbName(i)
    5. .AutoSize = False
    6. .Width = 208
    7. .Height = 25.Location = New Point(13, ypos)
    8. .BackColor = Color.LightGray.Font = New System.Drawing.Font("Microsoft Sans Serif", 15.75, FontStyle.Regular, GraphicsUnit.Pixel)
    9. .TextAlign = ContentAlignment.MiddleLeft
    10. End With
    11. [...]Me.Controls.Add(lbName(i))
    12. [...]

    Dann gibt es die Methode anzeigeaktualisieren():

    VB.NET-Quellcode

    1. For i = 1 To anzeigen
    2. lbName(i).Text = Nothing 'Hier tritt der Fehler auf !
    3. [...]
    4. Next


    So, das war die Hauptanzeige. Im Form "Steuerung" stehen dann nur noch nach dem Speichern der Daten folgende Befehle:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.ClickDim anzeigefenster As New Hauptanzeige
    2. anzeigefenster.anzeigeaktualisieren()
    3. anzeigefenster.Refresh()
    4. End Sub

    Hilft das ? Mir ist gerade aufgefallen, dass ich den Labels gar keine Name-Property zuweise. Kann das was damit zu tun haben ?

    muehleis schrieb:

    kommt als Tooltip eine Liste in der 10 mal lbName vorkommt (0-10)
    ... Sicher?
    10 mal wäre 0-9, 0-10 ist 11 mal. :rolleyes:

    Ich denke, der Fehler liegt bei deiner Dimensionierung des Arrays.
    Angenommen anzeigen = 10
    Mit Dim lbName(anzeigen) As Label erzeugst du ein Feld mit 10 Einträgen für ein Label (wobei As new Label besserer wäre). Diese werden dann in deinen For-Schleifen mit 1 to anzeigen angesprochen. Da ein Feld allerdings 0-basiert indexiert wird, führt lbName(10) zu einer Fehlermeldung. Dein Array ist nur von lbName(0) bis lbName(9) anzusprechen. Ändere entweder die Dimensionierung in Dim lbName(anzeigen + 1) As New Label oder ändere die For-Schleifen in 0 bis anzeigen - 1.
    Zur Kontrolle könntest du im Debug die variable i bei der Fehlermeldung anschauen. Ich wette die ist dann = 10 ;)
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    Schade, dass es hier nicht mehr weitergeht. Oder habe ich etwas übersehen?
    Habe anscheinend genau das gleichen Problem.
    Bin auch der Meinung, dass der "Index" bei mir schon richtig wäre - wie in Eurem Fall zwischen 0 und 9.
    Habe so den Eindruck als gehe das irgend wie nicht, weil "auf falscher Ebene": Habe dynamische Felder in einer Sub erstellt, kann sie aber in einer anderen Sub nicht mehr ansprechen. An anderer Stelle aber schon. Dort funktioniert es dann merkwürdigerweise mit dem dynamisch ansprechen.
    Wer weiss Rat?
    @Vatter: Nö, Dim lblName(9) As Label instanziert ein Array mit 10 Einträgen (0 - 9), das sind 10, nicht 9! Probier es selbst aus.

    VB.NET-Quellcode

    1. Private Sub DoSomething() Handles Button1.Click
    2. Dim lblName(9) As Label
    3. lblName(8) = New Label 'funktioniert
    4. lblName(9) = New Label 'funktioniert
    5. lblName(10) = New Label 'IndexOutOfRangeException


    Zwei Fragen:
    Warum wird anzeigen als Variable deklariert? Wenn es nicht so wäre wäre es einfacher.
    Überhaupt: Warum werden die Labels zur Laufzeit hinzugefügt und nicht von Anfang an?

    Aber mal davon abgesehen:
    Warum deklarierst Du ein Array, das einen Eintrag mehr hat als nötig? Der Eintrag 0 scheint bei Dir nie verwendet zu werden, weil For i = 1 ...

    Verwende Arrays besser 0 basiert.

    Also wenn es 5 Labels geben soll:

    VB.NET-Quellcode

    1. Dim anzeigen As Integer = 5 'Warum eigentlich als Short?
    2. Dim lblName(anzeigen - 1) As Label
    3. Sub FormLoad() Handles Me.Load
    4. For i As Integer = 0 To anzeigen - 1
    5. lblName(i) = New Label With {.Text = "sonstwas", .Location = New Point(10, 23)}
    6. Form2.Controls.Add(lblName(i))
    7. Next
    8. End Sub
    9. 'Beim Zuweisen der Texte:
    10. Sub anzeigeaktualisieren
    11. For i As Integer = 0 To anzeigen - 1
    12. 'Wie war das mit dem read.GetString?
    13. lblName(i).Text = read.GetString("name" & i.ToString) 'Wenn nicht jedes Label den gleichen Text beinhalten soll muss die Variable i auch irgendwo hin. Die Methode hier ist aber nur eine Vermutung.
    14. Next
    15. End Sub
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils