Что нового

[Окна, Диалоги] Как передать управление в предыдущее окно?

fortages

Новичок
Сообщения
81
Репутация
3
Здравствуйте.
Помогите разобраться, пожалуйста.
Есть форма (она же - главное окно $ParentWin), после выбора Параметр1 или Параметр2 по RadioBox'у - появляется определенное окно ($ChildWin), содержимое которого зависит от выбора.
Проблема в том, что после отображения этой информации, окошко $ChildWin нужно закрыть и вернуться назад в $ParentWin с возможностью работать в дальнейшем (кнопка "проверить" и т.д.)
Окно $ChildWin закрыть получается таким образом:
Код:
Case $ButtonExit
		  GUISetState(@SW_HIDE, $ChildWin)
		   GUISetState(@SW_SHOW, $ParentWin)
		   GUIDelete($ChildWin)
		   ;WinActivate ($ParentWin)


Но при этом все "замирает" - кнопка "проверить" и другие действия в главном окне не работают. Окно $ParentWin отображается, но работать в нем нельзя, можно разве что закрыть...
Подскажите, пожалуйста, как "передать управление" в главное окно?

Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

;----------------------- ОКНО 1 НАЧАЛОСЬ ------------------------------------------
$ParentWin = GUICreate("Планировщик",1029, 698, 7, 0)
$Task1 = GUICtrlCreateLabel("Задание 1", 8, 16, 70, 17)

$Login1 = GUICtrlCreateLabel("Login", 8, 48, 32, 17)
$Password1 = GUICtrlCreateLabel("Password", 8, 80, 21, 17)
$Login1_Input = GUICtrlCreateInput("", 48, 48, 105, 21)
$Password1_Input = GUICtrlCreateInput("", 48, 72, 105, 21)

$Param1 = GUICtrlCreateRadio("Параметр1", 8, 112, 70, 15)
$Param2 = GUICtrlCreateRadio("Параметр2", 88, 112, 70, 15)
$GoTask1 = GUICtrlCreateButton("Выбрать", 8, 136, 65, 25, $WS_GROUP)
$CheckTask1 = GUICtrlCreateButton("Проверить", 88, 136, 65, 25, $WS_GROUP)

;----------------------- ОКНО 1 ЗАКОНЧИЛОСЬ ------------------------------------------

GUISetState(@SW_SHOW, $ParentWin)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
           Exit
         Case $GoTask1
            If GUICtrlRead ($Param1) = $GUI_CHECKED   Then
              _Func1()
            ElseIf GUICtrlRead ($Param2) = $GUI_CHECKED  Then
               _Func2()
            EndIf
		Case $CheckTask1
			MsgBox(0, "Проверка", "проверка связи")
	EndSwitch
WEnd


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	; НАЧАЛО
Func _Func1()
 $ChildWin=GUICreate('Test Param1')
 $ButtonExit = GUICtrlCreateButton('Выход', 225, 350, 140, 30)
 GUISetState()

While True
  Switch GUIGetMsg()
   Case -3
    Exit
	
	;Case $GUI_EVENT_CLOSE
            ;Exit
    Case $ButtonExit
			;Exit
           GUISetState(@SW_HIDE, $ChildWin)
		   GUISetState(@SW_SHOW, $ParentWin)
		   GUIDelete($ChildWin)
		   ;WinActivate ($ParentWin)
	EndSwitch
WEnd
			
EndFunc	
 
; КОНЕЦ
        
Func _Func2()
 $ChildWin=GUICreate('Test Param2')
 $ButtonExit = GUICtrlCreateButton('Выход', 225, 350, 140, 30)
 GUISetState()

While True
  Switch GUIGetMsg()
   Case -3
    Exit
	
	;Case $GUI_EVENT_CLOSE
            ;Exit
    Case $ButtonExit
			;Exit
           GUISetState(@SW_HIDE, $ChildWin)
		   GUISetState(@SW_SHOW, $ParentWin)
		   GUIDelete($ChildWin)
		   ;WinActivate ($ParentWin)
	EndSwitch
WEnd
			
EndFunc	
 
; КОНЕЦ
 

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
fortages
Подкорректировал скрипт, основные ошибки в комментариях:

Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

;----------------------- ОКНО 1 НАЧАЛОСЬ ------------------------------------------
$ParentWin = GUICreate("Планировщик",1029, 698, 7, 0)
$Task1 = GUICtrlCreateLabel("Задание 1", 8, 16, 70, 17)

$Login1 = GUICtrlCreateLabel("Login", 8, 48, 32, 17)
$Password1 = GUICtrlCreateLabel("Password", 8, 80, 21, 17)
$Login1_Input = GUICtrlCreateInput("", 48, 48, 105, 21)
$Password1_Input = GUICtrlCreateInput("", 48, 72, 105, 21)

$Param1 = GUICtrlCreateRadio("Параметр1", 8, 112, 70, 15)
$Param2 = GUICtrlCreateRadio("Параметр2", 88, 112, 70, 15)
$GoTask1 = GUICtrlCreateButton("Выбрать", 8, 136, 65, 25, $WS_GROUP)
$CheckTask1 = GUICtrlCreateButton("Проверить", 88, 136, 65, 25, $WS_GROUP)

