Ich habe alle GUIs in Funktionen gepackt, weil es praktisch ist. Es gibt die Schwierigkeit, dass der Benutzer durch mehrere GUIs hintereinander geleitet wird. (z.B. Wenn der Benutzer eine neue Verbindung erstellt und auf einen leeren Ort zieht, wird ein neues Element erstellt. Es wird dann zuerst gefragt, welcher Verbindungstyp es sein soll, dann muss der Benutzer den Typ des neu zu erstellenden Elements auswählen, dann den Untertyp des Elements auswählen und dann die Parameter des Elements anpassen. Wenn der Benutzer bei einem der Fenster abbricht, muss die erstellte Verbindung und evlt. das erstellte Element wieder gelöscht werden.)
In der zurzeit veröffentlichten Version von AutoHotFlow wird die Funktion, welche ein GUI zeigt, aufgerufen und zeigt den GUI und geht sofort auf ein Return zu. Wenn der Benutzer das Fenster schließt (z.B. durch auf OK drücken), wird noch in der GUI-Funktion entschieden, was weiter ausgeführt wird (nächsten GUI öffnen, oder, bei Abbrechen, die gerade erstellten Elemente löschen). Das ist aber sehr schwer zu handhaben, denn je nach dem, was der Benutzer gemacht hat, muss die Abfolge der GUIs anders sein und im Falle des Abbrechens, müssen entweder gar keine oder verschiedene Elemente gelöscht werden.
Jetzt habe ich es dahingehend geändert, dass in der Routine, welche die Benutzereingaben verarbeitet, die Funktionen mit den GUIs öffnet und auf das Ergebnis wartet, um dann flexibel weiter entscheiden zu können. In der GUI Funktion muss aber eine Endlosschleife durchlaufen werden, welche ständig prüft, ob der Benutzer das Fenster geschlossen hat. Das ist wesentliche einfacher zu implementieren, aber hat den Nachteil, dass wenn durch die Benutzereingabe ein Thread unterbrochen wurde, dieser erst wieder läuft, wenn sich der Benutzer durch alle Fenster geklickt hat. Es gibt auch weitere Probleme dieser Art aufgrund von unterbrochenen Threads.
Lange Rede, kurzer Sinn. Ich möchte im folgenden Beispiel bis zum Kommentar ;Keep everything until here bleibt und sich das Programm im großen gleich verhält. Ich will aber nicht, dass die Arbeitsroutine dauerhaft unterbrochen werden kann, wenn die GUIs geöffnet werden. Ist das irgendwie möglich. Ich habe schon mit Thread Prioritäten experimentiert, bin aber auf nichts brauchbares gekommen.
Code: Select all
SetTimer, doaroutine,200
return
f12::
ret:=opengui1()
if ret=OK
{
MsgBox pressed OK
;make further actions
ret:=opengui2()
if ret=OK
{
MsgBox pressed OK
;make further actions
}
else if ret=cancel
{
MsgBox pressed cancel
;make other further actions
}
}
else if ret=cancel
{
MsgBox pressed cancel
;make other further actions
}
return
;Keep everything until here
openGUI1()
{
static resultGUI1
resultGUI1:=""
gui,1:add,button,g1ChosenOK w100,OK
gui,1:add,button,g1ChosenCancel w100 X+10 yp,Cancel
gui,1:show,, GUI 1
Loop
{
if resultGUI1
break
}
return resultGUI1
1chosenOK:
gui,1:destroy
resultGUI1:="OK"
return
1chosenCancel:
gui,1:destroy
resultGUI1:="Cancel"
return
1guiclose:
ExitApp
}
openGUI2()
{
static resultGUI2
resultGUI2:=""
gui,2:add,button,g2ChosenOK w100,OK
gui,2:add,button,g2ChosenCancel w100 X+10 yp,Cancel
gui,2:show,, GUI 2
Loop
{
if resultGUI2
break
}
return resultGUI2
2chosenOK:
gui,2:destroy
resultGUI2:="OK"
return
2chosenCancel:
gui,2:destroy
resultGUI2:="Cancel"
return
2guiclose:
ExitApp
}
doaroutine()
{
ToolTip Working
sleep 150
ToolTip Not Working
}