Wicked_Caty Posted February 28, 2016 Posted February 28, 2016 (edited) A function is started and creates a GUI with two buttons. If either of those are pressed, the function will return a value, which will be used to start another function. However, only one of those two buttons works. Local $gui = GUICreate("Crypt", 120, 130) Local $button0 = GUICtrlCreateButton("Encrypt", 10, 10, 100, 50) Local $button1 = GUICtrlCreateButton("Decrypt", 10, 70, 100, 50) GUISetState(@SW_SHOW, $gui) While 1 If GUIGetMsg() = $button0 Then GUISetState(@SW_HIDE, $gui) GUIDelete($gui) Return 1 ElseIf GUIGetMsg() = $button1 Then GUISetState(@SW_HIDE, $gui) GUIDelete($gui) Return 2 ElseIf GUIGetMsg() = $GUI_EVENT_CLOSE Then GUISetState(@SW_HIDE, $gui) GUIDelete($gui) Return 0 EndIf WEnd The If works as expected, but the two ElseIf don't work at all. No matter how hard or how often I hit that $button1 or click that X in the top-right of the GUI. Maybe I haven't had enough coffee today, who knows, but I'm stuck right now... Thanks - complete source-code is attached _Crypt.au3 Edited February 28, 2016 by Wicked_Caty Grammar, spelling, formatting
InunoTaishou Posted February 28, 2016 Posted February 28, 2016 (edited) I'd suggest organizing your code a bit better and probably not jumping multiple functions that are pretty related (Creating a gui for login then trapping the execution in the login function, then a gui for mode and trapping your execution for mode). Anyways, the solution is to store the GUIGetMsg() in a variable or use it as the expression in a switch statement. Edited February 28, 2016 by InunoTaishou
TheSaint Posted February 28, 2016 Posted February 28, 2016 In other words, you are calling GUIGetMsg() too many times in you While.. loop, and your program would be eating up too much memory, and most likely giving you a timing issue. Inserting a Sleep(50) every loop might help too. Like Inuno said, use a variable, etc. While 1 $msg = GUIGetMsg() If $msg = $button0 Then GUISetState(@SW_HIDE, $gui) GUIDelete($gui) Return 1 ElseIf $msg = $button1 Then GUISetState(@SW_HIDE, $gui) GUIDelete($gui) Return 2 ElseIf $msg = $GUI_EVENT_CLOSE Then GUISetState(@SW_HIDE, $gui) GUIDelete($gui) Return 0 EndIf ;Sleep(50) WEnd Like he also said though, you would be better off using the traditional Switch method. Haven't looked at the rest of your code or tried my improvement, but that misuse of memory stood out. Make sure brain is in gear before opening mouth! Remember, what is not said, can be just as important as what is said. Spoiler What is the Secret Key? Life is like a Donut If I put effort into communication, I expect you to read properly & fully, or just not comment. Ignoring those who try to divert conversation with irrelevancies. If I'm intent on insulting you or being rude, I will be obvious, not ambiguous about it. I'm only big and bad, to those who have an over-active imagination. I may have the Artistic Liesense to disagree with you. TheSaint's Toolbox (be advised many downloads are not working due to ISP screwup with my storage)
Wicked_Caty Posted February 28, 2016 Author Posted February 28, 2016 Quote I'd suggest organizing your code a bit better and probably not jumping multiple functions that are pretty related (Creating a gui for login then trapping the execution in the login function, then a gui for mode and trapping your execution for mode). Anyways, the solution is to store the GUIGetMsg() in a variable or use it as the expression in a switch statement. How am I supposed to do that? I don't know the "guildelines" or the "rulebook" :/
InunoTaishou Posted February 28, 2016 Posted February 28, 2016 There's no rule book for it, it's just a suggestion. You could do something like this (I didn't do all of it, just the login and crypt gui) expandcollapse popup#include <MsgBoxConstants.au3> #include <GUIConstants.au3> #include <FileConstants.au3> #include <StringConstants.au3> #include <Array.au3> Global $frmLogin = 1 Global $inpUsername Global $inpPassword Global $btnLogin Global $btnExit Global $frmCrypt = 1 Global $btnEncrypt Global $btnDecrypt Global Const $user = "Caty" Global Const $pass = 1234 Main() Func CreateLoginGUI() $frmLogin = GUICreate("Crypt", 220, 110) $inpUsername = GUICtrlCreateInput("Username:", 10, 10, 200, 20) $inpPassword = GUICtrlCreateInput("Password:", 10, 40, 200, 20) $btnLogin = GUICtrlCreateButton("Log in", 10, 70, 95, 30) $btnExit = GUICtrlCreateButton("Exit", 115, 70, 95, 30) GUISetState(@SW_SHOW, $frmLogin) EndFunc ;==>Login Func CreateCryptGUI() $frmCrypt = GUICreate("Crypt", 120, 130) $btnEncrypt = GUICtrlCreateButton("Encrypt", 10, 10, 100, 50) $btnDecrypt = GUICtrlCreateButton("Decrypt", 10, 70, 100, 50) GUISetState(@SW_SHOW, $frmCrypt) EndFunc ;==>Mode Func Encryption() Local $gui = GUICreate("Crypt", 200, 140) Local $ctrl0 = GUICtrlCreateInput("Filename", 10, 10, 180, 30) Local $ctrl1 = GUICtrlCreateInput("Text", 10, 50, 180, 30) Local $button = GUICtrlCreateButton("Encrypt", 10, 90, 180, 40) GUISetBkColor(0xFF8811, $gui) GUISetState(@SW_SHOW, $gui) While 1 If GUIGetMsg() = $button Then ExitLoop Else Sleep(25) EndIf WEnd Local $f = FileOpen("D:\documents\coding\Crypt\" & GUICtrlRead($ctrl0), $FO_APPEND) Local $text = StringSplit(GUICtrlRead($ctrl1), '', 2) Local $len = UBound($text) Local $tmp = "" FileWrite($f, $len & @CRLF) For $i = 0 To $len - 1 $tmp = "" $tmp = AscW($text[$i]) $tmp = $tmp * 29212 $tmp = $tmp / 18108 $tmp = $tmp * 14481 $tmp = $tmp / 10857 $tmp = $tmp * 31627 $tmp = $tmp / 24087 $tmp = $tmp * 15835 $tmp = $tmp / 25878 $tmp = $tmp * 11957 $tmp = $tmp / 27520 $tmp = $tmp * 01324 FileWrite($f, $tmp & @CRLF) Next GUISetBkColor(0x11FF88, $gui) FileClose($f) GUISetState(@SW_HIDE, $gui) GUIDelete($gui) Return True EndFunc ;==>Encryption Func Decryption() Local $gui = GUICreate("Crypt", 200, 140) Local $ctrl0 = GUICtrlCreateInput("Encrypted", 10, 10, 180, 30) Local $ctrl1 = GUICtrlCreateInput("Decrypted", 10, 50, 180, 30) Local $button = GUICtrlCreateButton("Decrypt", 10, 90, 180, 40) GUISetBkColor(0xFF8811, $gui) GUISetState(@SW_SHOW, $gui) While 1 If GUIGetMsg() = $button Then ExitLoop Else Sleep(25) EndIf WEnd Local $fin = FileOpen("D:\documents\coding\Crypt\" & GUICtrlRead($ctrl0), $FO_APPEND) Local $len = Number(FileReadLine($fin, 1)) Local $tmp0, $tmp1, $tmp2 For $i = 0 To $len - 1 $tmp0 = "" $tmp1 = "" $tmp0 = Dec(Number(FileReadLine($fin, $i + 1))) $tmp0 = $tmp0 / 01324 $tmp0 = $tmp0 * 27520 $tmp0 = $tmp0 / 11957 $tmp0 = $tmp0 * 25878 $tmp0 = $tmp0 / 15835 $tmp0 = $tmp0 * 24087 $tmp0 = $tmp0 / 31627 $tmp0 = $tmp0 * 10857 $tmp0 = $tmp0 / 14481 $tmp0 = $tmp0 * 18108 $tmp0 = $tmp0 / 29212 $tmp0 = ChrW($tmp0) $tmp1 = String($tmp1) + String($tmp0) Next GUISetBkColor(0x11FF88, $gui) FileClose($fin) Local $fou = FileOpen("D:\documents\coding\Crypt\" & GUICtrlRead($ctrl1), $FO_APPEND) FileWrite($fou, $tmp2) FileClose($fou) GUISetState(@SW_HIDE, $gui) GUIDelete($gui) Return True EndFunc ;==>Decryption Func Main() Local $att = 3 CreateLoginGUI() While (True) Local $nMsg = GUIGetMsg(1) Switch ($nMsg[1]) Case $frmLogin Switch ($nMsg[0]) Case $GUI_EVENT_CLOSE, $btnExit GUIDelete($frmLogin) Exit 0 Case $btnLogin If GUICtrlRead($inpUsername) = $user And GUICtrlRead($inpPassword) = $pass Then GUIDelete($frmLogin) CreateCryptGUI() Else If $att = 3 Then GUISetBkColor(0xFF9911, $frmLogin) ElseIf $att = 2 Then GUISetBkColor(0xFF6611, $frmLogin) ElseIf $att = 1 Then GUISetBkColor(0xFF3311, $frmLogin) Else GUIDelete($frmLogin) Exit -1 EndIf $att -= 1 EndIf EndSwitch Case $frmCrypt Switch ($nMsg[0]) case $GUI_EVENT_CLOSE GUIDelete($frmCrypt) Return 0 Case $btnEncrypt Encryption() Case $btnDecrypt Decryption() EndSwitch EndSwitch WEnd EndFunc ;==>Main Call a function that creates the corresponding GUI but the execution stays in Main() and using the advanced mode in GUIGetMsg, since we'll be working with multiple GUIs. If it's too complicated then GUIOnEventMode might be easier. expandcollapse popup#include <MsgBoxConstants.au3> #include <GUIConstants.au3> #include <FileConstants.au3> #include <StringConstants.au3> #include <Array.au3> Opt("GUIOnEventMode", 1) Global $frmLogin Global $inpUsername Global $inpPassword Global $btnLogin Global $btnExit Global $frmCrypt Global $btnEncrypt Global $btnDecrypt Global Const $user = "Caty" Global Const $pass = 1234 CreateLoginGUI() While (True) Sleep(100) WEnd Func Close() If ($frmLogin) Then GUIDelete($frmLogin) If ($frmCrypt) Then GUIDelete($frmCrypt) Exit 0 EndFunc ;==>Close Func btnLogin() Local Static $att = 3 If (GUICtrlRead($inpUsername) = $user And GUICtrlRead($inpPassword) = $pass) Then GUIDelete($frmLogin) CreateCryptGUI() Else If $att = 3 Then GUISetBkColor(0xFF9911, $frmLogin) ElseIf $att = 2 Then GUISetBkColor(0xFF6611, $frmLogin) ElseIf $att = 1 Then GUISetBkColor(0xFF3311, $frmLogin) Else GUIDelete($frmLogin) Exit -1 EndIf $att -= 1 EndIf EndFunc ;==>btnLogin Func CreateLoginGUI() $frmLogin = GUICreate("Crypt", 220, 110) $inpUsername = GUICtrlCreateInput("Username:", 10, 10, 200, 20) $inpPassword = GUICtrlCreateInput("Password:", 10, 40, 200, 20) $btnLogin = GUICtrlCreateButton("Log in", 10, 70, 95, 30) $btnExit = GUICtrlCreateButton("Exit", 115, 70, 95, 30) GUICtrlSetOnEvent($btnLogin, "btnLogin") GUICtrlSetOnEvent($btnExit, "Close") GUISetOnEvent($GUI_EVENT_CLOSE, "Close") GUISetState(@SW_SHOW, $frmLogin) EndFunc ;==>CreateLoginGUI Func CreateCryptGUI() $frmCrypt = GUICreate("Crypt", 120, 130) $btnEncrypt = GUICtrlCreateButton("Encryption", 10, 10, 100, 50) $btnDecrypt = GUICtrlCreateButton("Decryption", 10, 70, 100, 50) GUICtrlSetOnEvent($btnEncrypt, "Encryption") GUICtrlSetOnEvent($btnDecrypt, "Decryption") GUISetOnEvent($GUI_EVENT_CLOSE, "Close") GUISetState(@SW_SHOW, $frmCrypt) EndFunc ;==>CreateCryptGUI Func Encryption() Local $gui = GUICreate("Crypt", 200, 140) Local $ctrl0 = GUICtrlCreateInput("Filename", 10, 10, 180, 30) Local $ctrl1 = GUICtrlCreateInput("Text", 10, 50, 180, 30) Local $button = GUICtrlCreateButton("Encrypt", 10, 90, 180, 40) GUISetBkColor(0xFF8811, $gui) GUISetState(@SW_SHOW, $gui) While 1 If GUIGetMsg() = $button Then ExitLoop Else Sleep(25) EndIf WEnd Local $f = FileOpen("D:\documents\coding\Crypt\" & GUICtrlRead($ctrl0), $FO_APPEND) Local $text = StringSplit(GUICtrlRead($ctrl1), '', 2) Local $len = UBound($text) Local $tmp = "" FileWrite($f, $len & @CRLF) For $i = 0 To $len - 1 $tmp = "" $tmp = AscW($text[$i]) $tmp = $tmp * 29212 $tmp = $tmp / 18108 $tmp = $tmp * 14481 $tmp = $tmp / 10857 $tmp = $tmp * 31627 $tmp = $tmp / 24087 $tmp = $tmp * 15835 $tmp = $tmp / 25878 $tmp = $tmp * 11957 $tmp = $tmp / 27520 $tmp = $tmp * 01324 FileWrite($f, $tmp & @CRLF) Next GUISetBkColor(0x11FF88, $gui) FileClose($f) GUISetState(@SW_HIDE, $gui) GUIDelete($gui) Return True EndFunc ;==>Encryption Func Decryption() Local $gui = GUICreate("Crypt", 200, 140) Local $ctrl0 = GUICtrlCreateInput("Encrypted", 10, 10, 180, 30) Local $ctrl1 = GUICtrlCreateInput("Decrypted", 10, 50, 180, 30) Local $button = GUICtrlCreateButton("Decrypt", 10, 90, 180, 40) GUISetBkColor(0xFF8811, $gui) GUISetState(@SW_SHOW, $gui) While 1 If GUIGetMsg() = $button Then ExitLoop Else Sleep(25) EndIf WEnd Local $fin = FileOpen("D:\documents\coding\Crypt\" & GUICtrlRead($ctrl0), $FO_APPEND) Local $len = Number(FileReadLine($fin, 1)) Local $tmp0, $tmp1, $tmp2 For $i = 0 To $len - 1 $tmp0 = "" $tmp1 = "" $tmp0 = Dec(Number(FileReadLine($fin, $i + 1))) $tmp0 = $tmp0 / 01324 $tmp0 = $tmp0 * 27520 $tmp0 = $tmp0 / 11957 $tmp0 = $tmp0 * 25878 $tmp0 = $tmp0 / 15835 $tmp0 = $tmp0 * 24087 $tmp0 = $tmp0 / 31627 $tmp0 = $tmp0 * 10857 $tmp0 = $tmp0 / 14481 $tmp0 = $tmp0 * 18108 $tmp0 = $tmp0 / 29212 $tmp0 = ChrW($tmp0) $tmp1 = String($tmp1) + String($tmp0) Next GUISetBkColor(0x11FF88, $gui) FileClose($fin) Local $fou = FileOpen("D:\documents\coding\Crypt\" & GUICtrlRead($ctrl1), $FO_APPEND) FileWrite($fou, $tmp2) FileClose($fou) GUISetState(@SW_HIDE, $gui) GUIDelete($gui) Return True EndFunc ;==>Decryption Main() isn't even needed for this one. We're going to create the login GUI then wait until they click one of the buttons, or close. The corresponding functions for the buttons take care of the sequential order of the script, moving on to the next part.
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