Page 1 of 1

Bei Tastendruck, eine endlos-Schleife bei aktuellem Durchlauf überspringen.

Posted: 03 Dec 2019, 14:55
by KHA
Hallo,
gibt es eine Möglichkeit eine endlos Schleife beim Tastendruck, von aktuellen stand an zu überspringen?
Das was ich haben möchte, habe ich unten dargestellt, muss ich bei jeder Zeile eine If-Anweisung schreiben oder kann man das irgendwie eleganter lösen?

LG

Code: Select all

F1::

Ueberspringe := 0

Loop
{
SendInput, Ich
Sleep, 1500
if (Ueberspringe)
continue
SendInput, Bin
Sleep, 1500
if (Ueberspringe)
continue
SendInput, eine
Sleep, 1500
if (Ueberspringe)
continue
SendInput, Schleife
Sleep, 1500
if (Ueberspringe)
continue
SendInput, mit
Sleep, 1500
if (Ueberspringe)
continue
SendInput, viel
Sleep, 1500
if (Ueberspringe)
continue
SendInput,{Raw}, Sleeps
Sleep, 1500
if (Ueberspringe)
continue
SendInput, {Raw}, Sends
Sleep, 1500
if (Ueberspringe)
continue
SendInput, Und vieles Mehr
}
Return

q::
if (Ueberspringe = 0)
Ueberspringe := 1
Else
Ueberspringe := 0
Return

Re: Bei Tastendruck, eine endlos-Schleife bei aktuellem Durchlauf überspringen.

Posted: 04 Dec 2019, 01:40
by Kobaltauge
Es gibt ja die While-Schleife, die an eine Bedingung geknüpft ist. Und es gibt den Break Befehl, der jede Schleife unterbricht. Diesen kannst du nach einer IF Bedingung packen. Beide sind in der Dokumentation mit Beispielen gut beschrieben.
https://www.autohotkey.com/docs/commands/While.htm
https://www.autohotkey.com/docs/commands/Break.htm

Zu deinem Problem gibt es jedoch noch eine Frage.
Der Code durchläuft mehrere "Stufen" nacheinander. Wenn du diese Reihenfolge einhalten willst, dann ist dein Code i.O.. Natürlich gibt es zig elegantere Methoden, aber das sei mal dahingestellt (außer du willst eine elegantere Methode).
Wenn es aber immer eine Schleife ist, die durchlaufen werden soll. Wäre eine While oder Loop-Break Schleife besser und übersichtlicher.

Re: Bei Tastendruck, eine endlos-Schleife bei aktuellem Durchlauf überspringen.

Posted: 04 Dec 2019, 02:52
by gregster
Vielleicht sowas (bricht aktuellen Durchlauf ab und startet wieder bei "Ich"):

Code: Select all

F1::
Ueberspringe := 0
text := ["Ich", "bin", "eine", "Schleife", "mit", "viel", "Sleeps..."] 	
; text := StrSplit("Ich bin eine Schleife mit viel Sleeps...", A_Space)

Loop
	for idx, wort in text
	{ 
		Sendinput % wort A_Space
		sleep 1500
		If (Ueberspringe)
		{  
			Ueberspringe := 0
			continue 2		; springe zum Beginn der äußeren Schleife ("Loop")
		}			
	}
return

q::Ueberspringe := !Ueberspringe
Editiert

Mit einem assoz. Array könntest du natürlich leicht noch variable Sleeps verwenden: text := {"Ich" : 1500 , "bin" : 1000, ... } (-> For-Schleife anpassen.)

Re: Bei Tastendruck, eine endlos-Schleife bei aktuellem Durchlauf überspringen.

Posted: 04 Dec 2019, 16:42
by KHA
Dankeschön, @gregster

bei Assoziative Arrays werden die nach Values sortiert, kann ich das irgendwie verhindern?

Code: Select all

F1::

Ueberspringe := 0

text := {"Ich" : 1500 , "bin" : 1000, "Schleife" : 1000, "Usw" : 2000}


Loop
	for idx, wort in text
	{ 
		
		Sendinput, %idx%%A_Space%
		Sleep, %wort%
		
		If (Ueberspringe)
		{  
			Ueberspringe := 0
			continue 2		; springe zum Beginn der äußeren Schleife ("Loop")
		}			
	}
return

q::Ueberspringe := !Ueberspringe
Return
^q::
ExitApp
Also, es fängt immer mit "bin, ich, Schleife, Usw", weil "bin " ein Sleep von 1000 hat und damit niedrigste wert hat.

Re: Bei Tastendruck, eine endlos-Schleife bei aktuellem Durchlauf überspringen.  Topic is solved

Posted: 04 Dec 2019, 16:51
by gregster
Ja, die Reihenfolge müsste man getrennt speichern. Btw, es wird nach den Keys sortiert, nicht den Values: "bin" ist hier - alphabetisch gesehen - vorne.

Code: Select all

F1::
Ueberspringe := 0

text := ["Ich", "bin", "eine", "Schleife", "mit", "viel", "Sleeps..."] 	
sleeps := {"Ich" : 1500 , "bin" : 1000, "Schleife" : 1000, "eine" : 2000}

Loop
	for idx, wort in text
	{ 
		Sendinput % wort A_Space
		Sleep % sleeps[wort]
		If (Ueberspringe)
		{  
			Ueberspringe := 0
			continue 2		; springe zum Beginn der äußeren Schleife ("Loop")
		}			
	}
return

q::Ueberspringe := !Ueberspringe

^q::ExitApp
Oder als zusätzliche lineare Array: sleeps := [1500, 1000, 2000, 1000 ], sodass der Index/die Position allein entscheidend ist. Kommt drauf an, was man übersichtlichtlicher findet und wie viele (verschiedene) Keys man hat.
Auch das wäre u. a. denkbar: text := ["Ich", 1500, "bin", 1000, "eine", 2000, .... ] mit leichten Modifikationen im Quelltext. Oder diverse Schachtelungen.

Re: Bei Tastendruck, eine endlos-Schleife bei aktuellem Durchlauf überspringen.

Posted: 04 Dec 2019, 17:39
by KHA
nochmals vielen Dank!