2. Gui schließt nicht mit X

  • Hallo,


    Ich möchte gerne eine 2.te GUI, mit dem Quelltext von UEZ (Star Wars Scroller by UEZ 2011) nutzen. Das Thema "Probleme mit dem schließen der 2. GUI) war schon des öfteren im Forum, leider, was ich auch versucht habe, es geht bei mir nicht. Ich scheine da was falsch zu verstehen.

    Daher bitte nicht gleich mit Steinen werfen. ;(

    Wenn ich in meiner ersten Gui auf den Button "Info" klicke, erscheint die zweite GUI ordnungsgemäß und die Animation von UEZ startet bestens, die Funtion tut. Nur das schließen der GUI 2 funktioniert nicht.

    Ich nutze zum erstellen von Gui2 folgenden Code:

    AutoIt
    Const $FlatnessDefault = 0.25
    	Const $width = 1000
    	Const $height = 700
    
    
    $gui2 = GUICreate("Informationen", $width, $height, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_THICKFRAME))
    	GUISetBkColor(0xD7E4F2)
    	GUISetIcon("D:\!Autoit Software\ICON\logo_orange.ico", -1)
    	GUISetOnEvent($GUI_EVENT_CLOSE, __GUI_EVENT_CLOSE2__, $gui2)
    	GUISetState(@SW_HIDE);#Au3Stripper_Ignore_Funcs


    Für die Info-Funktion (öffnen von GUI 2 und abspulen der Animation) nutze ich diesen Code:


    Zum beenden von GUI2 versuchte ich diesen Code.


    Ferner habe ich Opt('GUIOnEventMode', 1) und Opt('MustDeclareVars', 1) aktiv.

    Und ich hatte in die Schleife (Code von UEZ) bereits $GUI_EVENT_CLOSE eingebaut, hat aber leider auch nicht funktioniert.

    Hatte das mit "switch" auch schon mit "select" versucht.

    Wäre Euch über den, zum Gui2 schließen bringenden Codeschnipsel sehr dankbar.

  • an den Schnipseln kann ich keine Ursache erkennen, habe den HotKeySet in Verdacht. Außerdem könntest du den Code nach Opt('GUICloseOnESC') durchsuchen und auf 1 setzen.
    Wenn du das ganze Skript postest bzw. per PN schickst, versuch ich mal den/die Bugs zu finden.

  • Vermute mal du bist in der Endlosschleife: While Sleep(30)
    Dadurch werden die OnEvents nicht ausgeführt.
    Das einzige, was meines Wissens nach, trotz Dauer-While ausgeführt wird ist mit GuiRegisterMsg(), sowie hooks,... alles, was ans System zurückgegeben wird. Deshalb muss sowas ja auch immer schnell durchlaufen. Wenn das warten würde wäre es sehr schlecht :)

  • an den Schnipseln kann ich keine Ursache erkennen, habe den HotKeySet in Verdacht. Außerdem könntest du den Code nach Opt('GUICloseOnESC') durchsuchen und auf 1 setzen.

    Hallo autoBert,

    HotKeySet habe ich nur zum schnellen Test-Beenden in die Funktion eingebaut. Code Opt('GUICloseOnESC') habe ich nicht im Quellcode enthalten.

    Wenn du das ganze Skript postest bzw. per PN schickst, versuch ich mal den/die Bugs zu finden.

    Vielen Dank für das Angebot, meinen Code nach Fehlern zu durchsuchen. Da würde ich sehr gerne noch etwas später drauf zurückkommen (den Arm quasi abreisen), wenn ich soweit fertig bin. Ein lauffähiges Programm heisst ja nicht zawngsläufig, dass es auch gut und funktional ist. Auch der Code soll entsprechend zu den Funktionen sinnvoll eingesetzt werden. Da ich vorhabe, das Script in verschiedenen Versionen (GUI, Animation, Progressbar) zusammenzustellen, würde ich gerne nach der Fertigstellung auf Dein gutgemeintes Angebot zurückkommen. [offtopic]Das dauert aber noch, da ich fulltime Berufstätig bin und Familie habe. Meine große Tochter schreibt gerade Abi und braucht gerade seelischen Beistand. DE und English hat gut geklappt. Heute war Bio dran und Mittwoch Mathe. Das schlimme, sie hat meine Gene in Faulenzia, Bio. Mathe hatten unsere Vorfahren und klarer Fall, auch ich selbst, leider nichts was vererbbar wäre. Und da benötigt sie Beistand. Ich zähle heute noch mit meinen Fingern. :S [/offtopic]Die Monate zähle ich noch mit Knöchel und Finger. Also überlege Dir gut, ob Du meinen Quellcode anschauen möchtest. :Face:

    Vermute mal du bist in der Endlosschleife: While Sleep(30)
    Dadurch werden die OnEvents nicht ausgeführt.

    Volltreffer! Mit GuiRegisterMsg() klappt es, die GUI2 zu schließen. :thumbup:

    Allerdings wird leider nicht die gewünschte Funktion ausgeführt (Gui2 ausblenden, Gui1 wieder einblenden), sondern die Gui2 und Gui1 (also das Programm) wird leider beendet.

    Ich poste sicherheitshalber noch die Schleife mit dem eingefügten GuiRegisterMsg()


    Event. nutze ich die falsche msgID von GUIRegisterMsg(). Davon gibt es gefühlte 100 Stk. || . Oder ich habe einen Verständnisfehler drin.

  • Müsste normal mit Fehlermeldung abschmieren (Also beenden), da du keine Parameter bei __GUI_EVENT_CLOSE2__() hast.
    Hilfe zu GUIRegisterMsg:

    Spoiler anzeigen


    Remarks
    !!! To make the user function workable you have to define it
    with maximum 4 function parameters otherwise the function won't
    be called !!!
    i.e:
    Func MyUserFunction($hWndGUI, $MsgID, $WParam,
    $LParam)
    ...
    EndFunc


    Immer die Remarks lesen, ist ziemlich wichtig. Am besten auch die Beispiele kurz ansehen.

    So funktioniert es:


    (Weg für mich zur Lösung:
    Google -> "register msg close gui", 3ter link
    Dort stand dann das Event ;))

  • Hallo Kanashius,

    das hilft mir sehr weiter.

    Müsste normal mit Fehlermeldung abschmieren (Also beenden), da du keine Parameter bei __GUI_EVENT_CLOSE2__() hast.

    ist auch abgeschmiert. Jetzt nicht mehr.

    Die Remarks und die Bespiele muss ich mir noch anschauen. Hoffentlich komme ich weiter. Herzlichen Dank für Deine kompetente Hilfe.

  • Weg zur Lösung: die Animation wieder in der Hauptschleife laufen lassen wie im Originalskript von @UEZ. Da es jetzt ja mehrere GUI's sind habe ich als 1. die Erstellung der 'StarwarScroller'-Gui in eine eigene Func ausgelagert. Dem Guiaufruf habe ich noch Variablen für Titel, ScrollText, TimeOut und Callback-Funktionsnamen spendiert. Herausgekommen ist folgendes Skript:

    Spoiler anzeigen


    Es wird kein HotkeySet oder eine mit GuiRegisterMsg registrierte Funktion benötigt. Das obige Beispiel zeigt 30 Sekunden einen IntroScreen, danach die (jetzt noch recht kümmerliche) MainGui. Mit dem einzigen Button kann die Intro (diesmal Infoscreen genannt) erneut angezeigt werden, diesmal ohne TimeOut d.h. muß vom Benutzer geschlossen werden. Nach schliessen der MainGui werden noch die Credits angezeigt, TimeOut ist auf 30 Sekunden eingestellt.

    Viel Spaß mit dem Konzept, daß du deine Gui wieder mit eigenem Leben füllen mußt ist hoffentlich verkraftbar.

    Edit: um Progress-Testroutine erweitert => Konzept klappt auch zusammen mit dieser UDF.

    mfg (auto)Bert

  • Hallo autoBert,

    ich werde Deine Zeilen bei mir in den Code einbauen und versuchen, das was Du in mühevoller Arbeit geschrieben hast entsprechend erfolgreich umzusetzen. Ganz herzlichen Dank dafür.

  • Hallo autoBert

    Viel Spaß mit dem Konzept, daß du deine Gui wieder mit eigenem Leben füllen mußt ist hoffentlich verkraftbar.


    Durch Deine Hilfe funktioniert nun alles wie es soll. Vielen Dank dafür. Ich denke dass Dein Beitrag vielen Suchenden klasse weiterhilft.

    Ich habe eine Verständnisfrage zu Global $g_hGUIInfo = -9999, $g_hGUI, $idProgress
    Was bewirkt -9999 und wie kommst Du auf diesen Wert?

    Opt("GUICloseOnESC", 1) ;ESCape schließt Gui 1=Ja 0=Nein kannte ich bislang nicht. Das kommt ebenfalls in meine Sammlung.

  • Die InfoGui habe ich mit einer großen negativen Zahl vorbelegt, bei Aufruf der Func _InfoGui prüfe ich nur ob kleiner 0, wenn ja wird die Gui erstellt, wenn nein Title und evtl. Lauftext der Aimation upgedated.

    Zu den verschiedenen OPT's, das schöne ist das man gleichzeitig den bisher benutzten Status zurückbekommt und so problemlos (für UDF's wichtig) nach eventellem Setzen wieder zum vorherigen Zustand zurückwechseln kann. Dies nutze ich in der Func _DefragFolder() wo ich kurzfristig den GuiOnEvent aus- und GuiCloseOnEscape einschalte. Vor verlassen der Funktion schalte ich wieder in die Zuständ die zuvor bestanden.

  • Ahhh. Jetzt kapiere ich das. Genial. Vielen Dank für die kompetenten Info's und schließlich nochmals herzlichen Dank für die ganzen Mühen und die einsatzvolle, klasse Hilfe.

    PS: Warum hast Du eine 7 auf der Autotüre kleben? Steht die für Deine Glückszahl oder weil man sie weder als Produkt noch als Quotient anderer Zahlen von eins bis zehn darstellen kann? Die 7 hat es ja schließlich in jeder hinsicht in sich.

    Spoiler anzeigen

    1=10:10
    2=10:5
    3=9:3
    4=2x2
    5=10:2
    6=2x3
    7=?
    8=2x4
    9=3x3
    10=2x5