Option Strict On -> Late Binding Fehler: Wie geht das mit DirectCast richtig?

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von nogood.

    Option Strict On -> Late Binding Fehler: Wie geht das mit DirectCast richtig?

    Hi,
    ich versuche mich daran, meine Programme alle mit Option Strict On zu schreiben. Zu Test Zwecken hab ich mein letztes schon fertiges Programm im Nachhinein auf Option Strict On gestellt.
    Ich konnte zwei, drei Fehler beheben aber bei folgendem komm ich nicht weiter. Trotz Recherche und Google etc.

    "option Strict on läßt spätes Binden /Late Binding nciht zu"

    Programm ist ein TicTacToe Spiel Human vs CPU. Der gepostete Code ist nur ein Ausschnitt die Resest() Sub wird aus Form1 aufgerufen (siehe 3ten Post). Die erste Zeile des 9 Feld großen TicTacToe Feldes soll mit " " vorbelegt werden.

    Konkret geht es um:

    VB.NET-Quellcode

    1. Option Strict On
    2. Module Module2
    3. Dim SpielfeldBoxen As Array = {Form1.Txb0, Form1.Txb1, Form1.Txb2}
    4. Dim FreiesFeldZeichen As String = " "
    5. Dim SpielStandArray(8) As String
    6. Sub ResetGame()
    7. For i = 0 To 2
    8. SpielfeldBoxen(i).Text = FreiesFeldZeichen 'Late Binding Fehler (SpielfeldBoxen)
    9. SpielfeldBoxen(i).Enabled = True 'Late Binding Fehler (SpielfeldBoxen)
    10. SpielStandArray(i) = FreiesFeldZeichen
    11. Next
    12. End Sub
    13. ...
    14. End Module


    Ich weiß das es irgendwie mit DirectCast gehen sollte. Ich bekomme es nicht hin. Danke für Hilfe ...
    codewars.com Rank: 4 kyu

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „nogood“ ()

    Wahrscheinlich liegt es daran, dass Form1 keine Instanz ist.

    Jetzt müsste man noch wissen, wie und für was du das machst, und dann könnte man sicher eine Lösung finden.
    Was ich auch nicht ganz verstehe. Wie nutzt du Module2? Kommst du aus der Form1 heraus? Dann müsstest du ein Me bringen.

    Freundliche Grüsse

    exc-jdbi
    @ exc-jdbi danke
    Jetzt müsste man noch wissen, wie und für was du das machst, und dann könnte man sicher eine Lösung finden.

    Ich habe das erste Posting editiert. Hoffe jetzt ist klarer was ungefähr passiert. Mein Problem ist aber das Late Binding, da ist es denke ich nicht so wichtig genau zu sehen/verstehen das sonst noch so im Code steht.

    die zwei "Problem"-Zeilen sind denke ich diese

    VB.NET-Quellcode

    1. Dim SpielfeldBoxen As Array = {Form1.Txb0, Form1.Txb1, Form1.Txb2}
    2. SpielfeldBoxen(i).Text = FreiesFeldZeichen



    Ja ich rufe klassisch aus Form1 eine Sub aus dem Module2 auf.

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. Randomize()
    5. ResetGame()
    6. End Sub
    7. ...
    8. End Class


    Me. Wo soll das hin?
    codewars.com Rank: 4 kyu

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „nogood“ ()

    Hey,

    würde ich nicht in ein Modul auslagern. Mehr zum korrekten Umgang mit Windows-Forms findest Du hier.

    Dialoge: Instanziierung von Forms und Aufruf von Dialogen

    Empfehle ich Dir dringend, bevor Du Dir falsche Dinge aneignest.

    Nun zu Deinem Problem....

    Du deklarierst Deine Spielfelder als "Array", dies kann alles sein. Du musst spezifischer sein.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private _spielfelder As Control()
    3. Protected Overrides Sub OnLoad(e As EventArgs)
    4. MyBase.OnLoad(e)
    5. _spielfelder = {Me.TextBox1, Me.TextBox2, Me.TextBox3}
    6. ResetGame()
    7. End Sub
    8. Private Sub ResetGame()
    9. For Each x As Control In _spielfelder
    10. x.Text = "xxxx"
    11. x.Enabled = True
    12. Next
    13. End Sub
    14. End Class


    Kannst natürlich noch genauer sein, falls Du nur den Typ TextBox in das Array steckst.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private _spielfelder As TextBox()
    3. Protected Overrides Sub OnLoad(e As EventArgs)
    4. MyBase.OnLoad(e)
    5. _spielfelder = {Me.TextBox1, Me.TextBox2, Me.TextBox3}
    6. ResetGame()
    7. End Sub
    8. Private Sub ResetGame()
    9. For Each x As TextBox In _spielfelder
    10. x.Text = "xxxx"
    11. x.Enabled = True
    12. Next
    13. End Sub
    14. End Class


    Es geht auch so...

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private _spielfelder As List(Of TextBox)
    3. Protected Overrides Sub OnLoad(e As EventArgs)
    4. MyBase.OnLoad(e)
    5. _spielfelder = New List(Of TextBox) From {Me.TextBox1, Me.TextBox2, Me.TextBox3}
    6. ResetGame()
    7. End Sub
    8. Private Sub ResetGame()
    9. For Each x As TextBox In _spielfelder
    10. x.Text = "xxxx"
    11. x.Enabled = True
    12. Next
    13. End Sub
    14. End Class


    Mit Listen kannst Du flexibler arbeiten.

    Lass Dir jedoch gesagt sein, dass Controls nicht als Spielfelder genutzt werden sollen. Dafür gibts andere Techniken.

    Bitte edit beachten, sonst gibts ne NullReferenceException....!
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

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

    @SpaceyX Thx
    Mit

    VB.NET-Quellcode

    1. Private _spielfelder As TextBox() = {Me.TextBox1, Me.TextBox2, Me.TextBox3}

    verschwinden die Binding Fehler.

    Das Programm ist nur eine Übung/Spielerei. Das ich 9 Textboxen als Spielfläche missbrauche war für mich die einfachste Lösung (Alternativen sind mit nicht eingefallen).
    Der verlinkten Post von RfG liegt schon in meinen Bookmarks (verstehe ich aber noch nicht wirklich).

    Frage: Wäre es besser die "Variable" _spielfeld auf Public zu stellen und in Form1 zu deklarieren ? Möchte mir wirklich gerne keinem Mist aneignen.
    Danke noch mal für die Code Beispiele (List of wollte ich nicht verwenden).

    codewars.com Rank: 4 kyu
    Vorsicht mit dem Stück Code, das Du gerade gepostet hast. Das war noch vor dem Edit von meinem Post. Wenn Du das so nutzt, wirst Du wahrscheinlich einen Fehler bekommen. Schau lieber nochmal drüber (also über meinen Post).

    Nun, klar kannst Du die Variable auf Public stellen. Jedoch solltest Du diese Variable nur von der Form1 aus nutzen. Alles andere führt Dich wieder in Versuchung, falsche Dinge zu lernen. Dein Spiel findet nur in der Klasse "Form1" statt, also macht es nicht viel Sinn...

    Für das Auslagern von Code solltest Du Dir zuerst sicher sein, was Du da genau machst...

    Wenn Du mal beschreibst, was für ein Spiel das werden soll, kann man Dir evtl. ein paar neue Techniken beibringen.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Ich stell den kompletten Code in diesem Thread inkl. .exe und Screenshot ein.

    VBAnfänger TicTacToe Spiel Programm ist fertig und läuft ABER wie "schlimm" ist der Code ?

    In diesem Thread wäre dann Schluß... Danke und vielleicht sehen wir uns da im anderen Thread.
    codewars.com Rank: 4 kyu