Jump to content

Script doesn't exit on Exit?


jebus495
 Share

Recommended Posts

#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?

Link to comment
Share on other sites

  • Moderators

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

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind

Open spoiler to see 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

 

Link to comment
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 2022-02-19 - Version 1.6.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download
Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki
PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki
Task Scheduler (NEW 2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki

Standard UDFs:
Excel - Example Scripts - Wiki
Word - Wiki

Tutorials:
ADO - Wiki
WebDriver - Wiki

 

Link to comment
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

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
Link to comment
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
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...