Nach dem Aufruf einer Schleife wieder zurück in die GUI

  • Hallo,

    ich lese schon seit eingier Zeit in diesem Forum, habe auch bereits einige Hilfe hier gefunden und kleinere Scripte geschrieben. Leider sitze ich aktuell an einem Problem und komme nicht weiter.

    Grundsätzlich habe ich eine kleine GUI gebaut, die Text anzeigt und 3 Button zur Verfügung stellt.

    Button1 führt weiteren Code mit MSGBoxen und Schleifen usw. aus.
    Button2 ebenfalls, aber anderen Code
    Button3 Beendet das ganze Programm

    Wenn ich Button 1 oder 2 drücke und an einem Punkt des Code dann "Exit" auslöse, endet nicht nur dieser Code sondern auch die GUI.

    Ich würde gerne dann wieder in die GUI springen, die sogar bis dahin noch offen im Hintergrund steht. Auch wenn der Code von Button 1 oder 2 fehlerfrei fertig ausgeführt ist, schließt sich alles auch die GUI, die möchte ich aber stehen lassen und nur über ihren Button3 beenden.

    Könnt ihr mir weiter helfen?

    Gruß

  • Ohne Code den du uns zeigen kannst, wie du es bisher geskriptet hast, können wir nur ins Blaue hinein raten.
    Im Regelfall sind die GUIs ja mit Switch-Cases aufgebaut und da genügt es, den Code der bei der Ausführung eines Buttons läuft "auslaufen" zu lassen.

    Wenn du am Ende diesen Codes kein Exit hast, so landest du auch wieder in der While-Schleife für die GUI-Switch-Case-Abfrage.

  • Hi,

    Vielleicht konnen dir die Befehle Return oder Exitloop etwas helfen (s. Hilfe).
    Ansonsten wäre es hilfreich dein Script zu kennen.
    [spoiler=Beispiel Return, Exitloop]

    [/spoiler]
    Return bricht Funktionen ab.
    Exitloop bricht Schleifen ab.

    mfg
    Zeitriss

  • Hey,

    ja, der Code könnte helfen... Hatte ich auch vor. Hab ich aber vergessen.

  • Hi,

    Du könntest Exit durch ContinueLoop ersetzen.

    Der übersichtlichkeits halber würde ich den Code allerdings in Funktionen verpacken und dann mit Return zur Hauptschleife zurückkehren (s. beispiel oben).
    Select-Case würde ich durch Switch-Case ersetzten (s. Hilfe)
    Die "Else-Abzweigung" beim "If" ist optional, wenn sie keinen Inhalt hat sollte sie weggelassen werden.

    Beispiel GUIMsg-Schleife mit Switch-Case und Funktionsaufrufen

    mfg
    Zeitriss

  • Hallo,

    vielen Dank, ContinueLoop war der Befehl der Befehle! :)

    Ich gebe dir recht, Funktionen wären schicker, aber so hab ich es hin bekommen.

    Else-Abzweigungen habe ich entfernt, unnötiges kann/soll/muss raus.

    Select/Switch werde ich mir mal anschauen, aber so funktioniert es jetzt wie ich möchte.

    Danke dir!

  • Beim nächsten Mal den grünen Haken setzen nicht vergessen ;) (1. Beitrag bearbeiten, Threadstatus anpassen).

    Zu deinem Script hätte ich aber mehrere Fragen:

    1. Warum Selectst du statt zu Switchen? Dann kannst du dir die Abfragen Case $msg = $button1 sparen und nur noch Case $button1 schreiben.
    2. Wieso prüfst du @error = 1, bei der InputBox gibt alles @error > 0 an, dass es gefailed ist also könntest du einfach If @error Then Exit schreiben und dir das Else + EndIf klemmen.
    3. Wieso schreibst du FileOpen("" &$PfadtxtDatei& "", 0)? Du kannst die Gänsefüßchen weglassen, AutoIt kommt damit hervorragend zurecht, das ist nicht die CMD.
    4. Wieso speicherst du die Returnwerte der MsgBoxen ab? Variablen die du nur einmal verwendest kannst du direkt in die If-Abfrage einbauen, sieht nicht nur schicker aus, sondern
    spart auch Platz und du brauchst weniger Variablen.
    5. If $Ping Not Then ist falsch, der Negierung muss vor der Ping-Variable.
    6. Wieso deklarierst du alle Variablen am Anfang? Deklariere sie doch erst wenn du sie brauchst.
    7. Du solltest deine Variablen sowie Buttons besser beschriften, $button1, $button2, $button3 sind nicht aussagekräftig. Wenn du in 2 Jahren in das Script reinguckst weißte nicht mehr was los ist.

  • 6. Wieso deklarierst du alle Variablen am Anfang? Deklariere sie doch erst wenn du sie brauchst.

    Ist bestimmt eine Philosophie-Frage - aber ich habe mir das extra angewöhnt. Da muss ich zwar bei jeden neuen Variablen wieder ganz an den Anfang scrollen (SciTE Jump sei Dank nicht so schlimm), habe dann aber alle Variablen die Global sind auf einem Blick.
    Die Variablen sortiere ich dann noch nach Aufgaben / Themen - bzw. Ich schreibe diese in entsprechenden Blöcken zusammen.

    Dann fällt mir auch das ich gerade die 5. Temp-Variable erstellen will etc.

    Und beim Kompilieren meckert die Funktion auch nicht das die Globale Variable eventuell noch gar nicht angelegt ist.

    Dann lieber der Hinweis den Variablennamen ggf. den gedachten Typ mitzugeben, also ob Text oder Zahl etc: https://www.autoitscript.com/wiki/Best_coding_practices

  • Ist bestimmt eine Philosophie-Frage - aber ich habe mir das extra angewöhnt.

    Ist meiner Meinung nach kein guter Stil, man sollte Variablen so lokal wie möglich deklarieren.
    Wenn ich die $sIPAddresse nur in dem $Button1 Case nutze, dann kann ich sie dort auch Lokal erstellen und nutzen, dazu muss ich sie nicht an oberster Stelle global hinschreiben.

    Wenn man später eine Funktion schreibt die Ausversehen auf die globale Variable mit dem selben Namen zugreift, dann sucht man sich dumm und dämlich bis man rausgefunden hat, welche Variable sie aus welchem Scope genommen hat.