;----------------------- ОКНО 1 ЗАКОНЧИЛОСЬ ------------------------------------------

GUISetState(@SW_SHOW, $ParentWin)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
           Exit
         Case $GoTask1
            If BitAND(GUICtrlRead($Param1),$GUI_CHECKED) = $GUI_CHECKED   Then ; Добавил BitAND
              _Func1()
            ElseIf BitAND(GUICtrlRead($Param2),$GUI_CHECKED) = $GUI_CHECKED  Then ; Добавил BitAND
               _Func2()
            EndIf
        Case $CheckTask1
            MsgBox(0, "Проверка", "проверка связи")
    EndSwitch
WEnd


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ; НАЧАЛО
Func _Func1()
 $ChildWin1=GUICreate('Test Param1') ; Изменил название переменной
 $ButtonExit = GUICtrlCreateButton('Выход', 225, 350, 140, 30)
 GUISetState(@SW_SHOW, $ChildWin1)

While True
  Switch GUIGetMsg()

    Case $ButtonExit

           GUIDelete($ChildWin1)
           ExitLoop ; Добавил выход из цикла, без которого скрипт зацикливался после закрытия дочерней формы
    EndSwitch
WEnd
           
EndFunc
       
Func _Func2()
 $ChildWin2=GUICreate('Test Param2') ; Изменил название переменной
 $ButtonExit = GUICtrlCreateButton('Выход', 225, 350, 140, 30)
 GUISetState(@SW_SHOW, $ChildWin2)

While True
  Switch GUIGetMsg()
    Case $ButtonExit
           GUIDelete($ChildWin2)
           ExitLoop ; Добавил выход из цикла, без которого скрипт зацикливался после закрытия дочерней формы
    EndSwitch
WEnd
           
EndFunc
 
