Problem mit If, mehrere ElseIf Fälle werden ausgelöst

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

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

    Problem mit If, mehrere ElseIf Fälle werden ausgelöst

    Hey,

    In einem Programm, an dem ich gerade arbeite, kann mit RadioButtons ein Prozess ausgewählt werden, welcher dann durch einen Button gestartet wird.
    Dazu habe ich den folgenden Code:

    VB.NET-Quellcode

    1. Private Sub startbtn_Click(sender As Object, e As EventArgs) Handles startbtn.Click
    2. If rdu1.Checked = True Then
    3. ' Prozess 1
    4. ElseIf rdu2.checked = True
    5. ' Prozess 2
    6. ElseIf rdu3.checked = True
    7. ' Prozess 3
    8. ElseIf rdu4.checked = True
    9. ' Prozess 4
    10. ElseIf rdu5.checked = True
    11. ' Prozess 5
    12. End If​


    rdu sind hier die Radiobuttons. Wenn ich das Programm nun starte, einen Prozess auswähle und Start klicke, werden die 5 Prozesse, beginnend mit 1, 2, usw. nacheinander gestartet, unabhängig vom ausgewählten Prozess.
    Woran liegt das?

    Danke schonmal im Voraus
    Felix
    Grüße
    Felix
    Das ist sehr komisch. Was sagt das denn, wenn Du mal debuggst? Ach ja, ​= True ist redundant.

    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 :!:
    Hey, erstmal Danke.

    = true benutze ich auch sonst bei sowas nicht, hab nur alles Mögliche probiert, das ist nun das, was übrig ist.

    Wenn ich debugge, passiert nichts.. keine Fehlermeldung, ich klicke auf Start und alle 5 Prozesse starten.

    Felix
    Grüße
    Felix

    IchHeisseFelix schrieb:

    Wenn ich debugge, passiert nichts.. keine Fehlermeldung
    Mit Debuggen ist hier gemeint:
    Breakpoint setzen und im Singlestep-Verfahren durch.

    Eine If .. ElseIf Verzweigung geht immer nur durch einen Zweig.
    Wie startest du die Prozesse und wo?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ach ups..

    Die Prozesse werden mit einzelnen Subs gestartet, wo versteh ich nicht wirklich?

    Edit:

    Wenn ich in Einzelschritten ausführe, ist auch nichts besonderes. Klicke Start -> If läuft nach und nach durch, wodurch zeitgleich Subs zum Starten der Prozesse gestartet werden, mehr nicht.
    Grüße
    Felix

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

    Dann setze einen Breakpoint in die einzelnen Start-Subs und achte darauf, wo sie aufgerufen werden (da, wo nach Ende der Sub zurückgesprungen wird).

    Wenn es dich nicht überfordert, kannst du auch in der Sub den Call-Stack anschauen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Im Einzelschritt wird nach Klicken des Buttons durch die If-Prozedur der Sub gestartet, wo jeweils mit Process.start der Prozess geöffnet wird. Dann springt er wieder zurück zum If und läuft den nächsten Sub durch usw.
    Grüße
    Felix

    VB.NET-Quellcode

    1. Private Sub startbtn_Click(sender As Object, e As EventArgs) Handles startbtn.Click
    2. If rdu1.Checked = True Then
    3. start1()
    4. ElseIf rdu2.checked = True
    5. start2()
    6. ElseIf rdu3.checked = True
    7. start3()
    8. ElseIf rdu4.checked = True
    9. start4()
    10. ElseIf rdu5.checked = True
    11. start5()
    12. End If​



    VB.NET-Quellcode

    1. Private Sub start1()
    2. If File.Exists(Path.GetDirectoryName(Application.ExecutablePath) & "\files\1\setup.exe") Then
    3. Process.Start(Path.GetDirectoryName(Application.ExecutablePath) & "\files\1\setup.exe")
    4. Else
    5. MsgBox("Dateien nicht gefunden", MsgBoxStyle.Information)
    6. End If
    7. End Sub
    8. Private Sub start2()
    9. If File.Exists(Path.GetDirectoryName(Application.ExecutablePath) & "\files\2\setup.exe") And
    10. Process.Start(Path.GetDirectoryName(Application.ExecutablePath) & "\files\2\setup.exe")
    11. Else
    12. MsgBox("Dateien nicht gefunden", MsgBoxStyle.Information)
    13. End If
    14. End Sub
    15. Private Sub start3()
    16. If File.Exists(Path.GetDirectoryName(Application.ExecutablePath) & "\files\3\setup.exe") And
    17. Process.Start(Path.GetDirectoryName(Application.ExecutablePath) & "\files\3\setup.exe")
    18. Else
    19. MsgBox("Dateien nicht gefunden", MsgBoxStyle.Information)
    20. End If
    21. End Sub
    22. Private Sub start4()
    23. If File.Exists(Path.GetDirectoryName(Application.ExecutablePath) & "\files\4\setup.exe") then
    24. Process.Start(Path.GetDirectoryName(Application.ExecutablePath) & "\files\4\setup.exe")
    25. Else
    26. MsgBox("Dateien nicht gefunden", MsgBoxStyle.Information)
    27. End If
    28. End Sub
    29. Private Sub start5()
    30. If File.Exists(Path.GetDirectoryName(Application.ExecutablePath) & "\files\5\setup.exe") then
    31. Process.Start(Path.GetDirectoryName(Application.ExecutablePath) & "\files\5\setup.exe")
    32. Else
    33. MsgBox("Dateien nicht gefunden", MsgBoxStyle.Information)
    34. End If
    35. End Sub​
    Grüße
    Felix
    Jetzt fällt es mir wie Schuppen aus den Haaren:
    Bei allen ElseIf-Statements fehlt ein Then.
    Mach das = True weg und setze statt dessen ein Then
    Kaum zu glauben, wie sich das Auge (bzw. das Gehirn) irritieren lässt.

    Hat das tatsächlich so kompiliert?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

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

    Vermutlich interpretiert das der Compiler als leere Anweisung, weil der bedingte Code ohne Then direkt nach dem Else If ... kommen müsste, wenn ich das richtig im Kopf habe. Ist wohl wie ein Einzeiler bei Abfragen in C#, bei denen jeglicher Code danach unabhängig von der Abfrage ausgeführt wird und nur die Zeile direkt nach dem else if bedingt ist.
    So ist das hier wohl auch. Nur macht die VB.NET -Syntax das sehr unklar.

    Aber: Das ist nur Spekulation, ich habe keine Ahnung von VB.NET.

    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 :!:

    VB.NET-Quellcode

    1. If File.Exists(Path.GetDirectoryName(Application.ExecutablePath) & "\files\2\setup.exe") And
    2. Process.Start(Path.GetDirectoryName(Application.ExecutablePath) & "\files\2\setup.exe")
    3. Else
    4. MsgBox("Dateien nicht gefunden", MsgBoxStyle.Information)
    5. End If


    Da sollte das And auch zu Then (bei 2 Methoden ist das so)
    Ich muss morgen mal Tests fahren, wenn ich ein Visual Studio vor mir habe.
    Laut MSDN kann man die Then-Statements im Multiline-Modus anscheinend sogar weg lassen.
    msdn.microsoft.com/en-us/library/752y8abs(v=vs.140).aspx

    Was allerdings passiert, wenn man sie im If-Statement schreibt und bei ElseIf weg lässt, muss ich mir erst mal geanu anschauen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Versuch mal:

    VB.NET-Quellcode

    1. ​If rdu1.Checked Then start1()
    2. If rdu2.checked Then start2()
    3. If rdu3.checked Then start3()
    4. If rdu4.checked Then start4()
    5. If rdu5.checked Then start5()
    Da sich die Radio-Buttons gegenseitig ausschließen, müsste das gleichwertig sein.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Das, was in Post #2 bzw. #4 vorgeschlagen wurde, hast Du anscheinend immer noch nicht gemacht.
    Setze einen Haltepunkt an den Anfang der Methode und gehe Schritt für Schritt durch und guck Dir an, was passiert.

    Als nächstes:
    Tipp mal in einer neuen, leeren Methode (der Name ist egal) von Hand:

    VB.NET-Quellcode

    1. If True{Enter}

    Und statt {Enter} so einzutippen drückst Du die Enter-Taste. Also If, dann ein Leerzeichen, dann True und dann Enter.
    Poste den Code der ganzen Methode, den Du dadurch bekommst.
    Ich will herausfinden, ob Dir die IDE den Code korrekt vervollständigt.

    Welche IDE verwendest Du?
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    If True *Enter* spuckt diesen hier aus:

    VB.NET-Quellcode

    1. Private Sub Test()
    2. If True Then
    3. End If
    4. End Sub


    Wenn ich einen Haltepunkt an den Anfang des startbtn_click setze, und dann starte, passiert genau das gleiche wie so auch, der Haltepunkt wird garnicht wahrgenommen.


    @petaod
    Auch das startet alle 5..
    Grüße
    Felix

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