Jump to content

IF <> Multiple values??


Go to solution Solved by Melba23,

Recommended Posts

  • Moderators
  • Solution

tes5884,

Use Switch:

$x = 6

Switch $x
    Case 1, 2, 3
        ConsoleWrite("Fail" & @CRLF)
    Case Else
        ConsoleWrite("Success" & @CRLF)
EndSwitch
All clear? :)

M23

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind

Open spoiler to see my UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Link to post
Share on other sites

You can do it using If like

IF $x <> "1" OR $x <> "2" OR $x <> "3" Then     ConsoleWrite("Success")

On single line If you don't need EndIf

Also see _Iif()

you can nest them inside each other.

But for a lot of disparate values switch,as suggested, is better.

Edit: of course in the If example, using And makes more sense.. as in $x does not equal any of the values listed, rather than using Or.

Edited by MilesAhead
Link to post
Share on other sites
  • 5 years later...
1 minute ago, JLogan3o13 said:

@LoWang did you try it?

I tried and failed obviously. Why would I ask if it worked? ;-) There is a possibility I just use wrong syntax and there is a way to write it similar to this and that is why I ask

Edited by LoWang
Link to post
Share on other sites
  • Moderators

 

1 minute ago, LoWang said:

Why would I ask if it worked? ;-)

That is a good question; most wouldn't ask if they'd already answered their own question. The best practice way of doing this (as was pointed out just about exactly 5 years ago) is to use a Switch.

"Profanity is the last vestige of the feeble mind. For the man who cannot express himself forcibly through intellect must do so through shock and awe" - Spencer W. Kimball

How to get your question answered on this forum!

Link to post
Share on other sites

I just wanted to make the code more compact because using switch would generate many lines. Some other languages allow a coder to use similar syntax, so I wondered if AutoIt knows it too. But maybe I found a compact way like this:

#include <Array.au3>
local $possibleChars[]=["h","m","s"]
$k=_ArraySearch($possibleChars,$myChar)  ;$k is not needed but must be there
if @error then msgbox(16,"ERROR","invalid char")

BTW I know this thread is old but I don't see a reason to fragment topics because some things don't change :)

Link to post
Share on other sites

I remember many years ago where number of lines in a program was important because each line was occupying memory space and memory space costed M$.  Today only thing left is efficiency.  How fast can you do a task. So instead of asking what is the least number of lines you can do something, you should verify how fast is one compare to the other.

Link to post
Share on other sites
2 minutes ago, Nine said:

I remember many years ago where number of lines in a program was important because each line was occupying memory space and memory space costed M$.  Today only thing left is efficiency.  How fast can you do a task. So instead of asking what is the least number of lines you can do something, you should verify how fast is one compare to the other.

OK, but I believe readability of a code is also important. If a relatively simple function is so long that it does not fit on a screen then it's harder to understand it (load it into a brain memory) and work on it especially if I revive old code or somebody else starts working on it.
Anyway I think both my question and example are clear, so there is no need to challenge it's validity ;-)

Link to post
Share on other sites
  • Moderators

@LoWang you saved yourself 3 whole lines from doing it the way Melba suggested above, but in so doing you had to introduce an entire UDF. To each their own, but I doubt most people would count that as a big win :)

"Profanity is the last vestige of the feeble mind. For the man who cannot express himself forcibly through intellect must do so through shock and awe" - Spencer W. Kimball

How to get your question answered on this forum!

Link to post
Share on other sites
On 31/12/2018 at 12:10 AM, LoWang said:

Anyway I think both my question and example are clear,

Not really...

if($mylongvariablenameOrExpression in ("h","m","s")) then something

Does this mean :
if one of these chars  "h", "m", "s"  is present in $mylongvariablenameOrExpression  then something  ?

It's a quite different situation

 

Link to post
Share on other sites

.... with a little help from SQLite

#include <SQLite.au3>

; -- turn on the sql engine --------------------
Global Static $g__sSQliteDll = _SQLite_Startup()
; -- open a 'memory' DB --
Global Static $hDb = _SQLite_Open()
; ----------------------------------------------

If _IsInList(1, '2,3,4,5,6,7,8,9') Then
    MsgBox(0, '', 'there is')
Else
    MsgBox(0, '', 'there is not')
EndIf

Func _IsInList($Target, $List)
    Local $aMyResult, $iMyRows, $iMyColumns
    _SQLite_GetTable(-1, "SELECT " & $Target & " IN (" & $List & ");", $aMyResult, $iMyRows, $iMyColumns)
    Return 1 = $aMyResult[UBound($aMyResult) - 1]
EndFunc   ;==>_IsInList

_SQLite_Shutdown()

