Что нового

[Элементы GUI] Как запретить переключение закладок во время выполнения?

Gealut

Новичок
Сообщения
38
Репутация
0
Есть некая форма, содержащая несколько закладок (Tab). На любой закладке есть несколько запросов (input, combo, кнопки) и кнопка старта. После нажатия на последнюю я в скрипте через $GUI_DISABLE прячу все видимые запросы, но не могу спрятать другие закладки. Как это сделать?

Ниже пример условного (но работающего) скрипта. Если нажать "Начать работу" на первой закладке, то все выпадающие списки, строки для ввода текста и кнопки будут закрыты от нажатия, но вторая закладка при этом доступна. А если переключиться на нее во время работы на форме начинается хаос. Надо как-то запретить переключение закладок во время работы скрипта.

Код:
#region Header
#include "ButtonConstants.au3"
#include "ComboConstants.au3"
#include "EditConstants.au3"
#include "StaticConstants.au3"
#include "TabConstants.au3"
#include "WindowsConstants.au3"
#include "GUIConstants.au3"
#include "GuiConstantsEx.au3"
#include "ProgressConstants.au3"
#include "WinAPIEx.au3"

#include "File.au3"
#include "IE.au3"
#include "Array.au3"

#endregion Header
#region Variables and Constants

Global $PP_x = 22, $PP_y = 177, $PP_w = 270, $PP_h = 25
Global $PL_x = 300, $PL_y = 182, $PL_w = 90, $PL_h = 15
Global $color0 = 0xECE9D8, $Color1 = 0xf4f3ef

#endregion Variables and Constants
#region GUI

$dlgTabbed = GUICreate("Test", 407, 395)
GUISetBkColor($Color0)

$PageControl1 = GUICtrlCreateTab(7, 7, 393, 213)
GUICtrlSetResizing(-1, $GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)

$TabSheet1 = GUICtrlCreateTabItem(" Group 1 ")
$combo1 = GUICtrlCreateCombo("la-la-la", 60, 46, 160, 25)
GUICtrlSetData(-1, "lo-lo-lo")
$GLabel1 = GUICtrlCreateLabel("Сайт:", 22, 49, 36, 20)
$combo2 = GUICtrlCreateCombo("JPG", 320, 46, 60, 25)
GUICtrlSetData(-1, "EPS|AI|TIF|PSD")
$GLabel2 = GUICtrlCreateLabel("Тип файла:", 251, 49, 73, 20)
$folder1 = GUICtrlCreateButton("...", 351, 84, 30, 23)
$GLabel3 = GUICtrlCreateLabel("Где: ", 22, 88, 91, 20)
$pfile = GUICtrlCreateInput(@WorkingDir & "\url.txt", 104, 85, 241, 22)
$folder2 = GUICtrlCreateButton("...", 351, 117, 30, 23)
$GLabel4 = GUICtrlCreateLabel("Куда:", 22, 121, 68, 20)
$rfile = GUICtrlCreateInput(@WorkingDir & "\result.txt", 104, 118, 241, 22)
$Button1 = GUICtrlCreateButton("Начать работу", 22, 157, 360, 25)

$TabSheet2 = GUICtrlCreateTabItem(" Group 2 ")
$combo3 = GUICtrlCreateCombo("la-la-la", 60, 46, 160, 25)
GUICtrlSetData(-1, "lu-lu-lu")
$CLabel1 = GUICtrlCreateLabel("Сайт:", 22, 49, 36, 20)
$CLabel4 = GUICtrlCreateLabel("Уровень:", 260, 49, 73, 20)
$combo5 = GUICtrlCreateCombo("Disc", 320, 46, 60, 25)
GUICtrlSetData(-1, "Page")
$folder3 = GUICtrlCreateButton("...", 351, 84, 30, 23)
$CLabel2 = GUICtrlCreateLabel("Где: ", 22, 88, 91, 20)
$cpfile = GUICtrlCreateInput(@WorkingDir & "\url-cd.txt", 104, 85, 241, 22)
$folder4 = GUICtrlCreateButton("...", 351, 117, 30, 23)
$CLabel3 = GUICtrlCreateLabel("Кду:", 22, 121, 68, 20)
$crfile = GUICtrlCreateInput(@WorkingDir & "\url-result.txt", 104, 118, 241, 22)
$Button4 = GUICtrlCreateButton("Начать процедуру", 22, 157, 360, 25)

GUICtrlCreateTabItem("")
$Button2 = GUICtrlCreateButton("Закрыть", 226, 361, 73, 21)
GUISetState(@SW_SHOW)

#endregion GUI
#region Main Loop

While 1
    $nMsg = GUIGetMsg()
    Select
        Case $nMsg = $Button1
			GUICtrlSetState($combo1, $GUI_DISABLE)
			GUICtrlSetState($combo2, $GUI_DISABLE)
			GUICtrlSetState($folder1, $GUI_DISABLE)
			GUICtrlSetState($pfile, $GUI_DISABLE)
			GUICtrlSetState($folder2, $GUI_DISABLE)
			GUICtrlSetState($rfile, $GUI_DISABLE)
			GUICtrlSetState($Button2, $GUI_DISABLE)
			GUICtrlSetState($Button1, $GUI_HIDE)
			Chto_to_delaem()
			GUICtrlSetState($combo1, $GUI_ENABLE)
			GUICtrlSetState($combo2, $GUI_ENABLE)
			GUICtrlSetState($folder1, $GUI_ENABLE)
			GUICtrlSetState($pfile, $GUI_ENABLE)
			GUICtrlSetState($folder2, $GUI_ENABLE)
			GUICtrlSetState($rfile, $GUI_ENABLE)
			GUICtrlSetState($Button2, $GUI_ENABLE)
			GUICtrlSetState($Button1, $GUI_SHOW)
        Case $nMsg = $Button2
			GUIDelete()
			Exit
    EndSelect
