Sign in to follow this  
Followers 0
jebus495

Script doesn't exit on Exit?

5 posts in this topic

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

Global $Input1, $nMsg

_GUI()

Func _GUI()
$Form1_1 = GUICreate("CrapHack Installation", 256, 248, 342, 209)
$Input1 = GUICtrlCreateInput("C:\Program Files\Diablo II", 16, 55, 217, 21)
$Label1 = GUICtrlCreateLabel("Please enter your Diablo II directory below.", 17, 18, 230, 33)
$Checkbox1 = GUICtrlCreateCheckbox("See monsters on map", 16, 88, 129, 17)
GUICtrlSetState ($Checkbox1, $GUI_CHECKED)
$Checkbox2 = GUICtrlCreateCheckbox("See healthbars and immunities", 16, 120, 185, 17)
$Checkbox3 = GUICtrlCreateCheckbox("Load in window mode", 16, 152, 137, 17)
$Button1 = GUICtrlCreateButton("Install", 88, 200, 75, 25)
GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        
        Case $Checkbox1
            If GUICtrlRead($Checkbox1) = $GUI_CHECKED Then GUICtrlSetState($Checkbox2, $GUI_UNCHECKED)
                If GUICtrlRead($Checkbox1) = $GUI_UNCHECKED And GUICtrlRead($Checkbox2) = $GUI_UNCHECKED Then GUICtrlSetState($Checkbox1, $GUI_CHECKED)
        Case $Checkbox2
            If GUICtrlRead($Checkbox2) = $GUI_CHECKED Then GUICtrlSetState ($Checkbox1, $GUI_UNCHECKED)
                If GUICtrlRead($Checkbox2) = $GUI_UNCHECKED And GUICtrlRead($Checkbox1) = $GUI_UNCHECKED Then GUICtrlSetState($Checkbox2, $GUI_CHECKED)
        
        Case $Button1
            GUISetState(@SW_HIDE)
            _install()
        
    EndSwitch
WEnd
EndFunc

Func _install()
$existcase = FileExists($Input1 & "\game.exe")
If $existcase = 0 Then
    $_CorR = MsgBox(21, "Path incorrect", "Enter correct path or cancel.")
        If $_CorR = 4 Then
            GUISetState(@SW_SHOW)
            _GUI()
                If $_CorR = 2 Then
                    Exit
                EndIf
        EndIf
EndIf
EndFunc

This is probably a simple oversight on my part. I'm not exactly familiar with GUI's.

It checks the path in the input box for a file and if it isn't there it pops up a msgbox to either close the script or retry.

When you press cancel or "X" in the msgbox the script doesn't close. Is there something I'm missing here?

Share this post


Link to post
Share on other sites



jebus495,

You are calling your _GUI function recursively - that is it is being called again by _install before it ends - and this always leads to problems unless you know exactly what you are doing. :) Try replacing your _install function with this one:

Func _install()
    $existcase = FileExists($Input1 & "\game.exe")
    If $existcase = 0 Then
        ; File does not exist so see what to do next
        Switch MsgBox(21, "Path incorrect", "Enter correct path or cancel.")
            ; This is "Retry"
            Case 4
                GUISetState(@SW_SHOW)
                ;_GUI()   ; Do NOT call function recursively - the GUI is already there!
                Return
            Case 2
                Exit
        EndSwitch
    Else
        ; File exists so do the installing stuff
    EndIf
EndFunc   ;==>_install

I have altered the MsgBox code a bit to make it tighter - I hope you can see what I have done and why. Please ask if not.

M23


Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind._______My UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Share this post


Link to post
Share on other sites

I modified your script a little bit:

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

Global $Input1, $nMsg, $sInstallPath, $Form1_1

_GUI()