p.s. you have to save sqlite3.dll along with your script. take it from here if you do not have it yet -> https://www.sqlite.org/download.html (Precompiled Binaries for Windows session)

 

image.jpeg.9f1a974c98e9f77d824b358729b089b0.jpeg Chimp

small minds discuss people average minds discuss events great minds discuss ideas.... and use AutoIt....

Link to post
Share on other sites
  • Moderators

My question is the same; there are 1000 ways to skin the proverbial cat in AutoIt, we all know this. And everyone loves to demonstrate their own take on the different ways things can be done. But how is this approach better than the straightforward way presented by Melba several years ago, and how does it satisfy the user request of making the code more compact?

"Profanity is the last vestige of the feeble mind. For the man who cannot express himself forcibly through intellect must do so through shock and awe" - Spencer W. Kimball

How to get your question answered on this forum!

Link to post
Share on other sites

nothing against other ways of doing things and not necessarily a better way, I simply love try/see/run across new techniques and approaches. looking for and trying new ways of doing old things sometime can open new perspectives, new stimuli     ..... sometime not.

Edited by Chimp

 

image.jpeg.9f1a974c98e9f77d824b358729b089b0.jpeg Chimp

small minds discuss people average minds discuss events great minds discuss ideas.... and use AutoIt....

Link to post
Share on other sites
  • 5 months later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   1 member

  • Similar Content

    • By mmoalem
      Hi all - I have created a simple script that turn on cctv software (contacam)  when my phone does not ping back (when I'm out of range of home network)
      #include <MsgBoxConstants.au3> $iPing = 0 For $i = 5 To 1 Step -1 ; this 5 loops cycle is just for testing - please ignnore - when complete it will be an endless loop Example() Sleep(120000) Next Func Example() ; Ping the phone. $iPing = Ping("192.168.1.102") If $iPing Then ; If a value greater than 0 was returned then turn off camera. _endCCTV() Else _startCCTV() ; If a value of 0 was returned then turn on camera. EndIf EndFunc ;==>Example Func _startCCTV() ShellExecute("C:\contacam capture\FJ Camera\CAMERA.bat", "on") Sleep(10000) ShellExecute("C:\contacam capture\FJ Camera\CAMERA_REC_SENSITIVITY.bat", "50") EndFunc Func _endCCTV() ShellExecute("C:\contacam capture\FJ Camera\CAMERA_REC_SENSITIVITY.bat", "0") Sleep(10000) ShellExecute("C:\contacam capture\FJ Camera\CAMERA.bat", "off") EndFunc  
       
      the problem I have is that in this format the script run the bat file that turn on the camera (or off) everytime the ping runs but obviously once the ping returns 0 and the camera starts I only want to run the bat on ping NOT 0 (turn off camera) 
      any ideas/advice?
    • By Vikramjeet
      include-once #include <File.au3> #include <Excel.au3> #include <String.au3> #include <MsgBoxConstants.au3> Local $file = "TEST.log" FileOpen($file, 0) $TTLPax = 1 For $i = _FileCountLines($file) - $TTLPax to _FileCountLines($file) $line = FileReadLine($file, $i) Global $TktNo = StringMid($line, 8, 13) ; reads 13 characters from $Line starting from the 8th character msgbox(0,'',$TktNo) ; This is just for me to debug For $NoOfPax = 1 to 2 local $TTLSeg = 2 msgbox(0,'',$TTLSeg) msgbox(0,'',"7ABC"& $TktNo &"'N"& $NoOfPax &".1'C1,2'S1,2'B") ; This makes 7ABC1234567890123'N1.1'C1,2'S1,2'B ;But in the next loop I want the value to be 7ABC1234567890333'N2.1'C1,2'S1,2'B Next ExitLoop Next *TEST
      JAMES BAKER
        1.NYC-23JAN
        2.TJ 1234567890123
        3.TJ 1234567890333
      I am reading a file with last 5 lines as above. I want to be able to loop through and pick the values as follows
      1- Pick 1234567890123
      2- Use it to build a format with N1.1
      3- Pick 1234567890333
      2- Use it to build a format with N2.1
      Need help with the loop. Thank You
       
       
    • By Vikramjeet
      For $A1 = 12 To 11 + $Total For $B1 = 1 To ($oExcel.Application.Cells($A1,6).Value) ; This value is from the Excel file. It can be from 1 - 9. For $N1 = 7 To ??? ; This is based on the value of $B1 ((1 = 7, 2 = 17, 3 = 27, 4 = 37, 5 = 47) Send("-"& ($oExcel.Application.Cells($A1,$N1).Value) &"/"& ($oExcel.Application.Cells($A1,$N1+1).Value)) Sleep(400) Send("{ENTER}") Sleep(700) Next Next Next I am not able to figure how to loop $N1 as follows
      If the Value of $B1 = 1 then $N1 = 7
      If the Value of $B1 = 2 then $N1 = 17
      If the Value of $B1 = 3 then $N1 = 27
      If the Value of $B1 = 4 then $N1 = 37  
      The value of $N1 comes from $B1 where 1 = 7, 2 = 17, 3 = 27, 4 = 37, 5 = 47)
      Thank You
    • By roeselpi
      hello again,
      it has been a long time since i have been here and a long time since i last used autoit. ever so often when the time allows me to, then i follow up on an idea that i had a long time ago. i have done all the work on paper but now it is up to writing it in autoit and i keep stumbling over many little issues here and there. sometimes after a few days i will try again and get a step further but sometimes it just will not help no matter how long i try and think about a solution. for most of you it will be the basics but for me it is not all that easy, but at least i give it a try.
      right, down to business:
      here is my code:
      #include <MsgBoxConstants.au3> #include <StringConstants.au3> #include <Array.au3> #include <String.au3> ; ; PART 1: define replacements and check with msgbox ; Global $y, $z $y = "Yes" $z = "No" MsgBox(0,"replacements", $y & @CRLF & $z) ;the replacements in a message box ; ; PART 2: set the texts and check via console and msgbox ; Global $my1string = "abab" ;the first specified text MsgBox(0,"my1string", $my1string) ;the message box to output the first specified text Global $my2string = "icic" ;the second specified text MsgBox(0,"my2string", $my2string) ;the message box to output the second specified text ; ; PART 3: transform the strings to individual arrays ; $my1array = StringSplit($my1string, "") $my1array[0] = "" _ArrayDelete($my1array, 0) _ArrayDisplay($my1array, "my1array") ;the display of the first specified array $my2array = StringSplit($my2string, "") $my2array[0] = "" _ArrayDelete($my2array, 0) _ArrayDisplay($my2array, "my2array") ;the display of the first specified array ; ; PART 4: create an empty array for filling ; Global $OutputArray[4] $OutputArray[0] = "" _ArrayDisplay($OutputArray, "OutputArray") ;the display of the first specified array ; ; PART 5: compare & fill empty OutputArray with data after evaluation ; Global $i, $j, $k For $i = 0 to UBound($my1array) -1 For $j = 0 to UBound($my2array) -1 For $k = 0 to UBound($OutputArray) -1 If $my1array[$i] = "a" And $my2array[$j] = "i" Then $OutputArray[$k] = $y Else $OutputArray[$k] = $z EndIf Next Next Next _ArrayDisplay($OutputArray, "OutputArray") ;the display of the Newly filled Array In "Part 2" i make a string that is converted to an array in "Part 3" ... Now, I know that "a" and "i" are always in the exact same spot in both arrays and so i wanted to compare this and make a further array to document my findings by saying "yes" or "no" ... however my new array keeps saying just "no" allthough i can clearly see and know that it should say:
      yes no yes no my guess is that there is something wrong within my for-loops and that the counting is somehow "off" i guess that when the first for-loop is finished it reaches the second whilst the second for-loop is checking the first which would explain why it always says "no" instead of seeing the obvious.
      so my question would be: what is wrong with my for-loop? or where am i making an error that ultimately gives me the wrong results?
      help is much appreciated.
      kind regards
      roeselpi
       
       
      PS: sorry for my not so great english spelling ... stupid german sitting here trying out intermediate english skills.
    • By Zobu
      Hey Guys,
      I want to add a new checkbox with its own variable every time the add button is clicked.
      The added checkboxes should remain when I close the window or exit the script and when I reopen I should be able to add new checkboxes aswell.
      here is what I have so far..
      #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <StaticConstants.au3> #include <EditConstants.au3> #include <MsgBoxConstants.au3> #include <GuiButton.au3> $test = GUICreate("adding test", 475, 345, 500, 175) $Check1 = GUICtrlCreateCheckbox("Checkbox 1", 15, 25, 300, 25) $Button = GUICtrlCreateButton("Add", 365, 25, 90, 20) $Check2 = GUICtrlCreateCheckbox("Checkbox 2", 15, 50, 300, 25) $Check3 = GUICtrlCreateCheckbox("Checkbox 3", 15, 75, 300, 25) GUICtrlSetState($Check2, $GUI_HIDE) GUICtrlSetState($Check3, $GUI_HIDE) GUISetState(@SW_SHOW) While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ; Exit Case $Button GUICtrlSetPos($Check2, 15, 50, 300, 25) GUICtrlSetState($Check2, $GUI_SHOW) Case $Button GUICtrlSetPos($Check3, 15, 75, 300, 25) GUICtrlSetState($Check3, $GUI_SHOW) EndSwitch WEnd  
×
×
  • Create New...