Sub läuft nicht weiter

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von Twintop.

    Sub läuft nicht weiter

    Hey Leute, ^^
    Ja ich bin nach langer Pause auch wieder mal on :)

    Ok also gut zu meiner eig. Frage.
    Ich bin gerade dabei einen Vokabeltrainer zu programmieren (für meine Klasse) und stoße immerwieder auf folgendes Problem.

    VB.NET-Quellcode

    1. Shared Path = "C:\Users\Phytec\Documents\Englisch\unit1anfang.txt"
    2. Shared s = 0
    3. Public vokunit1(79)
    4. Dim sr2 As StreamReader = New StreamReader("C:\Users\Phytec\Documents\Englisch\unit1anfang.txt")
    5. Public Sub Unit1()
    6. Do
    7. vokunit1(s) = sr2.ReadLine
    8. MsgBox(vokunit1(s))
    9. s = s + 1
    10. Loop Until sr2.ReadLine = Nothing
    11. sr.Close()
    12. Label2.Text = vokunit1(0)
    13. End Sub


    so und meine .._Load Sub:

    VB.NET-Quellcode

    1. Public Sub Abfrage_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. Unit1()
    3. End Sub


    DEMNACH müssten alle Zeilen, die in meiner Datei sind, in das Array "vokunit(s)" definiert werden.
    Das Problem ist das mein Label2 seinen Text nicht verändert. Es bleib immernur "Label2" dort stehen.
    Ich habe auch versuch anstatt "Label2.Text = vokunit1(0)" eine MsgBox aufzurufen, nur diese wird auch nicht aufgerufen.
    Kann mir jemand helfen?

    MfG Twintop :rolleyes:
    ahoi,

    du willst alle zeilen die du in der textdatei hast in ein array schreiben ?
    versuchs mal damit

    VB.NET-Quellcode

    1. vokunit() = File.ReadAllLines(path)

    du brauchst dazu noch die System.IO

    müsste einfacher gehen ;)

    außerdem würde ich dir empfehlen deine variablen mit datentypen zu versehen
    das könnte dein problem evtl verursachen
    Grüße Manu

    Was Gott dem Menschen erspart hat, kann der Computer.
    Billy ©, (*1932), Schweizer Aphoristiker
    Quelle: www.Aphorismen.de
    hey danke,
    nur hab ich jetzt das problem

    Quellcode

    1. Die Indexanzahl ist kleiner als die Anzahl der Dimensionen des indizierten Arrays.
    anzeigt.
    dabei unterkringelt er mir immer

    vokunit1() = File.ReadAllLines(Path)
    warum?

    Trotzdem danke für deine Hilfe ;)


    MfG Twintop ^^
    Hallo Twintop,

    eigentlich bin ich es leid mich immer zu wiederholen - aber dein Beitrag ist so schlecht - da muss ich was dazu sagen.

    1. Variablen immer einen Typ zuweisen
    falsch

    VB.NET-Quellcode

    1. Shared s = 0
    2. Public vokunit1(79)

    richtig

    VB.NET-Quellcode

    1. Shared s = 0 As Integer
    2. Public vokunit1(79) As String

    2. Eine Textdatei kann man auch in einem Rutsch einlesen
    z.B. so

    VB.NET-Quellcode

    1. Dim sr2 As StreamReader = New StreamReader("C:\Users\Phytec\Documents\Englisch\unit1anfang.txt")
    2. Dim inhalt() As String = sr2.ReadToEnd.Split(Environment.NewLine)

    Dazu gibt es aber - hier im Forum - tausende Beiträge. ;)

    3. Variablen einer Klasse als Public zu deklarieren ist nicht schön.
    nicht schön

    VB.NET-Quellcode

    1. Public vokunit1(79)

    schöner ist es, wenn auf die Werte schon von Außerhalb zugegriffen werden soll, dies über Properties zu lösen

    VB.NET-Quellcode

    1. Private _meineVariable As String
    2. Public Property MeineTestProperty() As String
    3. Get
    4. Return _meineVariable
    5. End Get
    6. Set(ByVal value As String)
    7. _meineVariable = value
    8. End Set
    9. End Property


    4. Shared wird nur in Ausnahmefällen benötigt.

    Alles in allem Furchtbar.

    Gruss

    mikeb69
    Danke!!!
    Sorry das ich nochmal frage aber wenn ich jetzt meinen Text soweit überarbeitet habe (ich bleib bei Shared AUCH wenn es nicht schön ist)
    und beim laden der form die sub "Aufrufen" aufrufe,

    VB.NET-Quellcode

    1. Public Sub Unit1()
    2. Dim sr2 As StreamReader = New StreamReader("C:\Users\Phytec\Documents\Englisch\unit1anfang.txt")
    3. vokunit1 = sr2.ReadToEnd.Split(Environment.NewLine)
    4. s = s + 1
    5. End Sub
    6. Public Sub Abfragen()
    7. Randomize()
    8. y = Math.Round(79 * Rnd())
    9. 'Prüfen ob y ungerade ist
    10. If (y / 2) * 2 <> y Then
    11. y = y - 1
    12. End If
    13. Label2.Text = vokunit1(y)
    14. MsgBox(vokunit1(y))
    15. End Sub

    zeig er mir in der Msgbox die Vokabel an nur das Label hat dann keinen Text. Kann jemand helfen? :?:

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

    ich kann die dimensierung niucht weglassen weil ich dann nicht mehr durcheinander die vokabeln abfragen kann

    Selbstverständlich kannst du auch ohne. Ich sehe kein Problem?

    Übrigens zu:
    danke für den sehr :!: netten :!: hilfreichen beitrag :evil:

    Mike's Beitrag war wirklich besonders hilfreich, dein Code ist wirklich gruselig. Daraus solltest du lernen, damit du es das nächste mal besser machst... deinen obigen Code kann man in gute zwei Zeilen fassen, etwa so:

    VB.NET-Quellcode

    1. Dim lines() As String = IO.File.ReadAllLines("datei.txt") ' alle Zeilen der Datei in einen mehrdimensionalen String einlesen
    2. Array.ForEach(lines, Function(line As String) MessageBox.Show(line)) ' für Ausgabe

    Übrigens: lines.Length gibt dir die Anzahl aller Elemente zurück. Damit hast du deine Obergrenze.

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

    Vllt. weil es das falsche Label ist? :| Zudem

    VB.NET-Quellcode

    1. Public Sub Unit1()
    2. Dim sr2 As StreamReader = New StreamReader("C:\Users\Phytec\Documents\Englisch\unit1anfang.txt")
    3. vokunit1 = sr2.ReadToEnd.Split(Environment.NewLine) ' alternativ direkt IO.File.ReadAllLines
    4. s = s + 1 ' brauchst du wohl nicht mehr
    5. End Sub
    6. Public Sub Abfragen()
    7. Randomize()
    8. y = Math.Round(79 * Rnd()) ' besser: System.Random benutzen
    9. 'Prüfen ob y ungerade ist
    10. If (y / 2) * 2 <> y Then ' wie wärs mit modulo??
    11. y = y - 1
    12. End If
    13. Label2.Text = vokunit1(y)
    14. MsgBox(vokunit1(y)) ' MessageBox.Show
    15. End Sub

    kevin89 schrieb:

    'Prüfen ob y ungerade ist If (y / 2) * 2 <> y Then ' wie wärs mit modulo?? y = y - 1 End If

    Mich wundert es, dass soetwas überhaupt funktioniert:
    y=3 ->
    y/2 = 1.5 *2 = 3

    VB.NET-Quellcode

    1. If y Mod 2 = 1 Then y -= 1


    Du solltest dringend die Openbooks lesen (!)

    Warum bist du eigentlich so sturr und willst die Variablen unbedingt als "Shared" deklarieren?
    An sonsten:

    VB.NET-Quellcode

    1. Dim Vokabeln As System.Generic.Dictionary Of(String, String)
    2. ---------------
    3. Vokabeln.Items.Add(sr.ReadLine(),sr.ReadLine()) 'Vokabeln einlesen und dirket in DE/E sortiert im Dictionary abspeichern


    Arrays fixieren dich nur auf feste Anzahlen an Vokabeln.
    Dictionaries haben weiterhin den Vorteil, dass mach Vor- und Rückwärts abfragen kann.
    Was macxhst du z.B. wenn Unit2 107 Vokabeln hat? Das Programm umschreiben? :thumbdown: