Hallo,
Ich wollte mal fragen, wie ich vom ersten Gui einen 2 starten und beenden kann ohne das der erste beendet wird
Hallo,
Ich wollte mal fragen, wie ich vom ersten Gui einen 2 starten und beenden kann ohne das der erste beendet wird
Hi!
Forumssuche liefert nichts?
Naja, weil heute Ostern ist... ;):
Beide GUIs am besten am Anfang anlegen und dann mit GUISetState anzeigen und wieder verstecken. Sollte es wirklich dynamisch sein müssen (unwahrscheinlich, da es ja auch GUICTRLSetData gibt), dann geht natürlich auch GUICreate und GUIDelete :).
peethebee
Tags für die Suche:
Zwei GUIs, mehrere Fenster, anzeigen, verstecken, beenden
Na das problem bei mir ist dieses script hier. Es scheint irgendwie nicht zu reagieren.
#include <GUIConstants.au3>
[/autoit] [autoit][/autoit] [autoit]Opt("TrayMenuMode",1)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]$tray_about = TrayCreateItem("Info")
TrayCreateItem("")
$tray_exit = TrayCreateItem("Beenden")
TraySetState()
$gui_1 = GUICreate("Burak",800,600)
GUISetIcon("Shell32.dll",23)
$filemenu = GUICtrlCreateMenu ("&Menü")
$fileitem = GUICtrlCreateMenuitem ("Öffnen...",$filemenu)
$helpmenu = GUICtrlCreateMenu ("?")
$infoitem = GUICtrlCreateMenuitem ("Info",$helpmenu)
GUISetState(@SW_SHOW)
[/autoit] [autoit][/autoit] [autoit]$tab=GUICtrlCreateTab (10,180, 580,370)
[/autoit] [autoit][/autoit] [autoit]$tab0=GUICtrlCreateTabitem ("Übersicht")
[/autoit] [autoit][/autoit] [autoit]While 1
$msg_2 = TrayGetMsg()
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
ExitLoop
Case $msg_2 = $tray_exit
$gui_2= GUICreate("Beenden",200,90)
GUICtrlCreateCheckbox("Dieses Dialog micht mehr anzeigen",10,20)
$button_abbrechen = GUICtrlCreateButton("Beenden",10,60,70,20)
GUICtrlCreateButton("Abbrechen",120,60,70,20)
GUISetState(@SW_SHOW)
If $button_abbrechen = 1 Then
GUIDelete($gui_2)
EndIf
EndSelect
Wend
Das hier wird niemals ausgeführt. Du fragst dort die Control-ID ab.
[autoit]
If $button_abbrechen = 1 Then
GUIDelete($gui_2)
EndIf
Du brauchst für Dein 2. GUI auch eine MessageLoop-Schleife, in der Du die beiden Buttons abfragst.
ZitatBeide GUIs am besten am Anfang anlegen und dann mit GUISetState anzeigen
Wie Pee schon richtig sagte, du erzeugst die GUI aber erst im Programm.
Besser so:
#include <GUIConstants.au3>
Opt("GUIOnEventMode", 1)
$gui1 = GUICreate('GUI 1')
GUISetOnEvent($GUI_EVENT_CLOSE, 'GUI1_close')
$btn = GUICtrlCreateButton('Zeige GUI 2', 10, 20, 100, 20)
GUICtrlSetOnEvent(-1, 'ClickButton')
$gui2 = GUICreate('GUI 2')
GUISetOnEvent($GUI_EVENT_CLOSE, 'GUI2_close')
GUISetState(@SW_SHOW, $gui1)
[/autoit] [autoit][/autoit] [autoit]While True
Sleep(100)
WEnd
Func GUI1_close()
Exit
EndFunc
Func GUI2_close()
GUISetState(@SW_HIDE, $gui2)
EndFunc
Func ClickButton()
GUISetState(@SW_SHOW, $gui2)
EndFunc
Kann man auch statt func es irgendwie als if & endif einbauen? :pinch:
Du kannst das natürlich auch mit GUIGetMsg verwenden und dann die Msg abfragen.
Das umzustellen sollte aber kein Problem darstellen. Probier mal, wenns nicht klappt, melde dich wieder.
Ich weiß nicht aber irgendwie reagiert die 2te GUI nicht :wacko:
Mit GUIGetMsg mußt du Advanced-Mode verwenden:
#include <GUIConstants.au3>
[/autoit] [autoit][/autoit] [autoit]$gui1 = GUICreate('GUI 1')
$btn = GUICtrlCreateButton('Zeige GUI 2', 10, 20, 100, 20)
$gui2 = GUICreate('GUI 2')
[/autoit] [autoit][/autoit] [autoit]GUISetState(@SW_SHOW, $gui1)
[/autoit] [autoit][/autoit] [autoit]While True
$msg = GUIGetMsg(1)
Switch $msg[1] ; Window Handle
Case $gui1
Switch $msg[0] ; Event
Case $GUI_EVENT_CLOSE
Exit
Case $btn
GUISetState(@SW_SHOW, $gui2)
EndSwitch
Case $gui2
Switch $msg[0] ; Event
Case $GUI_EVENT_CLOSE
GUISetState(@SW_HIDE, $gui2)
EndSwitch
EndSwitch
WEnd
Und wie geht das mit Select und EndSelect ?
Hilfe lesen Punkt. Da ist es lang und breit mit Beispielen erklärt.
Du kannst statt Switch auch Select verwenden.
Da du aber nur eine Variable auswertest ist Switch zu empfehlen, da schneller.
Bei Select wäre es in etwa so:
Select
Case $msg[1] = $gui1
Select
Case $msg[0] = $GUI_EVENT_CLOSE
Exit
; usw.
Danke
Alles anzeigenMit GUIGetMsg mußt du Advanced-Mode verwenden:
Spoiler anzeigen
[autoit]#include <GUIConstants.au3>
[/autoit] [autoit][/autoit] [autoit]$gui1 = GUICreate('GUI 1')
[/autoit] [autoit][/autoit] [autoit]
$btn = GUICtrlCreateButton('Zeige GUI 2', 10, 20, 100, 20)$gui2 = GUICreate('GUI 2')
[/autoit] [autoit][/autoit] [autoit]GUISetState(@SW_SHOW, $gui1)
[/autoit] [autoit][/autoit] [autoit]While True
[/autoit]
$msg = GUIGetMsg(1)
Switch $msg[1] ; Window Handle
Case $gui1
Switch $msg[0] ; Event
Case $GUI_EVENT_CLOSE
Exit
Case $btn
GUISetState(@SW_SHOW, $gui2)
EndSwitch
Case $gui2
Switch $msg[0] ; Event
Case $GUI_EVENT_CLOSE
GUISetState(@SW_HIDE, $gui2)
EndSwitch
EndSwitch
WEnd
So funktioniert der Gui aber nicht. Der läuft die ganze Zeit mit 50% prozessorauslastung und reagiert nicht.
Das kann aber nicht am Skript liegen. Prozessorlast max. 8% hierbei.
Will mich ja nicht aufdrängen, da das Thema schon so lange nicht beantwortet wurde, aber ich sitz grad an der gleichen Überlegung.
Hab noch eine Möglichkeit gefunden:
-Die beiden GUI's in zwei eigenständig lauffähigen .au3-Files aufbauen.
-Die 2. GUI an der gewünschten Stelle von der 1. GUI starten lassen
-Variablenübergabe zwischen den beiden GUI's wird über ein .ini-File realisiert.
Kann die Lösung funktionieren?
Naja, das kann schon funktionieren, nur wozu?
Es ist doch überhaupt kein Problem mehrere GUIs in einem Script zu verwalten. Einfach alle GUIs am Anfang erstellen und bei Bedarf mit z.B. GUISetState(@SW_SHOW, $hGui1) anzeigen lassen bzw. mit GUISetState(@SW_HIDE, $hGui1) wieder verstecken.
Mit dem erweiterten Modus von GUIGetMsg lassen sich die Events der GUI-Elemente auch eindeutig der jeweiligen GUI zuordnen (siehe obiges Beispiel von BugFix). Wenn Du willst, kannst Du auch den OnEvent-Mode benutzen (finde ich persönlich einfacher).
Also, wozu eine "2-GUI-2-Script"-Version basteln, die umständlich die Variablenwerte per Ini hin- und herüberträgt?
Kann mir hier jemand ein Beispiel für die Verwendung des "parent"-Parameters posten
Function GUICreate
"GUICreate ( "title" [, width [, height [, left [, top [, style [, exStyle [, parent]]]]]]] )
den hab ich noch nicht ganz verstanden.
Das "Child"-Fenster hat keinen Eintrag in der Taskleiste und es befindet sich vor dem "Parent"-Fenster:
#include<GUIConstantsEx.au3>
$hGui1 = GUICreate('Parent', 600, 300, -1, -1)
$hOpen = GUICtrlCreateButton('Open Child', 20, 20, 80, 25)
$hGui2 = GUICreate('Child', 300, 150, -1, -1, Default, Default, $hGui1)
GUISetState(@SW_SHOW, $hGui1)
While True
$msg = GUIGetMsg(1)
Switch $msg[1] ; Window Handle
Case $hGui1
Switch $msg[0] ; Event
Case $GUI_EVENT_CLOSE
Exit
Case $hOpen
GUISetState(@SW_SHOW, $hGui2)
EndSwitch
Case $hGui2
Switch $msg[0] ; Event
Case $GUI_EVENT_CLOSE
GUISetState(@SW_HIDE, $hGui2)
EndSwitch
EndSwitch
WEnd
Hey super, ganau das hab ich gesucht. Ich denke ihr könnt des thread jetzt auf "gelöst" umstellen
Danke nochmal