izarra64 Posted July 8, 2022 Posted July 8, 2022 Hello Guys 😀 Today request as i get stuck on it. I wrote last years several AU3 using simple actions to display CheckBox or RadioBox in a unique GUI. Then validating all that were Checked to create a list of actions to run after. But all entries were static, and not dynamic as i want to setup today ! My firsts AU3 were made after getting and understanding form this marvelous AutoIt Forums where i found what i needed to become better and better on it ! So today, i'd like to do things better (perhaps using a better method than the one i capitalized on ?) My problem is quite simple to explain : i try with few words. i'd like to create a GUI to display on several columns, options that would be populated from Folders my today example is related to printers ! I need to show approx 100 printers (one checkbox per printer) + a Validation button And once clicked on Validation, i need to read all Checkboxes that were checked and create an answer file, adding one line per checked option ! then i will parse the answer file, and perform an install of each item / each line ! I know how to do so for some 10 or 15 entries (if static) what i need today is to be able to create and populate Checkbox, by reading Subfolders structure what i began to do is : Creating a Main Folder (@scriptdir\Rubriques\) and then up to 10 subfolders categorizing my items Rubriques\PrintPool1, Rubriques\PrintPool2, etc... up to \PrintPool10 in each PrintPoolx sub folder, i may have 4 to 15 Other Subfolder, containing Printer Name To start, i'm trying to do it with 2 subfolders only : will extend to more when ready ! So i have @ScriptDir\Rubriques\PrintPool1 and @ScriptDir\Rubriques\PrintPool2 PrintPool1 contains 3 Folders : PrintPool2 contains 2 Folders : in each final (child) subfolder, only have one TXT file (appstoinstall.txt - same one for all subfolders) containing the name of the script to be run afterwards ! so i just need to handle perfectly how to obtain the final list of all items needed (all that were checked !) i tried wring a code to: collect all items in Rubriques Main Folder : only to be displayed For Each Item(Subfolder) in MainFolder, collect all items from the Child Subfolder to be displayed and assigned to a checkbox This works fine to display ! but still not to collect checkbox choices ! (attached) Attached a Zip file (to unzip where you want) contains the Subfolders Structure zip file and Mymenu.au3 MyMenu.au3 will show and populate what needed : but i get stuck to verify which CheckBoxes were checked ! thanks for help ! EasyPrinters.zip
Subz Posted July 9, 2022 Posted July 9, 2022 The code wasn't runnable for me, a lot of issues with variables, after some modifications I saw the gist of the Gui, but it was quite confusing to understand, recommend you don't declare variables within functions. With regards to the checkboxes, I'd personally use an array, or use dummy controls to get the id, below is an example using both: expandcollapse popup#include <Array.au3> #include <File.au3> #include <GUIConstantsEx.au3> ;~ Root directory name Global $g_sRootDir = @ScriptDir & "\Rubriques" ;~ $g_aCheckboxes[x][0] = Checkbox Control Id ;~ $g_aCheckboxes[x][1] = Root Path ;~ $g_aCheckboxes[x][2] = Subfolder Global $g_aCheckboxes[0][3] ;~ Dummy Control Id Global $g_idCheckboxStart Example() Func Example() Local $iCheckbox = 0, $iLeft = 10, $iTop = 10 Local $hGUI = GUICreate("Example", 300, 200) _SetCheckBoxes() Local $iColdButton_Close = GUICtrlCreateButton("Close", 210, 170, 85, 25) GUISetState() While 1 $iMsg = GUIGetMsg() Switch $iMsg Case $GUI_EVENT_CLOSE, $iColdButton_Close ExitLoop Case $g_idCheckboxStart To $g_aCheckboxes[UBound($g_aCheckboxes)-1][0] If _IsChecked($iMsg) Then MsgBox(4096, "", "Selected : " & $g_aCheckboxes[$iMsg][2] & @CRLF & "Root Path : " & $g_aCheckboxes[$iMsg][1] & @CRLF & "Full Path : " & $g_aCheckboxes[$iMsg][1] & "\" & $g_aCheckboxes[$iMsg][2]) EndSwitch WEnd GUIDelete($hGUI) EndFunc Func _IsChecked($iColdControlID) Return BitAND(GUICtrlRead($iColdControlID), $GUI_CHECKED) = $GUI_CHECKED EndFunc ;==>_IsChecked Func _SetCheckBoxes() ;~ Create Checkbox Start id $g_idCheckboxStart = GUICtrlCreateDummy() ;~ Resize $g_aCheckboxes array ReDim $g_aCheckboxes[$g_idCheckboxStart + 1][3] ;~ Set $g_aCheckboxes[last row][0] to Checkbox Start id $g_aCheckboxes[UBound($g_aCheckboxes) - 1][0] = $g_idCheckboxStart $g_aCheckboxes[UBound($g_aCheckboxes) - 1][1] = "Checkbox Start Id" ;~ Set $iCheckbox to $g_aCheckboxes Row Count Local $iCheckbox = UBound($g_aCheckboxes) ;~ Checkbox Start Left Position $iLeft = 10 ;~ Checkbox Start Top Position $iTop = 10 ;~ Get Root Folder List Local $aRootDir = _FileListToArray($g_sRootDir, "*", 2) If @error Then Exit MsgBox(16, "Error", 'No folders found in "' & $g_sRootDir & '".') Local $aSubFolders, $sSubtitle = "" For $i = 1 To $aRootDir[0] ;~ Get SubFolder List $aSubFolders = _FileListToArray($g_sRootDir & "\" & $aRootDir[$i], "*", 2) If @error Then ContinueLoop ;~ Set Root Folder + Subfolder Count $sSubtitle = $aRootDir[$i] & " : " & $aSubFolders[0] ;~ Add Subtitle to Gui _ArrayAdd($g_aCheckboxes, GUICtrlCreateLabel($sSubtitle, $iLeft, $iTop, 100, 20) & "|" & $sSubtitle & "|") ;~ Set $iCheckbox to $g_aCheckboxes Row Count $iCheckbox = UBound($g_aCheckboxes) ;~ Resize $g_aCheckboxes array ($g_aCheckboxes Row Count + Subfolder Count) If $iCheckbox < $iCheckbox + $aSubFolders[0] Then ReDim $g_aCheckboxes[$iCheckbox + $aSubFolders[0]][3] ;~ Loop through SubFolders For $j = 1 To $aSubFolders[0] $iTop += 25 ;~ Set Checkbox Id for each SubFolder item $g_aCheckboxes[$iCheckbox][0] = GUICtrlCreateCheckbox($aSubFolders[$j], $iLeft, $iTop, 100, 20) ;~ Set Root Folder Path $g_aCheckboxes[$iCheckbox][1] = $g_sRootDir & "\" & $aRootDir[$i] ;~ Set SubFolder Name $g_aCheckboxes[$iCheckbox][2] = $aSubFolders[$j] $iCheckbox += 1 Next ;~ Set left position to 110 $iLeft += 110 ;~ Reset top position to 10 $iTop = 10 Next EndFunc
Solution Nine Posted July 9, 2022 Solution Posted July 9, 2022 (edited) Another way with no global variables. expandcollapse popup#include <File.au3> #include <GUIConstants.au3> Opt("MustDeclareVars", True) Example() Func Example() Local $hGUI = GUICreate("", @DesktopWidth, @DesktopHeight - 30, -1, -1, $WS_POPUP) Local $iXPos = 30, $iYPos GUICtrlCreateLabel("Easy Printers Installer", $iXPos, 50, 600,80) GUICtrlSetFont(-1, 25 ) Local $idBtn_Valid = GuiCtrlCreateButton("OK to Install", 800 + $iXPos, 50, 200, 50) GUICtrlSetFont(-1, 15 ) Local $idBtn_Cancel = GuiCtrlCreateButton("CANCEL", 1000 + $iXPos, 50, 200, 50) GUICtrlSetFont(-1, 15 ) Local $aMenu = _FileListToArray(@ScriptDir & "\Rubriques", "*", $FLTA_FOLDERS), $aTemp _ArrayColInsert($aMenu, 1) For $i = 1 To $aMenu[0][0] $aTemp = _FileListToArray(@ScriptDir & "\Rubriques" & "\" & $aMenu[$i][0], "*", $FLTA_FOLDERS) _ArrayColInsert($aTemp, 1) GUICtrlCreateLabel($aMenu[$i][0] & ":" & $aTemp[0][0], $iXPos, 110, 200, 30) GUICtrlSetFont(-1, 13) $iYPos = 140 For $j = 1 To $aTemp[0][0] $aTemp[$j][1] = GUICtrlCreateCheckbox($aTemp[$j][0], $iXPos, $iYPos, 100, 20) $iYPos += 25 Next $iXPos += 100 $aMenu[$i][1] = $aTemp Next GUISetState() While True Switch GUIGetMsg() Case $GUI_EVENT_CLOSE, $idBtn_Cancel ExitLoop Case $idBtn_Valid Validate($aMenu) EndSwitch WEnd EndFunc Func Validate(ByRef $aMenu) Local $sPath For $i = 1 To $aMenu[0][0] For $j = 1 To ($aMenu[$i][1])[0][0] If GUICtrlRead(($aMenu[$i][1])[$j][1]) = $GUI_CHECKED Then $sPath = @ScriptDir & "\Rubriques\" & $aMenu[$i][0] & "\" & ($aMenu[$i][1])[$j][0] ConsoleWrite($sPath & @CRLF) ; do the install here EndIf Next Next EndFunc Edited July 9, 2022 by Nine “They did not know it was impossible, so they did it” ― Mark Twain Spoiler Block all input without UAC Save/Retrieve Images to/from Text Monitor Management (VCP commands) Tool to search in text (au3) files Date Range Picker Virtual Desktop Manager Sudoku Game 2020 Overlapped Named Pipe IPC HotString 2.0 - Hot keys with string x64 Bitwise Operations Multi-keyboards HotKeySet Recursive Array Display Fast and simple WCD IPC Multiple Folders Selector Printer Manager GIF Animation (cached) Screen Scraping Multi-Threading Made Easy
izarra64 Posted July 9, 2022 Author Posted July 9, 2022 Many Thanks Subz for your reply yesterday ! i could try it and with some further dev, i could finalize my project !
izarra64 Posted July 9, 2022 Author Posted July 9, 2022 And Many thanks also to Nine for your solution! amazing how you could reduce my script with so few lines ! and working like a charm ! i'll adopt this one and engage to optimize installs, etc... many many thanks ! have a nice week end all
Nine Posted July 10, 2022 Posted July 10, 2022 Glad you like it ! “They did not know it was impossible, so they did it” ― Mark Twain Spoiler Block all input without UAC Save/Retrieve Images to/from Text Monitor Management (VCP commands) Tool to search in text (au3) files Date Range Picker Virtual Desktop Manager Sudoku Game 2020 Overlapped Named Pipe IPC HotString 2.0 - Hot keys with string x64 Bitwise Operations Multi-keyboards HotKeySet Recursive Array Display Fast and simple WCD IPC Multiple Folders Selector Printer Manager GIF Animation (cached) Screen Scraping Multi-Threading Made Easy
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