Funktion hinter Button läuft schon los, ohne diesen zu drücken.

  • Hallo,

    momentan stehe ich mal wieder voll auf dem Schlauch.

    kurze Erklärung:

    • via Funktion 1 erstelle ich meine GUI
    • hier meine While - Wend Schleife
    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    _Exit(); Wenn X gedrückt wird, wird _Exit Funktion aufgerufen

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

    Case $WelcomeItem; Wenn Willkommen im 1. Frame gedrückt wird ..
    _Menu($WelcomeItem); ... dann 3. Frame mit Willkommensnachricht

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

    Case $SuchenItem; Wenn "Suche Dokumente auf" im 1. Frame gedrückt wird
    _Menu($SuchenItem); ... dann bestücke den 2. und 3. Frame

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

    Case $SuchenItemSub[1]; Wenn das Such Item angeklickt wird
    _Menu($SuchenItemSub[1]); ... gehe zur Funktion

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

    Case $SuchenItemSub[2]; Wenn das Such Item angeklickt wird
    _Menu($SuchenItemSub[2]); ... gehe zur Funktion

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

    Case $SuchenItemSub[3]; Wenn das Such Item angeklickt wird
    _Menu($SuchenItemSub[3]); ... gehe zur Funktion

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

    Case $SuchenItemSub[4]; Wenn das Such Item angeklickt wird
    _Menu($SuchenItemSub[4]); ... gehe zur Funktion

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

    Case $SuchenItemSub[5]; Wenn das Such Item angeklickt wird
    _Menu($SuchenItemSub[5]); ... gehe zur Funktion

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

    Case $SuchenItemSub[6]; Wenn das Such Item angeklickt wird
    _Menu($SuchenItemSub[6]); ... gehe zur Funktion

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

    Case $SuchenItemSub[7]; Wenn das Such Item angeklickt wird
    _Menu($SuchenItemSub[7]); ... gehe zur Funktion

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

    Case $SuchenItemSub[8]; Wenn das Such Item angeklickt wird
    _Menu($SuchenItemSub[8]); ... gehe zur Funktion

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

    Case $SuchenItemSub[9]; Wenn das Such Item angeklickt wird
    _Menu($SuchenItemSub[9]); ... gehe zur Funktion

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

    Case $SuchenItemSub[10]; Wenn das Such Item angeklickt wird
    _Menu($SuchenItemSub[10]); ... gehe zur Funktion

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

    Case $SuchenItemSub[11]; Wenn das Such Item angeklickt wird
    _Menu($SuchenItemSub[11]); ... gehe zur Funktion

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

    Case $SuchenItemSub[12]; Wenn das Such Item angeklickt wird
    _Menu($SuchenItemSub[12]); ... gehe zur Funktion

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

    Case $SuchenItemSub[13]; Wenn das Such Item angeklickt wird
    _Menu($SuchenItemSub[13]); ... gehe zur Funktion

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

    Case $SuchenItemSub[14]; Wenn das Such Item angeklickt wird
    _Menu($SuchenItemSub[14]); ... gehe zur Funktion

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

    Case $SuchenItemSub[15]; Wenn das Such Item angeklickt wird
    _Menu($SuchenItemSub[15]); ... gehe zur Funktion

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

    Case $GUI_Button02; Wenn der Suchen Knopf gedrückt wird ...
    _Menu($GUI_Button02); gehe in die Funktion _Menu und übergeben den Case "$GUI_Button02"
    EndSwitch
    WEnd

    [/autoit]
    • die Funktion _Menu sieht so aus
    Spoiler anzeigen
    [autoit]


    Func _Menu($Case); Je nach Fall (Case), wird die Funktion unterschiedlich bestückt

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

    If $Case = $WelcomeItem Then
    ConsoleWrite("Willkommen wurde gedrückt" & @CRLF)
    GUICtrlSetState($SuchenItem, $GUI_HIDE); verstecke die "Suche Dokumente auf"
    GUICtrlSetState($ErstelleItem, $GUI_HIDE); verstecke die "BTZ erstellen auf"
    GUICtrlSetState($FindeReadOnlyUserItem, $GUI_HIDE); verstecke die "Finde Benutzer mit Lesezugriff
    _GUIChangeItems($SuchenItemLabel, $FindeReadOnlyUserLabel, $WelcomeItemLabel, $WelcomeItemLabel); Zeige die Willkommenseite im 3.Frame
    ; Erstelle den oberen Frame
    $FrameOben = GUICtrlCreateLabel("", 241, 0, @DesktopWidth - 241, 91); $FrameOben wird erstellt - als Label
    GUICtrlSetState($FrameOben, $GUI_DISABLE)
    EndIf

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

    If $Case = $SuchenItem Then
    ConsoleWrite("Suche Dokumente auf wurde gedrückt" & @CRLF)
    GUICtrlSetState($WelcomeItem, $GUI_HIDE); verstecke die "Willkommen"
    GUICtrlSetState($ErstelleItem, $GUI_HIDE); verstecke die "BTZ erstellen auf"
    GUICtrlSetState($FindeReadOnlyUserItem, $GUI_HIDE); verstecke die "Finde Benutzer mit Lesezugriff
    _GUIChangeItems($WelcomeItemLabel, $FindeReadOnlyUserLabel, $SuchenItemLabel, $SuchenItemLabel); Wechsel zum Label für die Dokumentensuche
    ; Erstelle den oberen Frame
    $FrameOben = GUICtrlCreateLabel("", 241, 0, @DesktopWidth - 241, 91); $FrameOben wird erstellt - als Label
    GUICtrlSetState($FrameOben, $GUI_DISABLE)
    ;GUICtrlCreateCheckbox("Checkbox 1", 250, 30)
    EndIf

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

    If $Case = $SuchenItemSub[1] Then; DB1
    $SelectedDatabase = "DB1"
    $DBSelection = _DatabaseSelection($SelectedDatabase); Datenbankverbindung wird aufgebaut
    EndIf

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

    If $Case = $SuchenItemSub[2] Then; DB2
    $SelectedDatabase = "DB2"
    $DBSelection = _DatabaseSelection($SelectedDatabase); Datenbankverbindung wird aufgebaut
    EndIf

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

    If $Case = $GUI_Button02 Then; Wenn der Suchen Knopf gedrückt wird
    ConsoleWrite("Combo2 ist " & GUICtrlRead($GUI_Combo02) & " Input1 ist " & GUICtrlRead($GUI_Input01) & @CRLF)
    EndIf
    EndFunc ;==>_Menu

    [/autoit]

    Mein Problem ist jetzt $GUI_Button02. Hier sollte der ConsoleWrite ja erst erfolgen, wenn ich den Button drücke, aber ich sehe das hier gleich in die Console geschrieben wird, bevor ich den Knopf drücke. Ich vermute mal ein Layer 8 Hitze Problem :cursing:

    Danke für die Unterstützung

  • Deine Switch case Sache kannste schonmal rauswerfen, ziemlich unnötig tausend cases zu machen wenn du sowieso immer das selbe tust, nämlich die $msg an die Funktion _menu() weiterreichen. Das ganze kann also wie folgt zusammengefasst werden:

    [autoit]


    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    _Exit(); Wenn X gedrückt wird, wird _Exit Funktion aufgerufen

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

    Case $WelcomeItem, $SuchenItem, $GUI_Button02
    consolewrite("gui msg: " & $msg & " wert von gui_button02: " & $GUI_Button02 & @crlf)
    _Menu($msg)
    EndSwitch

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

    for $i = 1 to 15
    if $msg = $SuchenItemSub[$i] then _Menu($msg)
    next
    WEnd

    [/autoit]


    Wo dein Fehler liegt kann ohne den restlichen Code niemand sagen, denn dazu müssten wir wissen warum der Case $GUI_Button02 fälschlicherweise aufgerufen wird. Ich tippe darauf, dass du die Variable nur deklariert hast, aber beim ersten Durchlauf der Switch Case Verzweigung noch keinen Wert zugewiesen hast. Dadurch hat die Variable noch den Wert 0. Wenn man nichts angeklickt hat liefert guigetmsg soweit ich mich erinnere immer 0. Somit ist der Case erfüllt wenn man nichts tut und die Funktion wird aufgerufen.

    Um das zu prüfen hab ich oben mal ein consolewrite eingebaut.

  • Hi,

    erst mal danke für die Zeilen Optimierung. Das mit der nicht zugewiesenen Variable kommt vielleicht hin. Sie Variable wurde als Global definiert, jedoch wird der Button erst erstellt, wenn eine Datenbank ausgewählt wurde. Ich möchte sozusagen erste mein Menü 1 aufbauen und je nachdem, was dort angeklickt wird, sieht Menü 2 dann anderst aus. Der Button ist in Menü 2 eingebaut.

    Soll ich die Variable erst deklarieren, wenn ich Sie erstelle ?

  • Hallo Bugfix,

    nur so zum Verständnis. Ich könnte verschiedene Controls mit unterschiedlichen Variablen auf überschneidenden Koordinaten erzeugen lassen und dann z.B. via

    [autoit]


    GUICtrlSetState($GUI_Button02, $GUI_HIDE)

    [/autoit]


    verstecken ?

    Je nachdem, welchen Punkt ich von Menü 1 anklicke, lasse ich dann via

    [autoit]


    GUICtrlSetState($GUI_Button02, $GUI_SHOW)

    [/autoit]


    meine Controls sichtbar werden ?

  • Wie sollte ich dir darauf eine Antwort geben können, ich kenne den restlichen Code nicht und kann somit nicht nachvollziehen was du wann und wie machst. Tatsache ist aber, dass eine nicht deklarierte aber in der gui Schleife verwendete Variable zum Absturz führt. Eine deklarierte Variable mit Wert 0 führt hingegen zu ungewünschtem Verhalten wie du ja selbst festgestellt hast.

    Lösungen:

    1. Das Control von Anfang an erstellen, kann ja unsichtbar sein und später auch mit guictrlsetdata verändert werden bevor du es sichtbar machst
    2. Weise bei der Deklaration einen Wert zu, welcher niemals von guigetmsg zurückgegeben wird, z.B. -99999999999 oder so, dabei aber vorsichtig sein, da guigetmsg durchaus auch negative Werte annehmen kann
    3. Alternativ kannst du auch den Case 0 abfangen, z.B. in dem du die switch case Verzweigung in eine if Bedingung setzt, also die switch case Verzweigung nur ausgeführt wird wenn $msg <> 0
    4. Oder du fängst den case 0 ganz am Anfang der Switch Case Verzweigung ab und machst in diesem Case eben garnichts

    EDIT: Ja genau das wollte dir Bugfix sagen ;)

  • Eine kleine Frage habe ich noch. Ist es möglich Controls, welche mit

    [autoit]

    GUIStartGroup

    [/autoit]

    zusammengefasst sind, auf einen Schlag unsichtbar zu machen, indem man

    [autoit]

    GUIStartGroup

    [/autoit]

    unsichtbar macht ?

  • Bezweifle ich, aber um das Ein und Ausblenden vieler Controls zu erleichtern kann man dummycontrols verwenden:


    [autoit]


    $startIDGroup1 = guictrlcreatedummy()
    ;...hier erstellst du deine controls
    $endIDGroup1 = guictrlcreatedummy()

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

    ; alle unsichtbar:
    for $i = $startIDGroup1 to $endIDGroup1
    guictrlsetstate($i,$GUI_HIDE)
    next

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

    sleep(5000)

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

    ; alle sichtbar:
    for $i = $startIDGroup1 to $endIDGroup1
    guictrlsetstate($i,$GUI_SHOW)
    next

    [/autoit]


    EDIT:

    Eine weitere Alternative wären getrennte Fenster die man abwechselnd sichtbar oder unsichtbar macht, was nun geschickter ist muss man von Fall zu Fall entscheiden.