Jump to content
VollachR

Check certain values according to another value in the same array?

Recommended Posts

VollachR

Hi,

I'm looking for a way to take a number value from a Row2 of a 2D array and according to this check if files that appear in rows 3-11 in the array exists.

For example, if the number in Row2 is 5 I need to check for the files in Row 3-6 only, if it is 6 than rows 3-7 and so on.

I thought on using a FOR loop but I have very little experience with those.

Can you suggest the best way to do what I need?

BTW, the files in Rows 3-11 will usually have blank value for any row above the number in Row2 (e.g. Row2 = 5 so Rows3-6 will have values but 8-11 be empty), The values I need are in Column 1 of the array, the name of the key from the INI file that the array was created from is in Column 0.

Full Example:

Row2 of Array:

Col0 = Games# - Col1 = 5

Rows3-6

Col0 = Exe2 - Col1 = Path To File

Col0 = Exe3 - Col1 = Path To File

Col0 = Exe4 - Col1 = Path To File

Col0 = Exe5 - Col1 = Path To File

I need that if Row2 is 5 to check these above for rows if the file exists, if it was 6 then the next row as well and so on up until number 10 in Row2 as it can't go above 10.

So basically for whatever number in Row2 from 2-10 need to check 1-9 rows from 3-11 to see if the files in Col1 exists and if any of them don't exist it should call a function that shows an error message.

I'm pretty sure I have the first line of the for look correct:

For $i = 1 To $aAIO[2][1]

Just not sure how to continue from there, also not sure if $i should be equal 1 or 2.

Help will be appreciated.


Ron Vollach
Microsoft Certified Professional (MCP)
Creator of Ultimate Conversion Compressor (UCC)
UCC Wikia

Share this post


Link to post
Share on other sites
Subz

Is this for game automation?  Can't help if it is.

Share this post


Link to post
Share on other sites
VollachR
1 minute ago, Subz said:

Is this for game automation?  Can't help if it is.

No, it's a compression script that let you compress games to smaller size, it's a feature that verify the correct folder is selected by one or more executable checks


Ron Vollach
Microsoft Certified Professional (MCP)
Creator of Ultimate Conversion Compressor (UCC)
UCC Wikia

Share this post


Link to post
Share on other sites
VollachR

OK, played around with it, the following seems to work, can somebody let me know if this code appears to be correct?

