## NotStr() : Switch between multiple states

Post your working scripts, libraries and tools
SKAN
Posts: 739
Joined: 29 Sep 2013, 16:58

### NotStr() : Switch between multiple states

NotStr(Value, Delimited list of unique values, Delimiter)
NotStr() is a wrapper for SubStr()

• neogna2 wrote:
The NotStr function cycles to the next value in a set of values, wrapping around the end.
First parameter is a value in the set.
Second parameter is the set, a string of delimited values.
Third parameter (optional) is for changing the default delimiter "|".
Examples:
NotStr("B", "A|B|C") returns "C".
NotStr("C", "A|B|C") returns "A" (wrap around)

Edit: Worth pointing out also that the values in the set must be unique, otherwise the function does not cycle in the way one might expect.

The function:

Code: Select all

``````NotStr(S:="", Z:="", D:="|") {               ; NotStr v0.6b By SKAN on D34M/D34R @ tiny.cc/notstr
Local Q, LS:=StrLen(S), LZ:=StrLen(Z), LD:=StrLen(D), P1, P2, Q
Return SubStr(LZ?Z:1,(P1:=LS+LZ=0||S=Z?1:InStr(Z,(S)(D),0,0-LZ+LS+LD)?LS+LD+1:InStr(Z,(D)(S),0,LZ
-LS)?1:(Q:=InStr(Z,(D)(S)(D)))?Q+LD+LS+LD:1),(LS+LZ=0?2:S=Z?1:(Q:=InStr(Z,D,0,P1))?Q:LZ+1)-P1)
}
``````

Spoiler

Functionality explained with examples:

In computing, toggle means switching between two states 0/1 True/False or On/Off
Here follows an infinite loop

Code: Select all

``````N := 0
Loop
MsgBox % N := not N
``````
NotStr() helps to switch between multiple values
Here follows an infinite loop:

Code: Select all

``````N := 0
Loop
MsgbOX % N := NotStr(N, "1|2|3|0")
``````
Spoiler

Here follows a GUI based demo: Use Alt+Arrows keys to adjust size of edit control.

Code: Select all

``````#NoEnv
#Warn
#SingleInstance, Force

Gui, -DPIScale
s := 11,  DPI := A_ScreenDPI
Gui, Font, % "s" . s-( DPI<=96 ? 0 : DPI<=120 ? 1 : DPI<=144 ? 2 : 3), Calibri
Gui, Margin, 25, 15

Gui, Add, Text,   xm ym  w175 h30 0x200, SetBatchLines
Gui, Add, Text,   xm     wp   h30 0x200, DetectHiddenWindows
Gui, Add, Text,   xm     wp   h30 0x200, Process priority

Gui, Add, Button, x+10  ym w75  h30   gSubRoutine, % T1 := ""
Gui, Add, Button, wp hp               gSubRoutine, % T2 := "Off"
Gui, Add, Button, wp hp    w140       gSubRoutine, % T3 := "Normal"

Gui, Add, Text,   xm                , Use Alt+Arrow key to adjust the size of edit control
Gui, Add, Edit,   xm       w325 h120, Hello world!
Gui, Show,, NotStr() Demo
T4 := "", T5 := ""
Return

SubRoutine:
GuiControlGet, Button, Focus

Switch (Button)
{
case "Button1" :
{
GuiControl,,Button1, % T1 := NotStr(T1, "-1")
SetBatchLines, %T1%
}
case "Button2" :
{
GuiControl,,Button2, % T2 := NotStr(T2, "On|Off")
DetectHiddenWindows, %T2%
}
case "Button3" :
{
GuiControl,,Button3, % T3 := NotStr(T3, "Low BelowNormal Normal AboveNormal High", " ")
Process,Priority,, %T3%
}
}
Return

EditWidth:
Switch (A_ThisHotkey)
{
Case "!Right" : GuiControl,Move,Edit1, % T4 := NotStr(T4, "w425 w525 w625 w700 w900 w325", " ")
Case "!Left"  : GuiControl,Move,Edit1, % T4 := NotStr(T4, "w900 w700 w625 w525 w425 w325", " ")
Case "!Up"    : GuiControl,Move,Edit1, % T5 := NotStr(T5, "h180 h240 h320 h480 h120", " ")
case "!Down"  : GuiControl,Move,Edit1, % T5 := NotStr(T5, "h480 h320 h240 h180 h120", " ")
}
Gui, Show, Center AutoSize
Return

#IfWinActive NotStr() Demo ahk_class AutoHotkeyGUI
!Right:: GoSub, EditWidth
!Left::  GoSub, EditWidth
!Up::    GoSub, EditWidth
!Down::  GoSub, EditWidth
#IfWinActive
``````
burque505
Posts: 1356
Joined: 22 Jan 2017, 19:37

### Re: NotStr() : Swtich betwen multiple states

Thanks, @SKAN. I encourage everybody to try the examples, especially the GUI demo. This function should really come in handy.
Regards,
burque505
Delta Pythagorean
Posts: 567
Joined: 13 Feb 2017, 13:44
GitHub: DelPyth
Location: Somewhere in the US

