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

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

KHA
Posts: 167
Joined: 21 Aug 2018, 11:11

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

03 Dec 2019, 14:55

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
Kobaltauge
Posts: 193
Joined: 09 Mar 2019, 01:52
GitHub: MassimoCastell
Location: Germany
Contact:

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

04 Dec 2019, 01:40

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.
gregster
Posts: 3410
Joined: 30 Sep 2013, 06:48

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

04 Dec 2019, 02:52

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.)
KHA
Posts: 167
Joined: 21 Aug 2018, 11:11

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

04 Dec 2019, 16:42

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.
gregster
Posts: 3410
Joined: 30 Sep 2013, 06:48

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

04 Dec 2019, 16:51

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.

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 20 guests