cvocvo Posted June 30, 2010 Share Posted June 30, 2010 I'm pretty confused as to why I can't get my buttons to work on a final GUI window. Basically I have a long program that runs through and formats a drive. If the "Disk Detection: Partition Input" window shows it breaks the final window's buttons, FinalAnalyze(). But if the partition window doesn't show then the final analyze window works fine. The final analyze window also works fine on its own when you put it into its own app. Here's the section of code I'm having problems with: expandcollapse popup$FormPartitionSliderMain = GUICreate(" Disk Detection: Partition Input", 500, 350, 334, 140, $DS_MODALFRAME) $Label1 = GUICtrlCreateLabel("Partition Input", 35, 24, 273, 43) GUICtrlSetFont($Label1, 24, 400, 0, "Tahoma") $NextButton = GUICtrlCreateButton("Next", 400, 265, 80, 49, 0) GUICtrlSetOnEvent($NextButton, "NextButtonclick") $RecommendedPartitionInput = GUICtrlCreateButton("Use Recommended Settings", 240, 265, 150, 49) GUICtrlSetOnEvent($RecommendedPartitionInput, "RecommendedPartitionInput") $sMainInputNumber = $sNum $label = GUICtrlCreateLabel("Desired Shrink Space (" & $sMainInputNumber & "MB)", 320, 85, 200) $hMainInputNumber = GUICtrlCreateInput("", 320, 100, 60, 20) GUICtrlSetLimit(-1, 7) ;$label = GUICtrlCreateLabel("Enter a Number", 50, 60, 100, 20) $UPMainButton = GUICtrlCreateButton("Update", 380, 100, 60, 20) GUICtrlSetOnEvent($UPMainButton, "UPMainButtonclick") $shrinkname = "\shrink.jpg" $shrinkpath = @ScriptDir & $shrinkname $newpartitionname = "\newpartition.jpg" $newpartitionpath = @ScriptDir & $newpartitionname If $RadioC = 1 Then GUICtrlCreatePic($shrinkpath, 40, 80, 32, 32, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS)) GUICtrlCreateLabel("C:\", 15, 90) $FreeCSpace = Round(DriveSpaceFree("C:\"), 0) $TotalCSpace = Round(DriveSpaceTotal("C:\"), 0) $PercentCFree = $FreeCSpace * 100 / $TotalCSpace $PercentCFree = Round($PercentCFree, 1) & "%" GUICtrlCreateLabel($FreeCSpace & " of " & $TotalCSpace & "MB Free " & $PercentCFree, 80, 85) GUICtrlCreateLabel("Available Shrink Space: " & $sNum & "MB", 80, 100) If $DriveDPartition = 1 Then If $DriveEPartition = 1 Then $DriveD = GUICtrlCreatePic($newpartitionpath, 40, 145, 32, 32, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS)) GUICtrlCreateLabel("D:\", 15, 155) $sDriveDInput = $sNum - 1024 $dlabel = GUICtrlCreateLabel("Desired Partition Size (" & $sDriveDInput & "MB)", 80, 155, 200) $DriveE = GUICtrlCreatePic($newpartitionpath, 40, 210, 32, 32, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS)) GUICtrlCreateLabel("E:\", 15, 220) $sDriveEInput = 1024 $elabel = GUICtrlCreateLabel("Desired Partition Size (" & $sDriveEInput & "MB)", 80, 220, 200) Else $DriveD = GUICtrlCreatePic($newpartitionpath, 40, 145, 32, 32, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS)) GUICtrlCreateLabel("D:\", 15, 155) $sDriveDInput = $sNum $dlabel = GUICtrlCreateLabel("Desired Partition Size (" & $sDriveDInput & "MB)", 80, 155, 200) EndIf Else $DriveE = GUICtrlCreatePic($newpartitionpath, 40, 145, 32, 32, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS)) GUICtrlCreateLabel("E:\", 15, 155) $sDriveEInput = $sNum $dlabel = GUICtrlCreateLabel("Desired Partition Size (" & $sDriveEInput & "MB)", 80, 155, 200) GUICtrlSetLimit(-1, 7) EndIf ElseIf $RadioD = 1 Then GUICtrlCreatePic($shrinkpath, 40, 80, 32, 32, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS)) GUICtrlCreateLabel("D:\", 15, 90) $FreeDSpace = Round(DriveSpaceFree("D:\"), 0) $TotalDSpace = Round(DriveSpaceTotal("D:\"), 0) $PercentDFree = $FreeDSpace * 100 / $TotalDSpace $PercentDFree = Round($PercentDFree, 1) & "%)" GUICtrlCreateLabel("(" & $FreeDSpace & " of " & $TotalDSpace & "MB Free " & $PercentDFree, 80, 85) $DriveE = GUICtrlCreatePic($newpartitionpath, 40, 145, 32, 32, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS)) GUICtrlCreateLabel("E:\", 15, 155) $sDriveEInput = $sNum $dlabel = GUICtrlCreateLabel("Desired Partition Size (" & $sDriveEInput & "MB)", 80, 155, 200) GUICtrlSetLimit(-1, 7) ElseIF $RadioE = 1 Then GUICtrlCreatePic($shrinkpath, 40, 80, 32, 32, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS)) GUICtrlCreateLabel("E:\", 15, 90) $FreeESpace = Round(DriveSpaceFree("E:\"), 0) $TotalESpace = Round(DriveSpaceTotal("E:\"), 0) $PercentEFree = $FreeESpace * 100 / $TotalESpace $PercentEFree = Round($PercentEFree, 1) & "%)" GUICtrlCreateLabel("(" & $FreeESpace & " of " & $TotalESpace & "MB Free " & $PercentEFree, 80, 90) $DriveD = GUICtrlCreatePic($newpartitionpath, 40, 145, 32, 32, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS)) GUICtrlCreateLabel("D:\", 15, 155) $sDriveDInput = $sNum $dlabel = GUICtrlCreateLabel("Desired Partition Size (" & $sDriveDInput & "MB)", 80, 155, 200) GUICtrlSetLimit(-1, 7) EndIf GUISetState(@SW_SHOW) While 1 _Input_Check($hMainInputNumber, False) ; False means limit to numbers Switch GUIGetMsg() Case $GUI_EVENT_CLOSE, $NextButton NextButton_PartitionInputMain() ExitLoop Case $GUI_EVENT_CLOSE, $RecommendedPartitionInput RecommendedPartitionInput() Case $GUI_EVENT_CLOSE, $UPMainButton UPMainButtonclick() EndSwitch WEnd EndFunc Func RecommendedPartitionInput() If $sNum > 1056 Then $sMainInputNumber = $sNum GUICtrlSetData($label, "Desired Shrink Space (" & $sMainInputNumber & "MB)") $sDriveDInput = $sNum - 1024 GUICtrlSetData($dlabel, "Desired Partition Size (" & $sDriveDInput & "MB)") $sDriveEInput = 1024 GUICtrlSetData($elabel, "Desired Partition Size (" & $sDriveEInput & "MB)") $UpdateCount = 0 NextButton_PartitionInputMain() ElseIf $sNum > 544 Then $sMainInputNumber = $sNum GUICtrlSetData($label, "Desired Shrink Space (" & $sMainInputNumber & "MB)") $sDriveDInput = $sNum - 512 GUICtrlSetData($dlabel, "Desired Partition Size (" & $sDriveDInput & "MB)") $sDriveEInput = 512 GUICtrlSetData($elabel, "Desired Partition Size (" & $sDriveEInput & "MB)") $UpdateCount = 0 NextButton_PartitionInputMain() Else MsgBox(0, "Error", "Your system does not meet the minimum drive shrink space specifications.") Exit EndIf EndFunc Func NextButton_PartitionInputMain() Local $AreYouSureLocalCount $bad = 0 If $UpdateCount = 0 Then AreYouSure() $AreYouSureLocalCount = 1 Else If GUICtrlRead($hMainInputNumber) = "" Then MsgBox(0, "Error", "You must input a number for the desired shrink partition size, or click the recommended settings button.") $bad = $bad + 1 EndIf If GUICtrlRead($hMainInputNumber) = 0 Then MsgBox(0, "Error", "You must input a number for the desired shrink partition size, or click the recommended settings button.") $bad = $bad + 1 EndIf EndIf If $bad = 0 Then If $AreYouSureLocalCount = 0 Then AreYouSure() EndIf EndIf EndFunc Func AreYouSure() If $RadioC = 1 Then If $DriveDPartition = 1 Then If $DriveEPartition = 1 Then $continue = MsgBox(4, "", "If the following information is correct, click 'YES' to continue, otherwise click 'NO'." & @CRLF _ & "Desired C:\ Shrink Size: " & $sMainInputNumber & "MB" & @CRLF _ & "Size of future D:\ partition: " & $sDriveDInput & "MB" & @CRLF _ & "Size of future E:\ partition: " & $sDriveEInput & "MB") Else $continue = MsgBox(4, "", "If the following information is correct, click 'YES' to continue, otherwise click 'NO'." & @CRLF _ & "Desired C:\ Shrink Size: " & $sMainInputNumber & "MB" & @CRLF _ & "Size of future D:\ partition: " & $sDriveDInput & "MB") EndIf ElseIf $DriveEPartition = 1 Then $continue = MsgBox(4, "", "If the following information is correct, click 'YES' to continue, otherwise click 'NO'." & @CRLF _ & "Desired C:\ Shrink Size: " & $sMainInputNumber & "MB" & @CRLF _ & "Size of future E:\ partition: " & $sDriveEInput & "MB") EndIf ElseIf $RadioD = 1 Then If $DriveEPartition = 1 Then $continue = MsgBox(4, "", "If the following information is correct, click 'YES' to continue, otherwise click 'NO'." & @CRLF _ & "Desired D:\ Shrink Size: " & $sMainInputNumber & "MB" & @CRLF _ & "Size of future E:\ partition: " & $sDriveEInput & "MB") EndIf ElseIf $RadioE = 1 Then If $DriveDPartition = 1 Then $continue = MsgBox(4, "", "If the following information is correct, click 'YES' to continue, otherwise click 'NO'." & @CRLF _ & "Desired E:\ Shrink Size: " & $sMainInputNumber & "MB" & @CRLF _ & "Size of future D:\ partition: " & $sDriveEInput & "MB") EndIf EndIf If $continue = 6 Then GUIDelete() DoPartition() EndIf EndFunc Func UPMainButtonclick() $bad = 0 $UpdateCount = $UpdateCount + 1 If GUICtrlRead($hMainInputNumber) > $sNum Then MsgBox(0, "Error", "Desired shrink space may not exceed available shrink space") GUICtrlSetData($hMainInputNumber, $sNum) $sMainInputNumber = GUICtrlRead($hMainInputNumber) GUICtrlSetData($label, "Desired Shrink Space (" & $sMainInputNumber & "MB)") $bad = $bad + 1 EndIf If GUICtrlRead($hMainInputNumber) < 544 Then If $DriveEPartition = 1 Then If $DriveDPartition = 1 Then MsgBox(0, "Error", "You selected to create Drives D:\ and E:\ -- the minimum space required for D:\ is 32MB, E:\ is 512MB") $bad = $bad + 1 EndIf EndIf EndIf If $bad = 0 Then If GUICtrlRead($hMainInputNumber) < 512 Then If $DriveEPartition = 1 Then MsgBox(0, "Error", "You selected to create Drive E:\ -- the minimum space required for Drive E:\ is 512MB, recommended 1024MB") $bad = $bad + 1 EndIf EndIf If GUICtrlRead($hMainInputNumber) < 32 Then If $DriveDPartition = 1 Then MsgBox(0, "Error", "You selected to create Drive D:\ -- the minimum space required for Drive D:\ is 32MB") $bad = $bad + 1 EndIf EndIf EndIf If $bad = 0 Then $sMainInputNumber = GUICtrlRead($hMainInputNumber) GUICtrlSetData($label, "Desired Shrink Space (" & $sMainInputNumber & "MB)") If $DriveDPartition = 1 Then If $DriveEPartition = 1 Then $sDriveDInput = GUICtrlRead($hMainInputNumber) - 512 GUICtrlSetData($dlabel, "Desired Shrink Space (" & $sDriveDInput & "MB)") $sDriveEInput = 512 GUICtrlSetData($elabel, "Desired Shrink Space (" & $sDriveEInput & "MB)") EndIf ElseIf $DriveDPartition = 0 Then If $DriveEPartition = 1 Then $sDriveEInput = 512 GUICtrlSetData($elabel, "Desired Shrink Space (" & $sDriveEInput & "MB)") EndIf EndIf EndIf EndFunc Func _Input_Check($hMainInputNumber, $fLetterFlag = True) ; Read input $sText = GUICtrlRead($hMainInputNumber) If $fLetterFlag Then ; Upper case the input and reset the content $sText = StringUpper($sText) GUICtrlSetData($hMainInputNumber, $sText) EndIf ; Check if there are any unwanted characters $sMsg = "" If $fLetterFlag Then ; And if so delete the non-letters If StringRegExp($sText, "[^A-Z]") Then GUICtrlSetData($hMainInputNumber, StringRegExpReplace($sText, "[^A-Z]", "")) Else ; And if so delete the non-numbers If StringRegExp($sText, "[^0-9]") Then GUICtrlSetData($hMainInputNumber, StringRegExpReplace($sText, "[^0-9]", "")) EndIf EndFunc Func DoPartition() Opt("GUIOnEventMode", 1) GUICreate(" Detection: Apply Partition Changes", 350, 100, -1, -1, $DS_MODALFRAME) GUICtrlCreateLabel("Please wait while we apply the selected changes.", 10, 10, 330, 20) GUICtrlCreateLabel("This make take upwards of 10-15 minutes depending upon hardware.", 10, 30, 330, 20) $Status = GUICtrlCreateLabel("Status: Starting...", 10, 50, 330, 20) GUISetState() If $RadioC = 1 Then $ShrinkDrive = "C" ElseIf $RadioD = 1 Then $ShrinkDrive = "D" ElseIf $RadioE = 1 Then $ShrinkDrive = "E" EndIf ;;;;Shrink Selected Partition GUICtrlSetData($Status, "Status: Shrinking partition on drive " & $ShrinkDrive & ":\") FileDelete(@tempdir & "\shrinkdrive.s") $scriptwrite = FileOpen(@tempdir & "\shrinkdrive.s", 1) FileWrite($scriptwrite,"select volume=" & $ShrinkDrive & @crlf) FileWrite($scriptwrite,"shrink desired=" & $sMainInputNumber & @crlf) FileWrite($scriptwrite,"Exit") FileClose($scriptwrite) $filename = "\shrinkdrive.s" $fullpath = @tempdir & $filename RunWait(@ComSpec & " /c diskpart /S " & $fullpath, "", @SW_HIDE, 0x02) FileDelete(@tempdir & "\shrinkdrive.s") ;;;;Create Partitions If $DriveDPartition = 1 Then If $DriveEPartition = 1 Then DoPartDnE() WinClose("Microsoft Windows", "Format disk") WinClose("Microsoft Windows", "Format disk") FormatD() WinClose("AutoPlay", "Local Disk (D:)") FormatE() WinClose("AutoPlay", "Local Disk (E:)") Else DoPartD() WinClose("Microsoft Windows", "Format disk") FormatD() WinClose("AutoPlay", "Local Disk (D:)") EndIf ElseIf $DriveEPartition = 1 Then DoPartE() WinClose("Microsoft Windows", "Format disk") FormatE() WinClose("AutoPlay", "Local Disk (E:)") EndIf $FinalAnalyze = 1 GUIDelete() Analyze() EndFunc Func FormatE() GUICtrlSetData($Status, "Status: Formatting partition on drive E:\") RunWait(@ComSpec & " /c format e: /FS:NTFS /Q /X /Y", "", @SW_HIDE) EndFunc Func FormatD() GUICtrlSetData($Status, "Status: Formatting partition on drive D:\") RunWait(@ComSpec & " /c format d: /FS:NTFS /Q /X /Y", "", @SW_HIDE) EndFunc Func DoPartDnE() GUICtrlSetData($Status, "Status: Creating partitions on drives D:\ and E:\") FileDelete(@tempdir & "\makeDnE.s") $scriptwrite = FileOpen(@tempdir & "\makeDnE.s", 1) FileWrite($scriptwrite,"select volume=" & $ShrinkDrive & @crlf) ;FileWrite($scriptwrite,"create partition extended" & @crlf) FileWrite($scriptwrite,"create partition logical size=" & $sDriveEInput & @crlf) FileWrite($scriptwrite,"assign letter=e:" & @crlf) FileWrite($scriptwrite,"create partition logical" & @crlf) FileWrite($scriptwrite,"assign letter=d:" & @crlf) FileWrite($scriptwrite,"Exit") FileClose($scriptwrite) $filename = "\makeDnE.s" $fullpath = @tempdir & $filename RunWait(@ComSpec & " /c diskpart /S " & $fullpath, "", @SW_HIDE, 0x02) FileDelete(@tempdir & "\makeDnE.s") EndFunc Func DoPartD() GUICtrlSetData($Status, "Status: Creating partition on drive D:\") FileDelete(@tempdir & "\makeD.s") $scriptwrite = FileOpen(@tempdir & "\makeD.s", 1) FileWrite($scriptwrite,"select volume=" & $ShrinkDrive & @crlf) ;FileWrite($scriptwrite,"create partition extended" & @crlf) FileWrite($scriptwrite,"create partition logical" & @crlf) FileWrite($scriptwrite,"assign letter=d:" & @crlf) FileWrite($scriptwrite,"Exit") FileClose($scriptwrite) $filename = "\makeD.s" $fullpath = @tempdir & $filename RunWait(@ComSpec & " /c diskpart /S " & $fullpath, "", @SW_HIDE, 0x02) FileDelete(@tempdir & "\makeD.s") EndFunc Func DoPartE() GUICtrlSetData($Status, "Status: Creating partition on drive E:\") FileDelete(@tempdir & "\makeE.s") $scriptwrite = FileOpen(@tempdir & "\makeE.s", 1) FileWrite($scriptwrite,"select volume=" & $ShrinkDrive & @crlf) ;FileWrite($scriptwrite,"create partition extended" & @crlf) FileWrite($scriptwrite,"create partition logical" & @crlf) FileWrite($scriptwrite,"assign letter=e:" & @crlf) FileWrite($scriptwrite,"Exit") FileClose($scriptwrite) $filename = "\makeE.s" $fullpath = @tempdir & $filename RunWait(@ComSpec & " /c diskpart /S " & $fullpath, "", @SW_HIDE, 0x02) FileDelete(@tempdir & "\makeE.s") EndFunc Func FinalAnalyze() Opt("WinTitleMatchMode", 2) Opt("GUIOnEventMode", 1) Sleep(3000) WinClose("AutoPlay", "Local Disk (D:)") WinClose("AutoPlay", "Local Disk (E:)") WinClose("Microsoft Windows", "Format disk") WinClose("Microsoft Windows", "Format disk") Local $localbad = 0, $allgood = 0 $FormPassFail = GUICreate(" Disk Detection: Final Results", 500, 350, 334, 140, $DS_MODALFRAME) $Label1 = GUICtrlCreateLabel("Final Results", 35, 24, 273, 43) GUICtrlSetFont($Label1, 24, 400, 0, "Tahoma") $folderloc = @ScriptDir $goodname = "\good.jpg" $goodpath = $folderloc & $goodname $badname = "\bad.jpg" $badpath = $folderloc & $badname If $CState = "Good" Then If $DState = "Good" Then If $Estate = "Good" Then $allgood = 1 GUICtrlCreatePic($goodpath, 40, 80, 32, 32, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS)) GUICtrlCreateLabel("All drives are ready.", 80, 90, 410, 17) EndIf EndIf EndIf If $allgood = 0 Then If $CState = "Good" Then GUICtrlCreatePic($goodpath, 40, 80, 32, 32, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS)) GUICtrlCreateLabel("Drive C is ready.", 80, 100, 410, 17) ElseIf $CState = "Bad" Then $localbad = $localbad + 1 GUICtrlCreatePic($badpath, 40, 80, 32, 32, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS)) GUICtrlCreateLabel("Drive C is not ready.", 80, 90, 410, 17) GUICtrlCreateLabel("Requirements: Drive C must be a fixed disk and contain the Windows installation.", 80, 115, 410, 17) EndIf If $DState = "Good" Then GUICtrlCreatePic($goodpath, 40, 145, 32, 32, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS)) GUICtrlCreateLabel("Drive D is ready.", 80, 155, 410, 17) ElseIf $DState = "Bad" Then $localbad = $localbad + 1 GUICtrlCreatePic($badpath, 40, 145, 32, 32, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS)) GUICtrlCreateLabel("Drive D is not ready.", 80, 145, 410, 17) GUICtrlCreateLabel("Requirements: Drive D must be a fixed disk or ramdisk and be user writable.", 80, 170, 410, 17) EndIf If $EState = "Good" Then GUICtrlCreatePic($goodpath, 40, 210, 32, 32, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS)) GUICtrlCreateLabel("Drive E is ready.", 80, 220, 410, 17) ElseIf $EState = "Bad" Then $localbad = $localbad + 1 GUICtrlCreatePic($badpath, 40, 210, 32, 32, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS)) GUICtrlCreateLabel("Drive E is not ready.", 80, 210, 410, 17) GUICtrlCreateLabel("Requirements: Drive E must be a fixed disk and be user writable for temporary files.", 80, 235, 410, 17) EndIf EndIf $EndButton = GUICtrlCreateButton("Finish", 376, 265, 105, 49, 0) ;GUICtrlSetOnEvent($EndButton, "EndButtonclick") If $localbad <> 0 Then $ReChooseFixesButton = GUICtrlCreateButton("Try Again", 250, 265, 105, 49, 0) ;GUICtrlSetOnEvent($ReChooseFixesButton, "ReChooseFixes") ;Else ; $ReChooseFixesButton = "" ;EndIf ;While 1 ; Switch GUIGetMsg() ; Case $GUI_EVENT_CLOSE, $EndButton ; Exit ; EndButtonclick() ; Case $GUI_EVENT_CLOSE, $ReChooseFixesButton ; Exit ; ReChooseFixes() ; EndSwitch ;WEnd GUISetState(@SW_SHOW) ;Sleep(360000) EndFunc Func EndButtonclick() MsgBox(0, "Success", "All of your drives are ready. Disk Detection will now exit") Exit EndFunc Func ReChooseFixes() ChooseFixes() EndFunc As you can see at the end, I've tried various loops and sleeps and different iterations of those things, but I haven't found a solution yet. I've also tried using both settings for "GUIOnEventMode". If anyone has any input on this, I'm stumped. Again, I think it has to do with the *necessary loop in the partition window, but I can't put my finger on it. Also if it helps, here is a working version of the final window that I put into its own app to prove that it works on its own. expandcollapse popup#include <ButtonConstants.au3> #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> #include <GUITreeView.au3> #include <Date.au3> $CState = "Good" $DState = "Good" $EState = "Good" FinalAnalyze() Sleep(30000) Func FinalAnalyze() Opt("WinTitleMatchMode", 2) Opt("GUIOnEventMode", 1) Local $localbad = 0, $allgood = 0 $FormPassFail = GUICreate(" Disk Detection: Final Results", 500, 350, 334, 140, $DS_MODALFRAME) $Label1 = GUICtrlCreateLabel("Final Results", 35, 24, 273, 43) GUICtrlSetFont($Label1, 24, 400, 0, "Tahoma") $folderloc = @ScriptDir $goodname = "\good.jpg" $goodpath = $folderloc & $goodname $badname = "\bad.jpg" $badpath = $folderloc & $badname If $CState = "Good" Then If $DState = "Good" Then If $Estate = "Good" Then $allgood = 1 GUICtrlCreatePic($goodpath, 40, 80, 32, 32, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS)) GUICtrlCreateLabel("All drives are ready.", 80, 90, 410, 17) EndIf EndIf EndIf If $allgood = 0 Then If $CState = "Good" Then GUICtrlCreatePic($goodpath, 40, 80, 32, 32, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS)) GUICtrlCreateLabel("Drive C is ready.", 80, 100, 410, 17) ElseIf $CState = "Bad" Then $localbad = $localbad + 1 GUICtrlCreatePic($badpath, 40, 80, 32, 32, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS)) GUICtrlCreateLabel("Drive C is not ready.", 80, 90, 410, 17) GUICtrlCreateLabel("Requirements: Drive C must be a fixed disk and contain the Windows installation.", 80, 115, 410, 17) EndIf If $DState = "Good" Then GUICtrlCreatePic($goodpath, 40, 145, 32, 32, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS)) GUICtrlCreateLabel("Drive D is ready.", 80, 155, 410, 17) ElseIf $DState = "Bad" Then $localbad = $localbad + 1 GUICtrlCreatePic($badpath, 40, 145, 32, 32, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS)) GUICtrlCreateLabel("Drive D is not ready.", 80, 145, 410, 17) GUICtrlCreateLabel("Requirements: Drive D must be a fixed disk or ramdisk and be user writable.", 80, 170, 410, 17) EndIf If $EState = "Good" Then GUICtrlCreatePic($goodpath, 40, 210, 32, 32, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS)) GUICtrlCreateLabel("Drive E is ready.", 80, 220, 410, 17) ElseIf $EState = "Bad" Then $localbad = $localbad + 1 GUICtrlCreatePic($badpath, 40, 210, 32, 32, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS)) GUICtrlCreateLabel("Drive E is not ready.", 80, 210, 410, 17) GUICtrlCreateLabel("Requirements: Drive E must be a fixed disk and be user writable for temporary files.", 80, 235, 410, 17) EndIf EndIf $EndButton = GUICtrlCreateButton("Finish", 376, 265, 105, 49, 0) GUICtrlSetOnEvent($EndButton, "EndButtonclick") If $localbad <> 0 Then $ReChooseFixesButton = GUICtrlCreateButton("Try Again", 250, 265, 105, 49, 0) GUICtrlSetOnEvent($ReChooseFixesButton, "ReChooseFixes") ;Else ; $ReChooseFixesButton = "" EndIf GUISetState(@SW_SHOW) ;While 1 ; Switch GUIGetMsg() ; Case $GUI_EVENT_CLOSE, $EndButton ; EndButtonclick() ; Case $GUI_EVENT_CLOSE, $ReChooseFixesButton ; ReChooseFixes() ; EndSwitch ;WEnd EndFunc Func EndButtonclick() MsgBox(0, "Success", "All of your drives are ready. Disk Detection will now exit") Exit EndFunc Func ReChooseFixes() ChooseFixes() EndFunc Link to comment Share on other sites More sharing options...
Moderators Melba23 Posted June 30, 2010 Moderators Share Posted June 30, 2010 cvocvo,I see Opt("GUIOnEventMode", 1) lines and Switch GUIGetMsg() lines in your code. Are you changing mode in the same script? If so, I would imagine that is where the problem lies. You should stick with the one mode unless there are exceptional circumstances - and then alarm bells should be sounding asking why the circumstances are exceptional and whether it would not be more sensible to recast the code.So my advice, rewrite your script to use only one mode. If you still have problems then come back. M23  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 columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area  Link to comment Share on other sites More sharing options...
PsaltyDS Posted June 30, 2010 Share Posted June 30, 2010 (edited) GUIGetMsg() needs to be used with the advanced flag (and not with GuiOnEventMode at all!) if you have multiple GUIs active at once. Otherwise, it only sees the messages from the last GUI. You could use GuiSwitch() to determine which GUI is polled by GuiGetMsg(), but that's a little crazy to keep track of. Either use the advanced flag and watch the window handle in [1] to know which window the message came from, or switch your ENTIRE script to event mode. Edit: Been Melba toasted. Also didn't notice GuiOnEventMode was mixed in there. Edited June 30, 2010 by PsaltyDS Valuater's AutoIt 1-2-3, Class... Is now in Session!For those who want somebody to write the script for them: RentACoder"Any technology distinguishable from magic is insufficiently advanced." -- Geek's corollary to Clarke's law Link to comment Share on other sites More sharing options...
cvocvo Posted June 30, 2010 Author Share Posted June 30, 2010 (edited) So for all intensive purposes, I really just need to rewrite the Partition Input GUI function? The rest of my script is currently using GUIOnEventMode, so I just really need to convert this chunk of code to something else: While 1 _Input_Check($hMainInputNumber, False) ; False means limit to numbers Switch GUIGetMsg() Case $GUI_EVENT_CLOSE, $NextButton NextButton_PartitionInputMain() ExitLoop Case $GUI_EVENT_CLOSE, $RecommendedPartitionInput RecommendedPartitionInput() Case $GUI_EVENT_CLOSE, $UPMainButton UPMainButtonclick() EndSwitch WEnd The _Input_Check has to be in a loop because it's constantly looking at the input box to make sure that the characters are only what I specify. The rest of it doesn't need to be a loop, just needs to retain button functionality. I don't think it'd be hard to change GUIGetMsg() into GUIOnEventMode because I've been using the later all along. But, how would I retain button functionality so they don't get ignored by an infinite loop but still maintain a loop to keep the _Input_Check? Edit: Also, I'm only using one visible GUI at a time. Edited June 30, 2010 by cvocvo Link to comment Share on other sites More sharing options...
PsaltyDS Posted June 30, 2010 Share Posted June 30, 2010 Just change the loop to: While 1 _Input_Check($hMainInputNumber, False) ; False means limit to numbers Sleep(10) WEnd Then put GuiCtrlSetOnEvent(-1, "_ButtonHit") after the creation of each button, and this: Func _ButtonHit() Switch @GUI_CTRLID Case $NextButton NextButton_PartitionInputMain() Case $RecommendedPartitionInput RecommendedPartitionInput() Case $UPMainButton UPMainButtonclick() EndSwitch EndFunc I didn't understand why you had $GUI_EVENT_CLOSE in there, so you'll need a GuiSetOnEvent($GUI_EVENT_CLOSE, "_GuiClose") function too. Valuater's AutoIt 1-2-3, Class... Is now in Session!For those who want somebody to write the script for them: RentACoder"Any technology distinguishable from magic is insufficiently advanced." -- Geek's corollary to Clarke's law Link to comment Share on other sites More sharing options...
cvocvo Posted June 30, 2010 Author Share Posted June 30, 2010 (edited) I changed my code to try and implement your solution, but it doesn't seem to work. I *believe* that it gets stuck in the loop: While 1 _Input_Check($hMainInputNumber, False) ; False means limit to numbers Sleep(10) WEnd My buttons look like this: $UPMainButton = GUICtrlCreateButton("Update", 380, 100, 60, 20) GuiCtrlSetOnEvent(-1, "_ButtonHit") $NextButton = GUICtrlCreateButton("Next", 400, 265, 80, 49, 0) GuiCtrlSetOnEvent(-1, "_ButtonHit") $RecommendedPartitionInput = GUICtrlCreateButton("Use Recommended Settings", 240, 265, 150, 49) GuiCtrlSetOnEvent(-1, "_ButtonHit") I set Opt("GUIOnEventMode", 1) instead of 0, so that should be fine; I also made $NextButton, $RecommendedPartitionInput, and $UPMainButton global variables so that shouldn't be a problem. I know the loop is running because the check to disallow typing letters into the input box is working. My theory is the loop is not allowing any of the button clicks to be heard. Ideas? Edit: I also tried using this loop in-conjunction with GUICtrlSetOnEvent(-1, "_ButtonHit") While 1 _Input_Check($hMainInputNumber, False) ; False means limit to numbers $msg = GUIGetMsg() If $msg = $NextButton Then NextButton_PartitionInputMain() ElseIf $msg = $RecommendedPartitionInput Then RecommendedPartitionInput() ElseIf $msg = $UPMainButton Then UPMainButtonclick() EndIf WEnd -->Just also realized that was pointless. I'm also looking at the GUISetOnEvent help page example and I don't know why the proposed solution wouldn't work -- It's pretty similar code. Edit2: Well I don't have a solution to the problem but I do have a bad workaround. Basically, the work around is to leave the Partition Input function with it's GUIGetMsg() buttons, and then use a MsgBox() on the final window to let people decide what they want to do. Not exactly elegant or what I want..but functional for the moment. Edited July 1, 2010 by cvocvo Link to comment Share on other sites More sharing options...
PsaltyDS Posted July 1, 2010 Share Posted July 1, 2010 (edited) In general, when you are using event mode, there is supposed to be a short loop somewhere that the script sits in while there is no other tasking. I thought that loop might be the right place for it, but didn't look through the long script that far, so maybe not. The only real point is to handle all events with very quick functions and get back to the "home" loop as quickly as possible. The home loop kicks off the real work as the event handlers set or clear global flags, for instance. For example, if you click a "RUN" button on a GUI, all the handler does is set Global $f_RUN = True, and return. The home loop sees If $f_RUN Then, and kicks off the function that does the real work. Since the hard work doesn't happen inside the event handling function, other events are not blocked in the mean time. Edited July 1, 2010 by PsaltyDS Valuater's AutoIt 1-2-3, Class... Is now in Session!For those who want somebody to write the script for them: RentACoder"Any technology distinguishable from magic is insufficiently advanced." -- Geek's corollary to Clarke's law 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