VollachR Posted June 12, 2018 Posted June 12, 2018 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 VollachMicrosoft Certified Professional (MCP)Creator of Ultimate Conversion Compressor (UCC)UCC Wikia
VollachR Posted June 12, 2018 Author Posted June 12, 2018 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 VollachMicrosoft Certified Professional (MCP)Creator of Ultimate Conversion Compressor (UCC)UCC Wikia
VollachR Posted June 12, 2018 Author Posted June 12, 2018 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 VollachMicrosoft Certified Professional (MCP)Creator of Ultimate Conversion Compressor (UCC)UCC Wikia
Subz Posted June 12, 2018 Posted June 12, 2018 (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 June 12, 2018 by Subz
VollachR Posted June 12, 2018 Author Posted June 12, 2018 (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 June 12, 2018 by VollachR Ron VollachMicrosoft Certified Professional (MCP)Creator of Ultimate Conversion Compressor (UCC)UCC Wikia
Subz Posted June 12, 2018 Posted June 12, 2018 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)
VollachR Posted June 12, 2018 Author Posted June 12, 2018 (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 June 12, 2018 by VollachR Ron VollachMicrosoft Certified Professional (MCP)Creator of Ultimate Conversion Compressor (UCC)UCC Wikia
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now