### Re: NotStr() : Swtich betwen multiple states

I didn't think this was possible, but this error occured:

Code: Select all

``````==> Too many parameters passed to function.
Specifically: Max(InStr(Z,(S)(D),0,0-LZ+LS+LD)?LS+LD+LD:0,InStr(Z,(D)(S),,LZ-LS) ?1:0,(Q:=InStr(Z,(D)(S)(D)))?Q+LD+LS+LD:0),1),((Q:=InStr(Z,D,,P1))?Q:LZ+1)-P1)
``````
I don't know if you're running a different version of AHK but this function doesn't seem to work.

- [AHK].......: 1.1.33.02 Unicode 64-bit
- [OS].........: Windows 10.0.18362
- [GITHUB]...: github.com/DeltaPyth
- [PAYPAL]....: paypal.me/DelPyth
- [DISCORD]..: Delta#3324

Remember to use [code]CODE[/code] for your multi-line scripts.
Stay safe, stay inside, and remember to wash your hands for 20 seconds!
SKAN
Posts: 739
Joined: 29 Sep 2013, 16:58

### Re: NotStr() : Swtich betwen multiple states

Delta Pythagorean wrote:
21 Apr 2020, 18:16
I don't know if you're running a different version of AHK but this function doesn't seem to work.
I'm unable to reproduce your error.
boiler
Posts: 5909
Joined: 21 Dec 2014, 02:44

### Re: NotStr() : Swtich betwen multiple states

He selectively pulled out a part of that line of code that doesn’t make sense as a stand-alone line because part of it belongs to the other Max() call and and the SubStr() call, which he left out of it.
Delta Pythagorean
Posts: 567
Joined: 13 Feb 2017, 13:44
GitHub: DelPyth
Location: Somewhere in the US

### Re: NotStr() : Swtich betwen multiple states

I used the full function and tested it in full and I could not get it to work. I did not edit the function itself.
Also, the error that I provided was copied from the debugger I'm using that displays the errors to a console.

- [AHK].......: 1.1.33.02 Unicode 64-bit
- [OS].........: Windows 10.0.18362
- [GITHUB]...: github.com/DeltaPyth
- [PAYPAL]....: paypal.me/DelPyth
- [DISCORD]..: Delta#3324

Remember to use [code]CODE[/code] for your multi-line scripts.
Stay safe, stay inside, and remember to wash your hands for 20 seconds!
SKAN
Posts: 739
Joined: 29 Sep 2013, 16:58

### Re: NotStr() : Swtich betwen multiple states

@Delta Pythagorean Strange!

Before posting, I always test my functions in Ansi, Unicode 32/64 in Windows 7/10.
It would be helpful if somebody else can test and confirm if there is an error.
boiler
Posts: 5909
Joined: 21 Dec 2014, 02:44

### Re: NotStr() : Swtich betwen multiple states

No error here. Win10, 64-bit machine with Unicode 32-bit AHK, v1.1.32.00.
SKAN
Posts: 739
Joined: 29 Sep 2013, 16:58

### Re: NotStr() : Swtich betwen multiple states

boiler wrote:
21 Apr 2020, 21:33
No error here. Win10, 64-bit machine with Unicode 32-bit AHK, v1.1.32.00.
Thank you.. much appreciated!
Delta Pythagorean
Posts: 567
Joined: 13 Feb 2017, 13:44
GitHub: DelPyth
Location: Somewhere in the US

### Re: NotStr() : Switch between multiple states

My apologies, I had a library that was included that replaced the Max function.
I'll have to look deeper into where that specific function is placed but the function does work for me.

TL;DR:
My fault, had a function somewhere that replaced a function.

- [AHK].......: 1.1.33.02 Unicode 64-bit
- [OS].........: Windows 10.0.18362
- [GITHUB]...: github.com/DeltaPyth
- [PAYPAL]....: paypal.me/DelPyth
- [DISCORD]..: Delta#3324

Remember to use [code]CODE[/code] for your multi-line scripts.
Stay safe, stay inside, and remember to wash your hands for 20 seconds!
SKAN
Posts: 739
Joined: 29 Sep 2013, 16:58

### Re: NotStr() : Switch between multiple states

Delta Pythagorean wrote: My apologies, I had a library that was included that replaced the Max function.
I'll have to look deeper into where that specific function is placed but the function does work for me.
Thanks for the clarification. Okay, I've removed Max() from NotStr()
You may try it now.

SKAN
Posts: 739
Joined: 29 Sep 2013, 16:58

### Re: NotStr() : Swtich betwen multiple states

burque505 wrote: Thanks, @SKAN.
neogna2
Posts: 73
Joined: 15 Sep 2016, 15:44

### Re: NotStr() : Switch between multiple states

Nice function SKAN!

I didn't understand what it did on first read through, until I got to the examples. Perhaps this sentence could be updated?
SKAN wrote:
21 Apr 2020, 09:40
NotStr() will return next key if first parameter (key) is matches a value. If match fails, the first value is returned.
"is matches" looks like a typo and the mix of the phrases key/value tripped me up at first.

