Splashscreen-Gui mit Terminate Button / GuiEvents richtig abfangen

  • Hallo Gemeinde,

    ich habe ein kleines Programm entwickelt, das mir aus einer Excelliste Rechnernamen ausliest, und diese in eine Website einträgt.
    Das Ergebnis wird dann wieder in die Excelliste eingetragen. Da dieser Vorgang lange dauern kann, habe ich einen Splashscreen erstellt.
    Auf der Gui des Splashscreen befindet sich ein "Terminate-Button" um den Vorgang abzubrechen. Wie fange ich diesen Buttonklick richtig ab?
    Ein Case in der Schleife der Haupt-GUI funzt nicht, logischer Weise...


    2 Mal editiert, zuletzt von hipfzwirgel (20. August 2025 um 16:06)

  • Hallo Moombas,

    Das war mein erster Versuch aber da der Splashscreen ja auch auf einer GUI basiert, reagiert GuiGetMsg nicht darauf.
    Ich teste gerade folgendes: der Splashscreen wird ja in der Func _Fetch_UBL_BySheet($aSheets[$i]) aufgerufen. Ich deaktiviere also zunächst die Hauptgui

    Code
    ; Beispiel:
    Case $idButtonReadSelected
    			GUISetState(@SW_DISABLE, $Hauptform) ; Hauptform deaktiveren wg Form in _SplashStart() / alle Gui-Variablen müssen dort anders heissen!!
    			For $i = 0 To 3
    				If GUICtrlRead($idRadio[$i]) = $GUI_CHECKED Then
    					_Fetch_UBL_BySheet($aSheets[$i])
    					ExitLoop
    				EndIf
    			Next
    			GUISetState(@SW_ENABLE, $Hauptform) ; Hauptform wieder aktivieren

    und aktiviere sie im Nachgang wieder. Durch eine eigene While für die Splashscreen-Gui, kann ich nun den Button1 des Splashscreens abfangen:

    soweit so gut. So kann ich den Button des Splashscreens abfangen. Die Func Splashstop() ist die vorhandene Funktion um den Splashscreen zu beenden, wenn die Func _Fetch_UBL_BySheet($aSheets[$i])
    fertig ist und steht hier nur zum Testen. Jetzt muss ich nur noch heraus finden, wie ich beim Auslösen des Splash-Buttons den Excelprozess in der Func _Fetch_UBL_BySheet($aSheets[$i]) beenden kann, sowie die Func selbst und die Haupt-GUI wieder aktivere...
    Hätte da jemand evtl. eine Idee?

  • In dem folgenden Code, wird die _mainLoop durch "AdlibRegister" auch während des Prozesses (mit sleep,...) aufgerufen. Du musst nur vorsichtig sein, dass du in _mainLoop keine länger dauernden Funktionen aufrufst, wenn es von AdlibRegister aufgerufen wurde. Das würde dann alles blockieren. Stattdessen wird dort nur kurz $bStopProgress auf True gesetzt und das Splashfenster gelöscht, bevor es weitergeht.

    Der Prozess wird durch das If $bStopProgress Then ExitLoop unterbrochen. Dadurch wird sichergestellt, dass eine Aufgabe immer erfolgreich durchläuft und nur zwischen der Aufgabe und der nächsten unterbrochen wird. Bis zum wirklichen unterbrechen dauert es also maximal solange, wie eine einzelne Aufgabe (Ein For-Schleifendurchgang) benötigt. Wenn dir das zu lange dauert, müsstest du die Aufgabe wieder in Abschnitte unterteilen, zwischen denen (mit $bStopProgress) unterbrochen werden kann.

    Ich hoffe, das Beispiel hilft dir weiter:

  • Ganz abgesehen von Kanashius ansatz, und nur wegen meiner Anmerkung musst du natürlich die Variable $Button1 (+alle anderen angesteuerten GUI Elemente der anderen GUI) Global haben, nicht lokal. Sprich Global leer definieren und in der Funktion dann füllen oder von der Funktion füllen lassen.

    Denn klar kann guigetmsg nicht drauf reagieren wenn es diese Variable nicht kennt/gefüllt ist.

  • Hallole Zusammen,

    zunächst einmal danke für die Beiträge :klatschen:

    Ich glaube das Prob ist doch größer. Wenn ich in der Hauptfunktion die Splashscreen-Funktion aufrufe blockiert diese mir die Hauptfunktion und da die Hauptfunktion aber mind. 32 Rechnernamen in eine Website einträgt und dann einen String ermittelt, den ich dann wieder in das Excel-File eintrage dauert der Vorgang mit ziemlicher Sicherheit zu lang für Adlibregister (Kanashuis ' Ansatz).


    Also wenn jemand eine Idee hätte wie ich den Splashscreen realisiert bekomme ohne die Hauptfunktion zu blockieren und mit einem Abbruch-Button, dann bitte her damit ;):)

  • dauert der Vorgang mit ziemlicher Sicherheit zu lang für Adlibregister

    AdlibRegister arbeitet mit interrupts, es würde also das, was gerade in dem Programm läuft unterbrechen um AdlibRegister auszuführen und dann mit dem Programm weiterzumachen.

    Alles was in der von "AdlibRegister" aufgerufenen Funktion passiert, sollte nur nicht zu lang sein, da es das "Programm" pausiert und wenn die Funktion nicht beendet wird, würde es das "Programm" blockieren.
    Das Programm darf aber länger dauernde Aufgaben ausführen, da das für den AdlibRegister aufruf unterbrochen wird.

    AdlibRegister ist also genau das, was du willst. Es gibt dir die Möglichkeit das "Programm" kurz zu unterbrechen, zu schauen, ob ein Button o.ä. geklickt wurde und führt dann weiter das "Programm" aus.
    In dieser Unterbrechung kann dann zum Beispiel eine Variable wie "$bStopProgress" geändert werden, wie ich es in meinem Beispiel gemacht habe, und das "Programm" kann darauf reagieren, indem es z.B. die aktuelle For-Schleife verlässt.

  • Hallo Kanashius,

    vielen lieben Dank für deine Erklärung. Offenbar hatte ich das falsch verstanden. Dann mache ich mich mal an die Umsetzung
    könnte aber dauern , weil ich in ca. einer Stunde in den Urlaub aufbreche... :party::part::saint:

  • Hallole,

    das ging jetzt tatsächlich schneller als gedacht. ich habe das mit Adlibregister umgesetzt,. Was soll ich Sagen:

    ES LÄUFT SUPER!!!:party:

    Einen fetten Applaus für Kanashius :klatschen::klatschen::klatschen::klatschen:

    Vorgang erledigt...