WEnd
Exit

Func Chto_to_delaem()
	$progressbar1 = GUICtrlCreateProgress($PP_x, $PP_y, $PP_w, $PP_h)
	$NumLabel = GUICtrlCreateLabel("0/100", $PL_x, $PL_y, $PL_w, $PL_h)
	GUICtrlSetBkColor(-1, $Color1)
	For $x = 1 to 100
		GUICtrlSetData($NumLabel, $x & "/100")
		GUICtrlSetData($progressbar1, $x)
		sleep(100)
	Next
	GUICtrlDelete($progressbar1)
	GUICtrlDelete($NumLabel)
	Return 1
EndFunc

#endregion Main Loop

Заранее большое спасибо тем, кто сможет помочь.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Gealut
Во-первых, Tab это вкладка, а не закладка.

[?]
Надо как-то запретить переключение закладок во время работы скрипта

Код:
#region Header

;.....

#include <GUITab.au3>

#endregion Header
#region Variables and Constants

;....

Global $aDisabled_hTabs[1]

#endregion Variables and Constants

;....

While 1
    $nMsg = GUIGetMsg()
	
    Select
        Case $nMsg = $Button1
            ;.....
			_GUICtrlTab_SetDisable(1, True) ;1 это вторая вкладка (0 - первая)
            Chto_to_delaem()
			_GUICtrlTab_SetDisable(1, False)
			;......
        Case $nMsg = $Button2
            GUIDelete()
            Exit
    EndSelect
WEnd

Func Chto_to_delaem()
   ; ...
EndFunc

Func _GUICtrlTab_SetDisable($nTabItem, $iDisable = True)
	If $aDisabled_hTabs[0] = 0 Then
		GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
	EndIf
	
	If $iDisable Then
		$aDisabled_hTabs[0] += 1
		ReDim $aDisabled_hTabs[$aDisabled_hTabs[0]+1]
		$aDisabled_hTabs[$aDisabled_hTabs[0]] = $nTabItem
	Else
		Local $aTmpArr[1]
		
		For $i = 1 To $aDisabled_hTabs[0]
			If $aDisabled_hTabs[$i] <> $nTabItem Then
				$aTmpArr[0] += 1
				ReDim $aTmpArr[$aTmpArr[0]+1]
				$aTmpArr[$aTmpArr[0]] = $aDisabled_hTabs[$i]
			EndIf
		Next
		
		$aDisabled_hTabs = $aTmpArr
	EndIf
EndFunc

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndTab
    
    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
	
	Switch $iCode
		Case $TCN_SELCHANGING
			Local $iOldOpt_MCM = Opt("MouseCoordMode", 2)
			
			Local $aMousePos = MouseGetPos()
			
			Local $aHitItem1 = _GUICtrlTab_HitTest($hWndFrom, $aMousePos[0], $aMousePos[1])
			Local $aHitItem2 = _GUICtrlTab_HitTest($hWndFrom, $aMousePos[0]-2, $aMousePos[1]-5)
			Local $aHitItem3 = _GUICtrlTab_HitTest($hWndFrom, $aMousePos[0]-5, $aMousePos[1])
			
			For $i = 1 To $aDisabled_hTabs[0]
				If $aDisabled_hTabs[$i] = $aHitItem1[0] Or $aDisabled_hTabs[$i] = $aHitItem2[0] Or $aDisabled_hTabs[$i] = $aHitItem3[0] Then
					Return 1
				EndIf
			Next
			
			Opt("MouseCoordMode", $iOldOpt_MCM)
	EndSwitch
	
    Return $GUI_RUNDEFMSG
EndFunc


Но уверен что можно обойтись без этого.
В Chto_to_delaem создаётся прогресс, его можно создавать и раньше, в определённом табе, и по необходимости отображать.
 
Автор
G

Gealut

Новичок
Сообщения
38
Репутация
0
Массив $aDisabled_hTabs не определен нигде, посему исполнить скрипт невозможно:

D:\_WorkBase\aaa.au3 (118) : ==> Variable used without being declared.:
If $aDisabled_hTabs[0] = 0 Then
If ^ ERROR

А по поводу "обойтись без этого" - наверное, можно, но я еще пока плохо в AutoIt разбираюсь. Хотя прогрессбаром дело ограничивается только в этом примере скрипта, в реальности там есть и дочерние формы, и окно для встроенного браузера:

Код:
...
Global $MyIE = ObjCreate("Shell.Explorer.2")
...
$GUIActiveX = GUICtrlCreateObj ($MyIE, 8, 223, 389, 128)
...

...и вообще весь "набор удовольствий", который возможен в скрипте на 5000 строк кода :smile:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Gealut [?]
Массив $aDisabled_hTabs не определен нигде
Но у меня в скрипте он же есть.
Его нужно добавить в начало скрипта.
 
Автор
G

Gealut

Новичок
Сообщения
38
Репутация
0
Да, сорри. Наверное, уже слишком спать хотел в 4 утра, не заметил этого объявления, хотя специально его искал :blink:

Большое спасибо, все работает.
 
Верх