On second thought, maybe CycleStr() or just Cycle() would be a more self-explanatory name for the function?

In case some other people also think of the terms "cycle" and "wrap around" when they're looking for the kind of thing your function does here is more text that will make search engines guide them to this thread.

The NotStr function cycles to the next value in a set of values, wrapping around the end.
First parameter is a value in the set.
Second parameter is the set, a string of delimited values.
Third parameter (optional) is for changing the default delimiter "|".
Examples:
NotStr("B", "A|B|C") returns "C".
NotStr("C", "A|B|C") returns "A" (wrap around)

Edit: Worth pointing out also that the values in the set must be unique, otherwise the function does not cycle in the way one might expect. Examples

Code: Select all

``````Loop
MsgBox % item := NotStr(item, "A|A|B")  ; stuck on A``````
or

Code: Select all

``````Loop
MsgBox % item := NotStr(item, "A|B|CC|CC")  ; skips second CC``````
kczx3
Posts: 1140
Joined: 06 Oct 2015, 21:39

### Re: NotStr() : Switch between multiple states

Spoiler
Thank you for this. I too didn’t understand SKANs description.
boiler
Posts: 5909
Joined: 21 Dec 2014, 02:44

### Re: NotStr() : Switch between multiple states

I also think neogna2’s suggestions really make clear what the value of this function is, including the name of the function and especially the clear description and examples.
SKAN
Posts: 739
Joined: 29 Sep 2013, 16:58

### Re: NotStr() : Switch between multiple states

@neogna2

Many thanks for the fantastic feedback.
I didn't understand what it did on first read through, until I got to the examples. Perhaps this sentence could be updated?
I thought the GUI demo will explain it all.
I will update it totally with your quote.

• NotStr(Value, Delimited unique values, Delimiter)
The NotStr function cycles to the next value in a set of values, wrapping around the end.
First parameter is a value in the set.
Second parameter is the set, a string of delimited values.
Third parameter (optional) is for changing the default delimiter "|".
Examples:
NotStr("B", "A|B|C") returns "C".
NotStr("C", "A|B|C") returns "A" (wrap around)
On second thought, maybe CycleStr() or just Cycle() would be a more self-explanatory name for the function?

In case some other people also think of the terms "cycle" and "wrap around" when they're looking for the kind of thing your function does here is more text that will make search engines guide them to this thread.
Actually I wanted to name the function Not() but since its a wrapper for SubStr() I had to Include the "Str" part.
Worth pointing out also that the values in the set must be unique.
Yes. I should have mentioned it. Values (Switch states) need to be unique.

Thanks again
arcticir
Posts: 647
Joined: 17 Nov 2013, 11:32

### Re: NotStr() : Switch between multiple states

Here is a similar scheme.

Code: Select all

``````MsgBox str_skip("a","a/b/c")

str_skip(t,s,k:="/") => (RegExMatch(k s k, "(" k "([^" k "]+))?.*" k t k "(([^" k "]+)" k ")?", t),t.value(4) or t.value(2))``````
SKAN
Posts: 739
Joined: 29 Sep 2013, 16:58

### Re: NotStr() : Switch between multiple states

boiler wrote:I also think neogna2’s suggestions really make clear what the value of this function is,
Yes .I have re-quoted him in OP.
boiler wrote:including the name of the function
The function is modeled after Not operator and is a Str manipulation function and hence the name NotStr()
My first two examples show this.
boiler wrote:and especially the clear description and examples.

Yes. My description was bad . The cover of the book is also important.
But my My GUI based demo is a good example.. if only people reach that far!
SKAN
Posts: 739
Joined: 29 Sep 2013, 16:58

### Re: NotStr() : Switch between multiple states

arcticir wrote:
23 Apr 2020, 08:19
Here is a similar scheme.

Code: Select all

``````MsgBox str_skip("a","a/b/c")

str_skip(t,s,k:="/") => (RegExMatch(k s k, "(" k "([^" k "]+))?.*" k t k "(([^" k "]+)" k ")?", t),t.value(4) or t.value(2))``````
Very nice!. I don't have tools to benchmark V2 scripts, so unable to compare it with mine.
Would be nice if the function could return the first value when t is blank.
SpeedMaster
Posts: 389
Joined: 12 Nov 2016, 16:09

### Re: NotStr() : Switch between multiple states

Thanks for this usefull function

Is it also possible to add an option for the direction ?

NotStr(S:="", Z:="", D:="|", dir:="1")

dir = 1 ; cycle forward
dir = -1 ; cycle backward
dir = 0 ; reset/restore starting pos

SKAN wrote:
23 Apr 2020, 08:19
Yes. My description was bad . The cover of the book is also important.
I think a function without it's description is almost a dead function.
I recomand to put the help and usage right above the function.
good example : ST library https://www.autohotkey.com/boards/viewtopic.php?f=6&t=53
ST library is missing some of your functions so I added them into my personal ST library. ( I hope you don't mind. )

Cheers