; КОНЕЦ
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
fortages,
Немного подкорректировал код snoitaleR`a.
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

;----------------------- ОКНО 1 НАЧАЛОСЬ ------------------------------------------
$hParentWin = GUICreate('Планировщик', 1029, 698, -1, -1)
$iTask1 = GUICtrlCreateLabel('Задание 1', 8, 16, 70, 17)

$iLogin1 = GUICtrlCreateLabel('Login', 8, 48, 32, 17)
$iPassword1 = GUICtrlCreateLabel('Password', 8, 80, 21, 17)
$iLogin1_Input = GUICtrlCreateInput('', 48, 48, 105, 21)
$iPassword1_Input = GUICtrlCreateInput('', 48, 72, 105, 21)

$iParam1 = GUICtrlCreateRadio('Параметр1', 8, 112, 80, 15)
$iParam2 = GUICtrlCreateRadio('Параметр2', 90, 112, 80, 15)
$iGoTask1 = GUICtrlCreateButton('Выбрать', 8, 136, 65, 25, $WS_GROUP)
$iCheckTask1 = GUICtrlCreateButton('Проверить', 88, 136, 65, 25, $WS_GROUP)

;----------------------- ОКНО 1 ЗАКОНЧИЛОСЬ ------------------------------------------

GUISetState(@SW_SHOW, $hParentWin)

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $iGoTask1
			If GUICtrlSendMsg($iParam1, $BM_GETCHECK, 0, 0) Then
				_Func1($hParentWin)
			ElseIf GUICtrlSendMsg($iParam2, $BM_GETCHECK, 0, 0) Then
				_Func2($hParentWin)
			Else
				MsgBox(64, 'Info', 'Необходимо выбрать один из параметров', 0, $hParentWin)
			EndIf
		Case $iCheckTask1
			MsgBox(64, 'Проверка', 'проверка связи', 0, $hParentWin)
	EndSwitch
WEnd


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; НАЧАЛО
Func _Func1($hParent = 0)
	Local $hChildWin = GUICreate('Test Param1', 200, 200, -1, -1, -1, -1, $hParent) ; Изменил название переменной
	Local $iButtonExit = GUICtrlCreateButton('Выход', 50, 75, 100, 50)
	GUISetState(@SW_SHOW, $hChildWin)

	While True
		Switch GUIGetMsg()
			Case $iButtonExit, $GUI_EVENT_CLOSE
				GUIDelete($hChildWin)
				ExitLoop ; Добавил выход из цикла, без которого скрипт зацикливался после закрытия дочерней формы
		EndSwitch
	WEnd

EndFunc   ;==>_Func1

Func _Func2($hParent = 0)
	Local $hChildWin = GUICreate('Test Param2', 200, 200, -1, -1, -1, -1, $hParent) ; Изменил название переменной
	Local $iButtonExit = GUICtrlCreateButton('Выход', 50, 75, 100, 50)
	GUISetState(@SW_SHOW, $hChildWin)

	While True
		Switch GUIGetMsg()
			Case $iButtonExit, $GUI_EVENT_CLOSE
				GUIDelete($hChildWin)
				ExitLoop ; Добавил выход из цикла, без которого скрипт зацикливался после закрытия дочерней формы
		EndSwitch
	WEnd

EndFunc   ;==>_Func2

; КОНЕЦ
Можно еще так сделать.
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

;----------------------- ОКНО 1 НАЧАЛОСЬ ------------------------------------------
$hParentWin = GUICreate('Планировщик', 1029, 698, -1, -1)
$iTask1 = GUICtrlCreateLabel('Задание 1', 8, 16, 70, 17)

$iLogin1 = GUICtrlCreateLabel('Login', 8, 48, 32, 17)
$iPassword1 = GUICtrlCreateLabel('Password', 8, 80, 21, 17)
$iLogin1_Input = GUICtrlCreateInput('', 48, 48, 105, 21)
$iPassword1_Input = GUICtrlCreateInput('', 48, 72, 105, 21)

$iParam1 = GUICtrlCreateRadio('Параметр1', 8, 112, 80, 15)
$iParam2 = GUICtrlCreateRadio('Параметр2', 90, 112, 80, 15)
$iGoTask1 = GUICtrlCreateButton('Выбрать', 8, 136, 65, 25, $WS_GROUP)
$iCheckTask1 = GUICtrlCreateButton('Проверить', 88, 136, 65, 25, $WS_GROUP)

;----------------------- ОКНО 1 ЗАКОНЧИЛОСЬ ------------------------------------------
_ShowHide($hParentWin)

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $iGoTask1
			If GUICtrlSendMsg($iParam1, $BM_GETCHECK, 0, 0) Then
				_Func1($hParentWin)
			ElseIf GUICtrlSendMsg($iParam2, $BM_GETCHECK, 0, 0) Then
				_Func2($hParentWin)
			Else
				MsgBox(64, 'Info', 'Необходимо выбрать один из параметров', 0, $hParentWin)
			EndIf
		Case $iCheckTask1
			MsgBox(64, 'Проверка', 'проверка связи', 0, $hParentWin)
	EndSwitch
WEnd


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; НАЧАЛО
Func _Func1($hParent)
	Local $hChildWin = GUICreate('Test Param1', 200, 200);, -1, -1, -1, -1, $hParent) ; Изменил название переменной
	Local $iButtonExit = GUICtrlCreateButton('Выход', 50, 75, 100, 50)
	_ShowHide($hChildWin, $hParent)
	While True
		Switch GUIGetMsg()
			Case $iButtonExit, $GUI_EVENT_CLOSE
				ExitLoop ; Добавил выход из цикла, без которого скрипт зацикливался после закрытия дочерней формы
		EndSwitch
	WEnd
	_ShowHide($hParent, $hChildWin, 1)
EndFunc   ;==>_Func1

Func _Func2($hParent)
	Local $hChildWin = GUICreate('Test Param2', 200, 200);, -1, -1, -1, -1, $hParent) ; Изменил название переменной
	Local $iButtonExit = GUICtrlCreateButton('Выход', 50, 75, 100, 50)
	_ShowHide($hChildWin, $hParent)
	While True
		Switch GUIGetMsg()
			Case $iButtonExit, $GUI_EVENT_CLOSE
				ExitLoop ; Добавил выход из цикла, без которого скрипт зацикливался после закрытия дочерней формы
		EndSwitch
	WEnd
	_ShowHide($hParent, $hChildWin, 1)
EndFunc   ;==>_Func2

Func _ShowHide($h_Show, $h_Hide = 0, $i_Del = 0)
	WinSetTrans($h_Show, '', 0)
	GUISetState(@SW_SHOW, $h_Show)
	For $i = 5 To 255 Step 5
		WinSetTrans($h_Show, '', $i)
		If $h_Hide Then WinSetTrans($h_Hide, '', 255 - $i)
		Sleep(10)
	Next
	If $h_Hide Then
		If $i_Del Then
			GUIDelete($h_Hide)
		Else
			GUISetState(@SW_HIDE, $h_Hide)
		EndIf
	EndIf
EndFunc   ;==>_ShowHide
 
Автор
fortages

fortages

Новичок
Сообщения
81
Репутация
3
Спасибо snoitaleR! Поняла на примере, когда использовать ExitLoop и почему все зацикливалось.

madmasles спасибо огромное! Родительские/дочерние окна это мой капитальный пробел. Кажется, по примеру теперь разберусь, как с ними работать. Из первого примера непонятен единственный момент. Почему в
Код:
$hChildWin = GUICreate('Test Param2', 200, 200, -1, -1, -1, -1, $hParent)

используется еще 4 параметра (-1), кроме самих размеров окна? Или это вопрос уже не для этой темы?
Второй пример очень красивый, спасибо)) Даже не знала, что так можно. Буду изучать новые функции. :IL_AutoIt_1:

Огромное спасибо за ответы, тема даже более чем решена! Вопросы, в которых "плавала", кажется, теперь тоже решились. Ура)))
sm19.gif
 
Автор
fortages

fortages

Новичок
Сообщения
81
Репутация
3
madmasles разобралась, спасибо) Извиняюсь за флуд. :-[
 
Верх