Steuerung zurück zu GUI

  • Servus

    Und weil ich grad dabei bin - gleich noch eine Frage:

    Wie kann man die Steuerung an das GUI zurück geben - um Eingaben zu korrigieren oder versäumte nachzuholen?

    Beispiel:

    Spoiler anzeigen

    #include <ButtonConstants.au3>

    #include <GUIConstantsEx.au3>

    #include <WindowsConstants.au3>

    #Region ### START Koda GUI section ### Form=

    $Form1 = GUICreate("Form1", 218, 286, 192, 114)

    $Group1 = GUICtrlCreateGroup("Aufgabe auswählen:", 30, 20, 131, 166)

    $Radio1 = GUICtrlCreateRadio("Radio1", 50, 50, 70, 17)

    $Radio2 = GUICtrlCreateRadio("Radio2", 50, 90, 70, 17)

    $Radio3 = GUICtrlCreateRadio("Radio3", 50, 130, 70, 17)

    GUICtrlCreateGroup("", -99, -99, 1, 1)

    $Button1 = GUICtrlCreateButton("Start", 30, 200, 131, 36)

    GUISetState(@SW_SHOW)

    #EndRegion ### END Koda GUI section ###

    Global $test = 0

    While 1

    $nMsg = GUIGetMsg()

    Switch $nMsg

    Case $GUI_EVENT_CLOSE

    Exit

    Case $Radio1

    $test = 1

    Case $Radio2

    $test = 2

    Case $Radio3

    $test = 3

    Case $Button1

    If $test = 0 Then

    If 2 = MsgBox(21, "Achtung", "Nix ausgewählt - bitte eine Aufgabe wählen") Then Exit

    EndIf

    ; ?............? was sollte hier stehen ...

    MsgBox(1,"","Anstelle dieser MsgBox sollte die Steuerung wieder an Form 1 zurück gegeben werden")

    EndSwitch

    WEnd

    Natürlich gibt es Möglichkeiten, dieses Problem anders zu lösen - etwa bereits eine Radio-Auswahl vorzuschlagen oder die Starttaste erst nach einer solchen zu aktivieren oder ....

    Aber mich würde genau diese Lösung interessieren.

    SG, entsel

    Schöne Grüße,
    entsel
    AutoLisp(eln) geht ganz gut, aber AutoIt nur mit Dictionary. 
    Das Problem - man sollte wissen, welche Vokabel man sucht.

  • Ich würde so etwas über ein Status Label auf der Main GUI machen. Wenn das nicht reicht, eine weitere GUI nur für Meldungen.

  • Wie gesagt, es gibt andere Lösungen.

    Diese MsgBox wegzulassen, würde zwar im gezeigten Beispiel helfen, aber die steht hier nur als "Platzhalter" für das, was eigentlich mit der (nicht getroffenen) Auswahl gemacht werden soll.

    In dem Sinn von "geh nochmal zurück, mach die Auswahl, dann geht's hier weiter ...".

    Schöne Grüße,
    entsel
    AutoLisp(eln) geht ganz gut, aber AutoIt nur mit Dictionary. 
    Das Problem - man sollte wissen, welche Vokabel man sucht.

  • Verstehe nicht ganz die Schwierigkeit. Also Du hast eine GUI, wo Eingabewerte kommen, wenn jetzt ein Button gedrückt wird, wird der Kram eingelesen und auf Eingabefehler überprüft?

    Das würde ich dann mit einer Prüf-Func machen, dann die Controls mit falschem Inhalt anmalen... Oder hab ich es noch nicht verstanden?

    Fakt ist, dass MsgBox() das Skript anhält und wartet. Da geht nichts drum herum. Wenn es weiterlaufen soll, musst Du dir z.B. eine eigene CustomMsgBox() basteln.

  • Ehrlich gesagt kann ich auch nicht ganz nachvollziehen wo das Problem liegt.


    Geht das in etwa in die Richtung deines Vorhabens?

  • Ich glaube, ich habe es heute verstanden. :)

    Du willst irgendwo in der Mitte Deines Skriptes weitermachen, oder? Also so eine Art GOTO --> Label?

    Das kannst Du über Zustands-Bits erreichen...

    Beispiel: If _irgendeinePruefung($vonirgendwas) Then $bInputdataOK = True

    So behältst Du irgendeinen Zustand und kannst im Code dann bereits durchlaufene Schritte skippen.

    Aber da sind wir wieder bei einem Integritätscheck und jeder Menge Ifs. Ich sehe da keinen Vorteil drin. Eher den Nachteil, dass Du zu dem Zustand der Controls der GUI noch einen gespeicherten Zustand hast.

    IMHO sollte der Zustand beim Click auf "Start" geprüft werden. _Assert()oder etwas selbst gebautes. Es macht immer Sinn, Eingangsvariablen gegen ihre jeweiligen Gültigkeitsbereiche abzugleichen. Dann den Zustand gegen Veränderung sichern (Controls disablen oder vileicht die ganze Eingabemaske ausblenden und während der Laufzeit eine Status.-GUI anzeigen...). Möchte Dir nicht meinen Stil aufdrängen. :S

  • Mit GuiCtrlRead() kannst du die Controls direkt abfragen, ob dein gewünschtes Radio Control selektiert ist.

    Aber ich bin mir nicht sicher, ob ich die Frage richtig verstanden habe. :/

  • Servus miteinander

    Zec hat es in #7 am ehesten getroffen - es geht nicht um ein praktisches Problem sondern um reine Theorie - einfach nur zu Lernzwecken - und zwar um die Frage, ob man ein GUI mehrfach aufrufen/aktivieren kann.

    Die Wiederholen-Taste sollte "das Programm" einfach "zurück zum GUI" schicken.

    Wenn aber mein Code-Beispiel in die falsche Richtung führt, vielleicht anders gesagt:

    Ein GUI wird erstellt/definiert/? und mit "GUISetState(@SW_SHOW)" aufgerufen/zur Anzeige gebracht.

    Und weil's jetzt schon da ist, könnte man es ja bei Bedarf öfter/mehrfach verwenden - etwa mit (Achtung Fantasiecode:) GUISetState($Form1, @SW_SHOW) oder GUICtrlSetState($Form1, $GUI_ENABLE).

    Oder:

    Func _gui()

    GUICreate

    ...

    ...

    GUISetState(@SW_SHOW)

    EndFunc

    Dann könnte man das ja öfter verwenden. (Das GUI soll dann aber nicht dupliziert werden).

    Die Frage wäre - geht sowas? Also ohne den Umweg über Func, das hab ich probiert - geht - allerdings wird dann das GUI dupliziert.

    Schöne Grüße,
    entsel
    AutoLisp(eln) geht ganz gut, aber AutoIt nur mit Dictionary. 
    Das Problem - man sollte wissen, welche Vokabel man sucht.

  • Klar, GUI an/aus, kein Problem. Hier ein Schnipsel, der genau das macht:

    AutoIt
    [... der user hat alles eingegeben und jetzt ist der automat dran ...]
    GUISetState(@SW_DISABLE, $gui) ; wir nehmen ihm die eingabegui weg
    GUISetState(@SW_MINIMIZE, $gui)
    ProgressOn("Jetzt wird gearbeitet!", "Lehnen Sie sich zurück, jetzt muss die CPU erstmal ran. Ctrl+A für Abbruch", "", Default, Default, 16)
    [...]

    Danach ProgressOff() und die GUI wieder aktivieren und restoren.

    Statt ProgressOn() kann man auch eine zweite GUI basteln und über GUISetState() de-/aktivieren.

  • Hallo Zec

    Mich würde aber "die andere Abzweigung" interessieren - bleiben wir beim Beispiel:

    - ...

    - Case $Button1 ; Start gedrückt

    - der User hat nicht alles eingegeben => Fehler

    - if Fehler => die MsgBox macht ihn drauf aufmerksam

    - er klickt auf "Wiederholen" (die MsgBox schließt sich)

    - if "wiederholen geklickt" then

    ?????????????????????? => GOTO GUI - also die GUI wieder reaktivieren (Programm wartet auf Eingabe) => weiter s.u. *)

    - else ; alles eingegeben

    - weiter im Programm

    - ...

    *)

    - User ergänzt die fehlenden Eingaben (oder macht sie neu)

    - User klickt (wieder ) Start

    - jetzt alles ok - keine MsgBox

    - weiter im Programm

    die Frage ist also: was steht statt der ???????????????????

    Schöne Grüße,
    entsel
    AutoLisp(eln) geht ganz gut, aber AutoIt nur mit Dictionary. 
    Das Problem - man sollte wissen, welche Vokabel man sucht.

    Einmal editiert, zuletzt von entsel (17. Mai 2018 um 13:26)

  • Hier sind 2 ganz einfache Methoden:

    Die eine hat Zec ja schon erklärt. :)

  • Servus

    Es geht nicht darum ein GUI zu verbergen ;), sondern ihm nochmals den Focus zu geben / es nochmal aufzurufen / nochmal anzuzeigen / ihm nochmals die Programmsteuerung zu übergeben, ... (wie nennt man das?)

    Es geht nur um den Code, wo die "????" stehen.

    Oder mit Hilfe des Screenshots - was muss in Zeile 32 stehen, damit das Programm quasi in Zeile 12 weitermacht, also nochmals Form1 anzeigt?

    (Falls das überhaupt so möglich ist ???)


    reaktiviere GUI.jpg

    Schöne Grüße,
    entsel
    AutoLisp(eln) geht ganz gut, aber AutoIt nur mit Dictionary. 
    Das Problem - man sollte wissen, welche Vokabel man sucht.

  • Dann wechsle in den OnEventModus und schon klappt alles:

    Ist aber trotzdem kein guter Stil und würde ich so nicht empfehlen (der Programmflow ist nicht eindeutig).

    • Offizieller Beitrag

    GUICtrlRead($Radio1) = $GUI_CHECKED

    Auch wenn der Fall eher selten eintreten wird, aber das Ergebnis von GuiCtrlRead($Radio) ist nicht zwingend nur ein Wert, sondern kann eine Kombination von Werten sein.

    Deshalb auf Nummer sicher gehen und sich angewöhnen: If BitAND(GUICtrlRead($Radio), $GUI_CHECKED) Then

  • OK Leute,

    danke, dass Ihr Euch die (vergebliche) Mühe gemacht habt, mir andere Lösungen anzubieten. Aber auch daraus kann man lernen.

    Ich habe eine ähnliche Aufgabe auch anders gelöst (Func - GuiCreate ... GuiShow - EndFunc). Aber dabei hat sich halt auch die Frage ergeben - siehe oben.

    Ich gehe also mal davon aus dass es keinen Befehl, keine Funktion gibt mit der man einem bereits definierten und angezeigten GUI nochmals das "Kommando" zurückgibt. Man kann also die Fragezeichen in Zeile 32 - letztes Beispiel - nicht durch etwas ersetzen, das quasi das Programm auf Zeile 12 zurückbefiehlt.

    Ich denke, die Antwort auf meine Frage ist damit gegeben und lautet: "Nein, das geht nicht".

    Schöne Grüße,
    entsel
    AutoLisp(eln) geht ganz gut, aber AutoIt nur mit Dictionary. 
    Das Problem - man sollte wissen, welche Vokabel man sucht.

  • OK Leute,

    danke, dass Ihr Euch die (vergebliche) Mühe gemacht habt, mir andere Lösungen anzubieten. Aber auch daraus kann man lernen.

    Ich habe eine ähnliche Aufgabe auch anders gelöst (Func - GuiCreate ... GuiShow - EndFunc). Aber dabei hat sich halt auch die Frage ergeben - siehe oben.

    Ich gehe also mal davon aus dass es keinen Befehl, keine Funktion gibt mit der man einem bereits definierten und angezeigten GUI nochmals das "Kommando" zurückgibt. Man kann also die Fragezeichen in Zeile 32 - letztes Beispiel - nicht durch etwas ersetzen, das quasi das Programm auf Zeile 12 zurückbefiehlt.

    Ich denke, die Antwort auf meine Frage ist damit gegeben und lautet: "Nein, das geht nicht".

    Aber das würde ja auch gar keinen Sinn machen, wieder auf Zeile 12 zu springen.

    Es gibt schon bestimmte Logiken, die man als Programmier anwenden und einhalten muss,

    ansonsten funktioniert das System nicht. :)