For $i = 3 To $aAIO[2][1] + 1               
                If Not FileExists($SourceDir & "\" & $aAIO[$i][1]) Then
                    AIOExeError()
                EndIf
            Next

The file paths in the array are relative to the Source folder in the $SourceDir variable


Ron Vollach
Microsoft Certified Professional (MCP)
Creator of Ultimate Conversion Compressor (UCC)
UCC Wikia

Share this post


Link to post
Share on other sites
Subz
Posted (edited)

Does your array look like:

#include <Array.au3>
Global $sSourceDir = "C:\"
Global $aPaths[7][2] = [["Paths#", 5], ["Path1.exe", "Path1"], ["Path2.exe", "Path2"], ["Path3.exe", "Path3"], ["Path4.exe", "Path4"], ["Path5.exe", "Path5"], ["Path6.exe", "Path6"]]
;~ The following will loop from Row 2 to the Last item in the Array
For $i = 2 To UBound($aPaths) - 1
    ;~ Check $sSourceDir & Row x Column1
    ;~ nb: If you don't have a backslash on $sSourceDir you will need to add it.
    If FileExists($sSourceDir & $aPaths[$i][1]) = 0 Then AIOExeError()
Next
_ArrayDisplay($aPaths)

 

Edited by Subz

Share this post


Link to post
Share on other sites
VollachR
Posted (edited)
44 minutes ago, Subz said:

Does your array look like:

#include <Array.au3>
Global $sSourceDir = "C:\"
Global $aPaths[7][2] = [["Paths#", 5], ["Path1.exe", "Path1"], ["Path2.exe", "Path2"], ["Path3.exe", "Path3"], ["Path4.exe", "Path4"], ["Path5.exe", "Path5"], ["Path6.exe", "Path6"]]
;~ The following will loop from Row 2 to the Last item in the Array
For $i = 2 To UBound($aPaths) - 1
    ;~ Check $sSourceDir & Row x Column1
    ;~ nb: If you don't have a backslash on $sSourceDir you will need to add it.
    If FileExists($sSourceDir & $aPaths[$i][1]) = 0 Then AIOExeError()
Next
_ArrayDisplay($aPaths)

 

My array is created using IniReadSection So I guess so, something similar

Anyway, I think my little for loop I posted works but I'm having a problem stopping the loop before the last check if a file not exists and setting an error state.

There's a GUI with a START button that when clicked gets disabled and start these checks that if files exists continue to next part but I need a way to stop it without closing the GUI while re-enabling the Start button.

And I don't need to loop to last item in the array as some values may be empty in column 1, only till one row more than the number in Row2

 

Edited by VollachR

Ron Vollach
Microsoft Certified Professional (MCP)
Creator of Ultimate Conversion Compressor (UCC)
UCC Wikia

Share this post


Link to post
Share on other sites
Subz

You just use ExitLoop, I'm just trying to understand the logic when to exit the loop, I'm assuming something like:

#include <Array.au3>
Global $sSourceDir = "C:\"
Global $aAIO = IniReadSection(@ScriptDir & "\AIO.ini", "AIO")
    If @error Then Exit MsgBox(4096, "Error", "File not found.")
;~ The following will loop from Row 3 to the Last item in the Array
For $i = 3 To UBound($aAIO) - 1
    ;~ Check $sSourceDir & Column1
    ;~ nb: If you don't have a backslash on $sSourceDir you will need to add it.
;~  If FileExists($sSourceDir & $aAIO[$i][1]) = 0 Then AIOExeError()
    ;~ Check if Row x Column 0 equals EXE Row 2 Column 1 example EXE4 Then Exit Loop
    If $aAIO[$i][0] = "EXE" & $aAIO[2][1] Then ExitLoop MsgBox(4096, "Exit", "Exiting on Row: " & $i)
Next
_ArrayDisplay($aAIO)

 

Share this post


Link to post
Share on other sites
VollachR
Posted (edited)

OK, I think I solved it, this is the full function script:

 

Func CheckExe()
    If $aAIO[1][1] = 0 Then
        If Not FileExists($SourceDir & "\" & $aConversion[12][1]) Then
            $ErrorState = SetError(1)
            MsgBox($MB_ICONERROR, "Exe Not Found!", "The " & $aConversion[9][1] & " Executable Could Not Be Found In The Following Location:" & @CRLF & @CRLF & $SourceDir & "\" & $aConversion[12][1] & _
                    @CRLF & @CRLF & "Please Verify The Location is Correct, Once The Problem is Fixed You Can Try the Conversion Again.")
            If $ErrorState = 1 Then GUICtrlSetState($Start, $GUI_ENABLE)
        EndIf
    EndIf
    If $aAIO[1][1] = 1 Then
        If Not FileExists($SourceDir & "\" & $aConversion[12][1]) Then
            $ErrorState = SetError(1)
            AIOExeError()
            If $ErrorState = 1 Then GUICtrlSetState($Start, $GUI_ENABLE)
        Else
            For $i = 3 To $aAIO[2][1] + 1
                If Not FileExists($SourceDir & "\" & $aAIO[$i][1]) Then
                    $ErrorState = SetError(1)
                    AIOExeError()
                    If $ErrorState = 1 Then GUICtrlSetState($Start, $GUI_ENABLE)
                    ExitLoop
                EndIf
            Next
        EndIf
    EndIf
EndFunc   ;==>CheckExe

Func AIOExeError()
    MsgBox($MB_ICONERROR, "Exe(s) Not Found!", "One or More of The " & $aConversion[9][1] & " Executable Files Could Not Be Found In The Selected Source Folder" & @CRLF & @CRLF & _
            "Please Verify It is Correct, Once The Problem is Fixed You Can Try the Conversion Again.")
EndFunc   ;==>AIOExeError

If I did everything right it it should check column 1 of the array from row 3 to row number +1 than the value in Row 2 (so if row 2 value is 5 it will check up to row6) and if any of the files don't exist it should display the error, re-enable the start button and exit the loop, essentially stopping the script before the start button can call the next function without exiting it altogether.

Not sure if the SetError lines are really needed though.

Edited by VollachR

Ron Vollach
Microsoft Certified Professional (MCP)
Creator of Ultimate Conversion Compressor (UCC)
UCC Wikia

Share this post


Link to post
Share on other sites

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

  • Similar Content

    • nooneclose
      By nooneclose
      Good morning everyone, I thought I had already solved this issue but it turns out I did not. 
      My code finds unread emails with this specific subject line of "request" but when I change the subject to SKIPPED + "request" = ("SKIPPED request") the program still finds the email and tries to process it. I only want to process emails with the exact match subject of "request".
      Here is my code that "finds" the unread emails with the subject of "request" or so I thought. 
      Func ListUnreadEmails() ;******************************************************************************* ; Lists all unread E-mails from the folder Outlook-UDF-Test ;******************************************************************************* ; Stores all the unRead emails into an array Global $aItems = _OL_ItemFind($oOutlook, "*\Outlook-UDF-Test", $olMail, _ "[UnRead]=True", "Subject", "request", "EntryID,Subject", "", 1) ; Displays the array of unRead emails If IsArray($aItems) Then ;_ArrayDisplay($aItems, "OutlookEX UDF: _OL_ItemFind - Unread mails") Else MsgBox(48, "OutlookEX UDF: _OL_ItemFind Example Script", _ "Could not find an unread mail. @error = " & @error & ", @extended: " & @extended) EndIf ; Gets the number of unread emails Global $numberOfUnRead = UBound($aItems, $UBOUND_ROWS) - 1 ;MsgBox("", "Number of Unread emails", $numberOfUnRead) EndFunc It acts as if any part of the subject containing the word "request" and the email is unread that it will try to process it. (I think)
    • KhalidAnsari
      By KhalidAnsari
      Hi,
      I need to automate Java application using AutoIt, I have refer forum for the same, as per forum I am using Java Access Bridge to finding control name. But could not set value to control. Below is my sample code 
      Send("#r")
      sleep(1500)
      Send("D:\javaapplication\javaapplication\Hello.jar{Enter}")
      WinActivate("Penjumlahan")
      sleep(1500)
      ControlSetText("Penjumlahan", "", "Name:  A :", "demo")
      Java Application and Java Ferret screen

    • QaisBsharat
      By QaisBsharat
      Hello, 
      May i know how can i automation qt application?
      Using controlclick not mouse and positions
       
      Thanks
    • nooneclose
      By nooneclose
      Good afternoon, I am in need of some help. I am sure this is a stupid question requiring only one or two lines of code. However, I would greatly appreciate the help I cannot figure this out. I also tried searching for the answer on the internet but no one except me apparently seems to be having a hard time figuring this out and or is asking about it. 
      I simply want to change the "status" of an email from unread to read once I have processed it. My code is over 500 lines and I would like not to clutter this post with it. Assume I have all my includes and connections properly defined and stuff. 
      Here is the bit of code where I am trying to change the email that was used from unread to read:
      Func ChangeEmailStatus() ;******************************************************************************* ; changes the status of an email from unread to Read ;******************************************************************************* Local $iRows = UBound($aItems, $UBOUND_ROWS) MsgBox("", "Number of Unread emails (Before Change)", $iRows) _OL_ItemModify($oOutlook,$aItems[$i][0], Default, "Read=True") MsgBox("", "Array Display 1", $aItems[1][0]) MsgBox("", "Array Display 2", $aItems[2][0]) Local $iRows = UBound($aItems, $UBOUND_ROWS) MsgBox("", "Number of Unread emails (After Change)", $iRows) EndFunc  
    • SharpDressedMan
      By SharpDressedMan
      Hello,
      Is there any way to check for validity of a pointer to a DllStruct ?
      In the above code, a DllStruct is created from an invalid pointer. How to prevent from doing this ?
      local $tStruct = DllStructCreate("int i") DllStructSetData($tStruct, "i", 123) local $pStruct = DllStructGetPtr($tStruct) $tStruct = 0 ; destroy DllStruct ==> $pStruct becomes invalid ; how to check here for validity of $pStruct and prevent from doing the following ? $tStruct = DllStructCreate("int i", $pStruct) ; create DllStruct from invalid pointer... MsgBox(0, @ScriptName, @error) ; displays '0' : invalid pointer is not detected by DllStructCreate() MsgBox(0, @ScriptName, IsDllStruct($tStruct)) ; displays '1' : tStruct is assumed as a valid DllStruct object, which is not Thanks for help
×