PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."


tsaG
2010-01-21, 14:33:02
Ich habe eine Form mit 8 Checkboxen, aus der Kombination der Häkchen soll eine Zahl errechnet werden. Die Checkboxen tragen die namen 11 bis 18



Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
AddHandler r11.CheckStateChanged, AddressOf builddata1
AddHandler r12.CheckStateChanged, AddressOf builddata1
AddHandler r13.CheckStateChanged, AddressOf builddata1
AddHandler r14.CheckStateChanged, AddressOf builddata1
AddHandler r15.CheckStateChanged, AddressOf builddata1
AddHandler r16.CheckStateChanged, AddressOf builddata1
AddHandler r17.CheckStateChanged, AddressOf builddata1
AddHandler r18.CheckStateChanged, AddressOf builddata1

End Sub
Sub builddata1()
Dim daten As Byte
For i As Int32 = 1 To 8
If CType(Me.Controls("r1" & i.ToString), CheckBox).Checked Then
daten += 1 << i - 1

End If
Next
senden(1, daten)
End Sub


Wenn ich nun jedoch auf ein Häkchen klicke wirft er mir eine Exception aus:

Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

Wo liegt der Fehler? ;(

robobimbo
2010-01-21, 14:38:58
in welcher zeile?

mach aus dem Me.Controls... eine eigene Zeile mit eigener Variable und prüfe ob du das Control überhaupt findest

Neomi
2010-01-21, 15:15:09
Hab zwar schon seit Ewigkeiten kein VB mehr benutzt (kann mich daher also irren), habe aber einen konkreten Verdacht. Und zwar addiert "daten += ..." etwas auf den vorherigen Wert der Variablen drauf, diese wurde aber nicht mit einem Wert initialisiert. Setze daten doch einfach mal auf 0, bevor es in die Schleife geht. Falls es eine implizite Initialisierung auf 0 gibt, vergiß was ich gesagt habe.

Monger
2010-01-21, 16:07:30
Falls es eine implizite Initialisierung auf 0 gibt, vergiß was ich gesagt habe.
Value types in .NET sind immer initialisiert: integer zu 0, real zu 0.0, char zu ' ' (glaube ich), bool zu false...

tsaG
2010-01-21, 16:18:51
in welcher zeile?

mach aus dem Me.Controls... eine eigene Zeile mit eigener Variable und prüfe ob du das Control überhaupt findest

Genau in dieser Zeile. Weiss gerade nicht was Du meinst, Sorry.

Also bei "AddHandler r11.CheckStateChanged, AddressOf builddata1" spricht er ja auch an, daher sollte er das doch finden, oder?

Sephiroth
2010-01-21, 16:51:15
breakpoint an die Zeile setzen und schauen welches der Objekte null ist

bei i.ToString fehlen imho auch die klammern

Monger
2010-01-21, 18:56:16
Naja, "Me" kann wohl schlecht nothing sein, ein Integer auch nicht... also wird von Me.Controls("r1" & i.ToString) nix zurückkommen.

Vergiss nicht, dass es einen Unterschied zwischen dem Variablennamen und dem Namen eines Objekts gibt.
Den Variablennamen kann deine Windows Form kaum kennen... es geht zwar (über Reflections), aber da greifen wir tieeeef in die .NET Trickkiste.

Was hier wahrscheinlich gemeint ist, dass jedes Objekt ein Attribut "Name" hat, nach dem du hier suchst. Und das muss nicht unbedingt mit dem übereinstimmen was du als Variablennamen gewählt hast.


bei i.ToString fehlen imho auch die klammern
In VB.NET sind die Klammern bei parameterlosen Methoden optional, das ist also syntaktisch völlig okay (auch wenn ich es selber n bissl hässlich finde).