Func _GUI()
$Form1_1 = GUICreate("CrapHack Installation", 256, 248, 342, 209)
$Input1 = GUICtrlCreateInput("C:\Program Files\Diablo II", 16, 55, 217, 21)
$Label1 = GUICtrlCreateLabel("Please enter your Diablo II directory below.", 17, 18, 230, 33)
$Checkbox1 = GUICtrlCreateCheckbox("See monsters on map", 16, 88, 129, 17)
GUICtrlSetState ($Checkbox1, $GUI_CHECKED)
$Checkbox2 = GUICtrlCreateCheckbox("See healthbars and immunities", 16, 120, 185, 17)
$Checkbox3 = GUICtrlCreateCheckbox("Load in window mode", 16, 152, 137, 17)
$Button1 = GUICtrlCreateButton("Install", 88, 200, 75, 25)
GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Checkbox1
            If GUICtrlRead($Checkbox1) = $GUI_CHECKED Then GUICtrlSetState($Checkbox2, $GUI_UNCHECKED)
                If GUICtrlRead($Checkbox1) = $GUI_UNCHECKED And GUICtrlRead($Checkbox2) = $GUI_UNCHECKED Then GUICtrlSetState($Checkbox1, $GUI_CHECKED)
        Case $Checkbox2
            If GUICtrlRead($Checkbox2) = $GUI_CHECKED Then GUICtrlSetState ($Checkbox1, $GUI_UNCHECKED)
                If GUICtrlRead($Checkbox2) = $GUI_UNCHECKED And GUICtrlRead($Checkbox1) = $GUI_UNCHECKED Then GUICtrlSetState($Checkbox2, $GUI_CHECKED)
            Case $Button1
            $sInstallPath = GUICtrlRead($Input1)
            _install()
    EndSwitch
WEnd
EndFunc

Func _install()
    While 1
        $existcase = FileExists($sInstallPath & "\game.exe")
        If $existcase = 0 Then
            $_CorR = MsgBox(21, "Path incorrect", $sInstallPath & "\game.exe does not exist!" & @CRLF & "Enter correct path or cancel.")
            If $_CorR = 4 Then Return;        ; Retry selected
            Exit                            ; All other selections exit the script
        Else 
            ExitLoop
        EndIf
    WEnd
    ; here the install begins. Delete the GUI as it is no longer needed
    GUIDelete($Form1_1)
EndFunc

My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2017-04-18 - Version 1.4.8.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2017-02-27 - Version 1.3.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2015-04-01 - Version 0.4.0.0) - Download - General Help & Support - Example Scripts
Excel - Example Scripts - Wiki
Word - Wiki
PowerPoint (2015-06-06 - Version 0.0.5.0) - Download - General Help & Support

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites

Your problem was that your 'If $_CorR = 2' was tested inside the 'If $_CorR = 4'...'endif' and therefore you couldn't exit. And one more thing if you click retry repeatedly you get multiple instances of your main window. Good luck!

Share this post


Link to post
Share on other sites

#5 ·  Posted (edited)

jebus495,

You are calling your _GUI function recursively - that is it is being called again by _install before it ends - and this always leads to problems unless you know exactly what you are doing. :) Try replacing your _install function with this one:

Func _install()
    $existcase = FileExists($Input1 & "\game.exe")
    If $existcase = 0 Then
        ; File does not exist so see what to do next
        Switch MsgBox(21, "Path incorrect", "Enter correct path or cancel.")
            ; This is "Retry"
            Case 4
                GUISetState(@SW_SHOW)
                ;_GUI()   ; Do NOT call function recursively - the GUI is already there!
                Return
            Case 2
                Exit
        EndSwitch
    Else
        ; File exists so do the installing stuff
    EndIf
EndFunc   ;==>_install

I have altered the MsgBox code a bit to make it tighter - I hope you can see what I have done and why. Please ask if not.

M23

AWESOME!

I guess I assumed that the GUI would just go away when it left the function.

I also made a goof with this:

$existcase = FileExists($Input1 & "\game.exe")

Lol... Should be:

$d2_dir = GUICtrlRead($Input1)
$existcase = FileExists($d2_dir & "\game.exe")

Thank you very much for the help. Made a few things much clearer for me!

Edit: Thanks for all the speedy replies :)

Edit: Edit: Actually...

$existcase = FileExists(GUICtrlRead($Input1) & "\game.exe")

XD

Edited by jebus495

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
Sign in to follow this  
Followers 0