31290 Posted April 7, 2015 Share Posted April 7, 2015 (edited) Hi everyone, Question is simple: I have 12 checkboxes and I'm looking for a way to grey out a checkbox as soon as it is ticked by the End User. Func ManualActions() Local $ManualActionsGui = GuiCreate("Automated Task List Suite", 460, 480, -1, -1) GUISetBkColor ($Color_White) GUICtrlCreatePic ($Images & "\SAClogo.jpg", 110, 10, 240, 80) GUICtrlCreateLabel ("---MANUAL ACTIONS---" , 173, 100, 300, -1) GUICtrlSetFont (-1, 8.5, 700, 0) GUICtrlCreateCheckbox("Put a label with hostname on the computer?", 5, 120, -1,-1) GUICtrlSetOnEvent(-1, "OKTicked") GUICtrlCreateCheckbox("Add all applications in AD?", 5, 140, -1,-1) GUICtrlCreateCheckbox("Check the installed drivers?", 5, 160, -1,-1) GUICtrlCreateCheckbox("Customize all desktop icons?", 5, 180, -1,-1) GUICtrlCreateCheckbox("Restore User's data?", 5, 200, -1,-1) GUICtrlCreateCheckbox("Connect to the VPN once?", 5, 220, -1,-1) GUICtrlCreateCheckbox("Update Firefox and Google Chrome ?", 5, 240, -1,-1) GUICtrlCreateCheckbox("Restore user's Bookmarks?", 5, 260, -1,-1) GUICtrlCreateCheckbox("Deploy CrashPlanPro, remove new licence and send a mail to the Service Desk?", 5, 280, -1,-1) GUICtrlCreateCheckbox("Check if printers the User needs are present?", 5, 300, -1,-1) GUICtrlCreateCheckbox("Copy SAPlogin.ini from former Computer (if needed)?", 5, 320, -1,-1) GUICtrlCreateCheckbox("Encrypt the Disk with PGP?", 5, 340, -1,-1) GUICtrlCreateCheckbox("Update Remedy database?", 5, 360, -1,-1) While 1 GUISetState () Local $ManualActionsMsg = GUIGetMsg () Switch $ManualActionsMsg Case $GUI_EVENT_CLOSE Exit EndSwitch WEnd EndFunc Func OKTicked() GUICtrlSetState ("-1", $GUI_DISABLE) EndFunc I've read about "GuiCtrlSetState" and GUICtrlSetOnEvent but I can't figure that. How Can I do that please? Thanks Edited April 7, 2015 by 31290 ~~~ Doom Shall Never Die, Only The Players ~~~ Link to comment Share on other sites More sharing options...
MikahS Posted April 7, 2015 Share Posted April 7, 2015 (edited) You'll have to store the ControlID in a variable and use that variable in GUICtrlSetState() like so: Local $myVar = GUICtrlCreateCheckbox("Example", 5, 360) GUICtrlSetState($myVar, $GUI_DISABLE) Edited April 7, 2015 by MikahS Snips & Scripts My Snips: graphCPUTemp ~ getENVvarsMy Scripts: Short-Order Encrypter - message and file encryption V1.6.1 ~ AuPad - Notepad written entirely in AutoIt V1.9.4 Feel free to use any of my code for your own use. Forum FAQ Link to comment Share on other sites More sharing options...
31290 Posted April 7, 2015 Author Share Posted April 7, 2015 (edited) Thanks MikahS, So it means that I have to create 12 more variables and also 12 GuiCtrlSetState? Hum, a loop or a for statement cannot do the trick? (I'm also not good for these statements) Thanks Edited April 8, 2015 by 31290 ~~~ Doom Shall Never Die, Only The Players ~~~ Link to comment Share on other sites More sharing options...
MikahS Posted April 7, 2015 Share Posted April 7, 2015 (edited) Yes, a for loop would be recommended like so: #include <GUIConstants.au3> Local $gui, $array[5] $gui = GUICreate("TEST", 200, 200) $array[0] = GUICtrlCreateCheckbox("test", 5, 10) $array[1] = GUICtrlCreateCheckbox("test", 5, 30) $array[2] = GUICtrlCreateCheckbox("test", 5, 50) $array[3] = GUICtrlCreateCheckbox("test", 5, 70) $array[4] = GUICtrlCreateCheckbox("test", 5, 90) GUISetState() While 1 $msg = GUIGetMsg() Switch $msg Case $GUI_EVENT_CLOSE Exit EndSwitch Sleep(100) checkTheBoxes() WEnd Func checkTheBoxes() Local $i For $i = 0 To Ubound($array) - 1 Step 1 If GUICtrlRead($array[$i]) = 1 Then GUICtrlSetState($array[$i], 128) EndIf Next EndFunc Edited April 7, 2015 by MikahS Snips & Scripts My Snips: graphCPUTemp ~ getENVvarsMy Scripts: Short-Order Encrypter - message and file encryption V1.6.1 ~ AuPad - Notepad written entirely in AutoIt V1.9.4 Feel free to use any of my code for your own use. Forum FAQ Link to comment Share on other sites More sharing options...
spudw2k Posted April 7, 2015 Share Posted April 7, 2015 (edited) Here are another couple of ideas to chew on. Depending on what your requirements really are (which I'll bet you'll want to firm up) the following will do what you asked for. Here I created a simple function ("OKTicked") that each checkbox will fire when clicked. It simply checks the state of the checkbox that fired the func and if it is checked it disables the checkbox control. Rather than adding a GUICtrlSetOnEvent after the creating of each checkbox I opted to use another func for the Checkbox Ctrl creation.) expandcollapse popupOpt("GUIOnEventMode", 1) Global Const $GUI_DISABLE = 128 Global Const $GUI_EVENT_CLOSE = -3 ManualActions() Func ManualActions() Local $ManualActionsGui = GuiCreate("Automated Task List Suite", 460, 480, -1, -1) GUISetBkColor (0xFFFFFF) ;GUICtrlCreatePic ($Images & "\SAClogo.jpg", 110, 10, 240, 80) GUICtrlCreateLabel ("---MANUAL ACTIONS---" , 173, 100, 300, -1) GUICtrlSetFont (-1, 8.5, 700, 0) _CreateCheckbox("Put a label with hostname on the computer?", 5, 120) _CreateCheckbox("Add all applications in AD?", 5, 140) _CreateCheckbox("Check the installed drivers?", 5, 160) _CreateCheckbox("Customize all desktop icons?", 5, 180) _CreateCheckbox("Restore User's data?", 5, 200) _CreateCheckbox("Connect to the VPN once?", 5, 220) _CreateCheckbox("Update Firefox and Google Chrome ?", 5, 240) _CreateCheckbox("Restore user's Bookmarks?", 5, 260) _CreateCheckbox("Deploy CrashPlanPro, remove new licence and send a mail to the Service Desk?", 5, 280) _CreateCheckbox("Check if printers the User needs are present?", 5, 300) _CreateCheckbox("Copy SAPlogin.ini from former Computer (if needed)?", 5, 320) _CreateCheckbox("Encrypt the Disk with PGP?", 5, 340) _CreateCheckbox("Update Remedy database?", 5, 360) GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit", $ManualActionsGUI) GUISetState () While 1 sleep(10) WEnd EndFunc Func OKTicked() If GUICtrlRead(@GUI_CtrlId) = 1 Then GUICtrlSetState(@GUI_CtrlId, $GUI_DISABLE) EndFunc Func _CreateCheckbox($sLabel, $iX, $iY) GUICtrlCreateCheckbox($sLabel, $iX, $iY, -1,-1) GUICtrlSetOnEvent(-1, "OKTicked") EndFunc Func _Exit() Exit EndFunc And in this example I used an Array to hold the "labels' for each checkbox and then create them in a loop. Opt("GUIOnEventMode", 1) Global Const $GUI_DISABLE = 128 Global Const $GUI_EVENT_CLOSE = -3 ManualActions() Func ManualActions() Local $ManualActionsGui = GuiCreate("Automated Task List Suite", 460, 480, -1, -1) GUISetBkColor (0xFFFFFF) ;GUICtrlCreatePic ($Images & "\SAClogo.jpg", 110, 10, 240, 80) GUICtrlCreateLabel ("---MANUAL ACTIONS---" , 173, 100, 300, -1) GUICtrlSetFont (-1, 8.5, 700, 0) Local $aCheckboxes[13] = ["Put a label with hostname on the computer?", "Add all applications in AD?", "Check the installed drivers?", "Customize all desktop icons?", _ "Restore User's data?", "Connect to the VPN once?", "Update Firefox and Google Chrome ?", "Restore user's Bookmarks?", "Deploy CrashPlanPro, remove new licence and send a mail to the Service Desk?", _ "Check if printers the User needs are present?", "Copy SAPlogin.ini from former Computer (if needed)?", "Encrypt the Disk with PGP?", "Update Remedy database?"] Local $iX = 5, $iY = 120 For $x = 0 to 12 ConsoleWrite($iY & @CRLF) _CreateCheckbox($aCheckboxes[$x], $iX, $iY) $iY += 20 Next GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit", $ManualActionsGUI) GUISetState () While 1 sleep(10) WEnd EndFunc Func OKTicked() If GUICtrlRead(@GUI_CtrlId) = 1 Then GUICtrlSetState(@GUI_CtrlId, $GUI_DISABLE) EndFunc Func _CreateCheckbox($sLabel, $iX, $iY) GUICtrlCreateCheckbox($sLabel, $iX, $iY, -1, -1) GUICtrlSetOnEvent(-1, "OKTicked") EndFunc Func _Exit() Exit EndFunc I'd imagine these are a bit too simple for what you really want to accomplish, but at least it hopefully gives you some ideas/insight. I would think you want some sort of hierarchy when it comes to clicking the checkboxes...like they must be performed in order. In that case, it would be easy to check if the previous checkbox is checked or not. You will want to use an array for that to hold the CtrlIds of the checkboxes like Mikah showed. There are many ways to skin a cat. edit: Grammar Edited April 7, 2015 by spudw2k reb 1 Spoiler Things I've Made: Always On Top Tool ◊ AU History ◊ Deck of Cards ◊ HideIt ◊ ICU ◊ Icon Freezer ◊ Ipod Ejector ◊ Junos Configuration Explorer ◊ Link Downloader ◊ MD5 Folder Enumerator ◊ PassGen ◊ Ping Tool ◊ Quick NIC ◊ Read OCR ◊ RemoteIT ◊ SchTasksGui ◊ SpyCam ◊ System Scan Report Tool ◊ System UpTime ◊ Transparency Machine ◊ VMWare ESX Builder Misc Code Snippets: ADODB Example ◊ CheckHover ◊ Detect SafeMode ◊ DynEnumArray ◊ GetNetStatData ◊ HashArray ◊ IsBetweenDates ◊ Local Admins ◊ Make Choice ◊ Recursive File List ◊ Remove Sizebox Style ◊ Retrieve PNPDeviceID ◊ Retrieve SysListView32 Contents ◊ Set IE Homepage ◊ Tickle Expired Password ◊ Transpose Array Projects: Drive Space Usage GUI ◊ LEDkIT ◊ Plasma_kIt ◊ Scan Engine Builder ◊ SpeeDBurner ◊ SubnetCalc Cool Stuff: AutoItObject UDF ◊ Extract Icon From Proc ◊ GuiCtrlFontRotate ◊ Hex Edit Funcs ◊ Run binary ◊ Service_UDF Link to comment Share on other sites More sharing options...
31290 Posted April 8, 2015 Author Share Posted April 8, 2015 (edited) MikahS, spudw2k, Huge thanks to both of you for pointing me out these solutions, much appreciated! The final goal of this GUI is that when the user did the checks and click on the Validate button, the corresponding checkbox will get the value "Done" or "Not Done", (depending if checked or not) and a logfile will be created summing up what has been done or not. To clarify --> On submit, if ticked, checkbox value = done if not, checkbox value = not done. (I'll also have to write this in a ini file to retrieve the values if needed but it's easy Any idea on how to append this? Many thanks again! I'd imagine these are a bit too simple for what you really want to accomplish, but at least it hopefully gives you some ideas/insight. I would think you want some sort of hierarchy when it comes to clicking the checkboxes...like they must be performed in order. In that case, it would be easy to check if the previous checkbox is checked or not. You will want to use an array for that to hold the CtrlIds of the checkboxes like Mikah showed. There are many ways to skin a cat. edit: Grammar Edit: In fact no, the End Users will not have to perform checkboxes in order. It's kind of a to buy list that can be ticket anytime among what you've found in the store. And this will be put in a log for us to see what have been done or not. Edited April 8, 2015 by 31290 ~~~ Doom Shall Never Die, Only The Players ~~~ Link to comment Share on other sites More sharing options...
MikahS Posted April 8, 2015 Share Posted April 8, 2015 (edited) You're welcome. Using the File* functions should work out here, or if you're using a .log file you can use _FileWriteLog You can make a button and make a case in the messageloop for the event. When you submit it check the values and write to the file. Quick example: #include <GUIConstants.au3> Local $gui, $array[5], $button, $i $gui = GUICreate("TEST", 200, 200) $array[0] = GUICtrlCreateCheckbox("test", 5, 10) $array[1] = GUICtrlCreateCheckbox("test", 5, 30) $array[2] = GUICtrlCreateCheckbox("test", 5, 50) $array[3] = GUICtrlCreateCheckbox("test", 5, 70) $array[4] = GUICtrlCreateCheckbox("test", 5, 90) $button = GUICtrlCreateButton("submit", 125, 90) GUISetState() While 1 $msg = GUIGetMsg() Switch $msg Case $GUI_EVENT_CLOSE Exit Case $button For $i = 0 To UBound($array) - 1 Step 1 If GUICtrlRead($array[$i]) = 1 Then FileWrite(@ScriptDir & "\testlog.txt", "Checkbox " & $i & " value = done" & @CRLF) Else FileWrite(@ScriptDir & "\testlog.txt", "Checkbox " & $i & " value = not done" & @CRLF) EndIf Next EndSwitch WEnd Edited April 8, 2015 by MikahS Snips & Scripts My Snips: graphCPUTemp ~ getENVvarsMy Scripts: Short-Order Encrypter - message and file encryption V1.6.1 ~ AuPad - Notepad written entirely in AutoIt V1.9.4 Feel free to use any of my code for your own use. Forum FAQ Link to comment Share on other sites More sharing options...
31290 Posted April 8, 2015 Author Share Posted April 8, 2015 Thanks again for your nice tips MikahS This is working well But I do have one more question for you (or anyone that can also help). I tried to combine what you've share earlier but I can't manage how to grey the boxes when ticket PLUS writing in the log file with the correct name of the checkboxes. I don't know if you know what I mean. And the all point of this is to write also the state of each boxes in an .ini file in order to create a sort of "retrieve" button that will read the ini file for the user to see what he already done (in case of a reboot or later on for our bosses ^^) This is quite hard for me as my knowledge of autoit just started last Friday even if my whole script is nearly 600+ lines at this point [i've came from Autohoykey to Autoit because of my work ^^) Huge thanks again for all the help you provide to me but is it possible you help me again ? See you ~~~ Doom Shall Never Die, Only The Players ~~~ Link to comment Share on other sites More sharing options...
MikahS Posted April 8, 2015 Share Posted April 8, 2015 (edited) No problem, can you show us what you have and how you have tried to integrate it? I would have a look at the FileRead GUICtrlSetData examples in the helpfile to give a better understanding of how you're going to pull text from your file. Edited April 8, 2015 by MikahS Snips & Scripts My Snips: graphCPUTemp ~ getENVvarsMy Scripts: Short-Order Encrypter - message and file encryption V1.6.1 ~ AuPad - Notepad written entirely in AutoIt V1.9.4 Feel free to use any of my code for your own use. Forum FAQ Link to comment Share on other sites More sharing options...
Solution spudw2k Posted April 8, 2015 Solution Share Posted April 8, 2015 (edited) I geeked out on this one a bit and made an example I made a script that generates a form and fills it with checkboxes based on the contents of an INI file. Upon closing the form the checkbox states are written to the INI. As a simple security measure the states are hashed in order to deter tampering. If the hash isn't correct when read the checkbox will not be checked. The script will also generate the INI upon first run. expandcollapse popup#include <GUIConstantsEx.au3> #include <Crypt.au3> Opt("GUIOnEventMode", 1) Global Const $sINIFile = "test.ini" Global $aCheckboxes GenGUI() Func GenGUI() Local $ManualActionsGui = GUICreate("Test GUI", 200, 300, -1, -1) GUICtrlSetFont(-1, 8.5, 700, 0) Local $iX = 10, $iY = 10 $aCheckboxes = _ReadINI() For $x = 0 To UBound($aCheckboxes) - 1 Local $idCheckBox = _CreateCheckbox($aCheckboxes[$x][0], $iX, $iY) If _Crypt_HashData($aCheckboxes[$x][0] & "|" & $sINIFile & "|" & $GUI_CHECKED, $CALG_MD5) = $aCheckboxes[$x][1] Then GUICtrlSetState(-1, BitOR($GUI_CHECKED, $GUI_DISABLE)) EndIf $aCheckboxes[$x][0] = $idCheckBox $iY += 20 Next GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit", $ManualActionsGui) GUISetState() While 1 Sleep(10) WEnd EndFunc ;==>GenGUI Func _Checked() If GUICtrlRead(@GUI_CtrlId) = 1 Then GUICtrlSetState(@GUI_CtrlId, $GUI_DISABLE) EndFunc ;==>_Checked Func _CreateCheckbox($sLabel, $iX, $iY) Local $idCheckBox = GUICtrlCreateCheckbox($sLabel, $iX, $iY, -1, -1) GUICtrlSetOnEvent(-1, "_Checked") Return $idCheckBox EndFunc ;==>_CreateCheckbox Func _Exit() _WriteINI() Exit EndFunc ;==>_Exit Func _GenINIFile() Local $aCheckboxes[10] = ["1st Checkbox", "2nd Checkbox", "3rd Checkbox", "4th Checkbox", "5th Checkbox", "6th Checkbox", "7th Checkbox", "8th Checkbox", "9th Checkbox", "10th Checkbox"] FileClose(FileOpen($sINIFile, 2)) For $x = 0 To UBound($aCheckboxes) - 1 IniWrite($sINIFile, "Checkbox_Labels", $x, $aCheckboxes[$x]) IniWrite($sINIFile, "Checkbox_States", $x, "") Next EndFunc ;==>_GenINIFile Func _ReadINI() If Not FileExists($sINIFile) Then _GenINIFile() Local $aCheckbox_Labels = IniReadSection($sINIFile, "Checkbox_Labels") If @error Then Return SetError(1, 0, 0) ;If INIReadSection Failed Set Error = 1 Local $aCheckbox_States = IniReadSection($sINIFile, "Checkbox_States") If @error Then Return SetError(2, 0, 0) ;If INIReadSection Failed Set Error = 2 Local $aCheckboxes[$aCheckbox_Labels[0][0]][2] For $x = 0 To ($aCheckbox_Labels[0][0] - 1) $aCheckboxes[$x][0] = $aCheckbox_Labels[$x + 1][1] $aCheckboxes[$x][1] = $aCheckbox_States[$x + 1][1] Next Return $aCheckboxes EndFunc ;==>_ReadINI Func _WriteINI() For $x = 0 To UBound($aCheckboxes) - 1 IniWrite($sINIFile, "Checkbox_Labels", $x, GUICtrlRead($aCheckboxes[$x][0], 1)) IniWrite($sINIFile, "Checkbox_States", $x, _Crypt_HashData(GUICtrlRead($aCheckboxes[$x][0], 1) & "|" & $sINIFile & "|" & GUICtrlRead($aCheckboxes[$x][0]), $CALG_MD5)) Next EndFunc ;==>_WriteINI edit: I added the INI Filename to the hashing func. That way multiple INI files could have the same checkboxes used and they won't produce the same hash. Edited April 8, 2015 by spudw2k Spoiler Things I've Made: Always On Top Tool ◊ AU History ◊ Deck of Cards ◊ HideIt ◊ ICU ◊ Icon Freezer ◊ Ipod Ejector ◊ Junos Configuration Explorer ◊ Link Downloader ◊ MD5 Folder Enumerator ◊ PassGen ◊ Ping Tool ◊ Quick NIC ◊ Read OCR ◊ RemoteIT ◊ SchTasksGui ◊ SpyCam ◊ System Scan Report Tool ◊ System UpTime ◊ Transparency Machine ◊ VMWare ESX Builder Misc Code Snippets: ADODB Example ◊ CheckHover ◊ Detect SafeMode ◊ DynEnumArray ◊ GetNetStatData ◊ HashArray ◊ IsBetweenDates ◊ Local Admins ◊ Make Choice ◊ Recursive File List ◊ Remove Sizebox Style ◊ Retrieve PNPDeviceID ◊ Retrieve SysListView32 Contents ◊ Set IE Homepage ◊ Tickle Expired Password ◊ Transpose Array Projects: Drive Space Usage GUI ◊ LEDkIT ◊ Plasma_kIt ◊ Scan Engine Builder ◊ SpeeDBurner ◊ SubnetCalc Cool Stuff: AutoItObject UDF ◊ Extract Icon From Proc ◊ GuiCtrlFontRotate ◊ Hex Edit Funcs ◊ Run binary ◊ Service_UDF Link to comment Share on other sites More sharing options...
31290 Posted April 9, 2015 Author Share Posted April 9, 2015 Spudw2k: What can I say except a BIG BIG THANKS to you. This is exactly what I need!!! Just a few adjustments on my side and this will be the cherry on the cake! I have to admit that, at this point of my knowledge, I would never be able to write that. And this is cool because now, I can learn a lot from your script and extend my knowledge. @MikahS: I'd like to thanks you again for all the ideas you pointed out at me, that was also very helpful and I'm now able to extend my knowledge to my scripts, thanks! ~~~ Doom Shall Never Die, Only The Players ~~~ Link to comment Share on other sites More sharing options...
MikahS Posted April 9, 2015 Share Posted April 9, 2015 Anytime. 31290 1 Snips & Scripts My Snips: graphCPUTemp ~ getENVvarsMy Scripts: Short-Order Encrypter - message and file encryption V1.6.1 ~ AuPad - Notepad written entirely in AutoIt V1.9.4 Feel free to use any of my code for your own use. Forum FAQ Link to comment Share on other sites More sharing options...
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