iMsg mit mehreren Buttons funktioniert nicht wie gewünscht

  • Hallo zusammen,

    ich habe noch nicht sehr lange mit Autoit zu tun, bisher konnte ich meine Probleme allerdings durch reines suchen und lesen beheben. Jetzt bin ich an einem Punkt angelangt an dem ich entweder nicht die richtigen Fragen stelle, oder sonstwie auf dem Schlauch stehe.

    Ich erstelle in meiner GUI je nach Menge an Dateien Buttons die eine weitere Aktion ausführen sollen.

    Spoiler anzeigen
    [autoit]

    Func MainGui()

    [/autoit] [autoit][/autoit] [autoit]

    Local $bAusDone = False
    Local $i = 0
    Local $j = 0
    Local $iMsg =0

    [/autoit] [autoit][/autoit] [autoit]

    Global $hGUI = GUICreate("Automatische Auswertung ProfiTrace2",$gXBreite,$gYHoehe)
    Local $idBeenden = GUICtrlCreateButton("Beenden", $gXBreite-90, 5, 85, 35)
    Global $idPfAu = GUICtrlCreateButton("Pfad auswählen",5,5,150,35)
    Global $idAusStart = GUICtrlCreateButton("Auswertung starten",160,5,150,35)
    Global $idWordStart = GUICtrlCreateButton("Word erzeugen",315,5,150,35)
    Global $LblInfo = GUICtrlCreateLabel("Die laufende Auswertung kann mit der ESC Taste abgebrochen werden.",5,45,310,35)
    GUICtrlSetState ($idAusStart,$GUI_DISABLE)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW, $hGUI)

    [/autoit] [autoit][/autoit] [autoit]

    While 1

    [/autoit] [autoit][/autoit] [autoit]

    $iMsg = GUIGetMsg()

    [/autoit] [autoit][/autoit] [autoit]

    Switch $iMsg
    Case $GUI_EVENT_CLOSE, $idBeenden
    ExitLoop
    Case $idPfAu
    ;MsgBox($MB_SYSTEMMODAL," Gui Info 1 ",$idPfAu & GUIGetMsg())
    $bAusDone = False
    GUISetState(@SW_HIDE, $hGUI)
    Pfadauswahl()
    Case $idAusStart
    ;MsgBox($MB_SYSTEMMODAL," Gui Info 2 ",$idAusStart & GUIGetMsg())
    AusStarten()
    $bAusDone = True
    Case $idWordStart
    ;Word_erzeugen()
    _ArrayDisplay($BtnTN_Auswahl)
    Case $BtnPfad[0] To $BtnPfad[UBound($aFlt,1)-1]; Das hier funktioniert ohne Probleme
    For $i = 1 to UBound($aFlt,1)-1 Step 1
    If $iMsg = $BtnPfad[$i] Then
    ShellExecute(StringTrimRight($aFlt[$i], 4))
    ;MsgBox($MB_SYSTEMMODAL," Info", StringTrimRight($aFlt[$i], 4) & $i)
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Case $BtnTN_Auswahl[0] To $BtnTN_Auswahl[UBound($aFlt,1)-1] ;Hier ist das Problem
    For $j = 0 to UBound($aFlt,1)-1 Step 1
    If $iMsg = $BtnTN_Auswahl[$j] Then
    MsgBox(0,"TNAuswahl" &$j,$iMsg &" = " & $BtnTN_Auswahl[$j])
    call(TN_Auswahl($j))
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Case $idFertig
    GUISetState(@SW_HIDE, $hGUI2)

    [/autoit] [autoit][/autoit] [autoit]

    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    If $iMsg >0 Then MsgBox(0," iMsg = " &$iMsg,"Bla: " & $BtnTN_Auswahl[1]); hier wird die richtige Nummer angezeigt

    [/autoit] [autoit][/autoit] [autoit]

    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    ;If $bAusDone = True Then ShellExecute($sFileSelectFolder)

    [/autoit] [autoit][/autoit] [autoit]

    GUIDelete($hGUI)
    Exit

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit]

    Ich sehe den Fehler nicht, wenn ich 7 Buttons habe wird nur der 7 richtig ausgeführt. Wenn ich auf die anderen 6 Klicke bekomme ich über die MsgBox aber die korrekte ID geschickt.

    Vielen Dank,
    ingom

    2 Mal editiert, zuletzt von ingom (18. November 2014 um 09:11)

  • Hallo,

    hat noch keiner eine Idee gehabt wo der Fehler liegt?
    <Edit>
    Interessanterweise ändert sich das verhalten meiner Buttons je nach dem in welcher Reihenfolge ich die Abfrage anordne. Wenn ich die nicht funktionierenden ganz nach vorne setze, wird immer die Funktion aufgerufen, als iMsg kommt "0".
    Wenn ich die anderen Buttons noch vorne schiebe, haben die anderen Buttons keine funktion mehr, als wäre der Loop unterbrochen.
    >/Edit>

    Einmal editiert, zuletzt von ingom (23. Oktober 2014 um 14:51)

    • Offizieller Beitrag

    Genau das ist das Problem! Du erstellst die Buttons während die MessageLoop-Schleife bereits läuft.
    Die Button-Variablen haben als "Vorbelegung" den Wert Null. Die Null von $iMsg stimmt also mit der "Vorbelegung" überein und somit wird dieser Switch-Case-Zweig ausgeführt.

    Bei dynamisch erzeugten Control-Elementen würde ich immer den OnEventMode einsetzen, denn dort kann man einfach jedem Control-Element eine Funktion zuordnen.
    Mit Hilfe von @GUI_CtrlId erhält man dann (innerhalb der Funktion) die ControlId, wenn man den Button anklickt.

  • Genau das ist das Problem! Du erstellst die Buttons während die MessageLoop-Schleife bereits läuft.
    Die Button-Variablen haben als "Vorbelegung" den Wert Null. Die Null von $iMsg stimmt also mit der "Vorbelegung" überein und somit wird dieser Switch-Case-Zweig ausgeführt.

    Bei dynamisch erzeugten Control-Elementen würde ich immer den OnEventMode einsetzen, denn dort kann man einfach jedem Control-Element eine Funktion zuordnen.
    Mit Hilfe von @GUI_CtrlId erhält man dann (innerhalb der Funktion) die ControlId, wenn man den Button anklickt.

    Hallo Oscar,

    vielen Dank für die Hilfe. Ich werde das mal ändern.