Что нового

[Элементы GUI] Не создается форма, после ввода ключа

obeyme

Новичок
Сообщения
71
Репутация
0
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Ключ", 264, 176, 192, 124)
$Input1 = GUICtrlCreateInput("Input1", 24, 64, 225, 21)
GUICtrlCreateLabel("", 40, 16, 4, 4)
$Label1 = GUICtrlCreateLabel("Введите ключ продукта", 24, 16, 147, 17)
$Button1 = GUICtrlCreateButton("ОК", 88, 112, 81, 41)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		 Case $Button1			
			$a = GUICtrlRead ($Input1)
			If $a = 'Y3' Then
			   MsgBox(0, 'Успех!', 'Ключ правильный!')
			   WinClose('Ключ')
			   $Form2 = GUICreate('Главное меню', 264, 176, 192, 124)
			Else
			   MsgBox(48, 'Ошибка!', 'Ключ не правильный')
			   Exit
			EndIf
	EndSwitch
WEnd


Не создается форма! ($Form2) Что делать? Что не так в коде?
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Код:
#include <StaticConstants.au3>
#include <WindowsConstants.au3>


$Form1 = GUICreate("Ключ", 264, 176, 192, 124)
$Input1 = GUICtrlCreateInput("Input1", 24, 64, 225, 21)
GUICtrlCreateLabel("", 40, 16, 4, 4)
$Label1 = GUICtrlCreateLabel("Введите ключ продукта", 24, 16, 147, 17)
$Button1 = GUICtrlCreateButton("ОК", 88, 112, 81, 41)
GUISetState(@SW_SHOW)

While 1
	Switch GUIGetMsg()
		Case -3
			Exit
		Case $Button1
			If GUICtrlRead($Input1) = 'Y3' Then
				GUISetState(@SW_HIDE, $Form1) ; скрываем Form1
				$Form2 = GUICreate('Главное меню', 264, 176, 192, 124)
				GUISetState(@SW_SHOW, $Form2) ; показываем Form2
				While 1
					Switch GUIGetMsg()
						Case -3 ; -3 это $GUI_EVENT_CLOSE
							GUISetState(@SW_HIDE, $Form2) ; скрываем Form2
							GUISetState(@SW_SHOW, $Form1) ; показываем Form1
							ExitLoop ; выходим из цикла
					EndSwitch
				Wend
			Else
				Exit
			EndIf
	EndSwitch
WEnd
 

mr.Gbabak

Осваивающий
Сообщения
257
Репутация
23
Дополню Viktor1703
Код:
While 1
    Switch GUIGetMsg()
        Case -3
            Exit
        Case $Button1
            If GUICtrlRead($Input1) = 'Y3' Then
                GUISetState(@SW_HIDE, $Form1)
				GUIDelete ($Form1); удаляет форму
                $Form2 = GUICreate('Главное меню', 264, 176, 192, 124)
                GUISetState(@SW_SHOW, $Form2)
                While 1
                    Switch GUIGetMsg()
                        Case -3
                            GUISetState(@SW_HIDE, $Form2)
                            GUISetState(@SW_SHOW, $Form1)
                            Exit ; после закрытия форм, скрипт закрывается
                    EndSwitch
                Wend
            Else
                Exit
            EndIf
    EndSwitch
WEnd
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
mr.Gbabak

В таком случае

Код:
While 1
    Switch GUIGetMsg()
        Case -3
            Exit
        Case $Button1
            If GUICtrlRead($Input1) = 'Y3' Then
                GUIDelete($Form1)
                $Form2 = GUICreate('Главное меню', 264, 176, 192, 124)
                GUISetState(@SW_SHOW, $Form2)
                While 1
                    Switch GUIGetMsg()
                        Case -3
                            Exit
                    EndSwitch
                Wend
            Else
                Exit
            EndIf
    EndSwitch
WEnd
 
Автор
O

obeyme

Новичок
Сообщения
71
Репутация
0
А можно поподробнее? Сделайте комментарии к каждой строке кода, пожалуйста.
Например, зачем это?
Код:
Case -3
GUISetState(@SW_SHOW, $Form2)
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Добавил комментарии в первом сообщении.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
obeyme [?]
Например, зачем это?
Функция
Код:
GUICreate()
только создаёт окно. Чтобы отобразить созданное окно нужно использовать
Код:
GUISetState(@SW_SHOW, $Form2)
Т.е. в вашем скрипте окно создано, но не отображено.
И ещё один момент. Первое созданное окно считается главным и при его закрытии скрипт завершает работу. Поэтому в вашем скрипте, даже если вы отобразите вторую форму, функция
Код:
WinClose('Ключ')
закроет главное окно и скрипт завершится. Чтобы этого избежать Viktor1703 и mr.Gbabak в своих примерах скрывают главное окно
Код:
GUISetState(@SW_HIDE, $Form1)


Но всё же, лучше первым создавать основное окно, но не отображать его (не вызывать GUISetState()). Потом создать и отобразить окно пароля, а по результатам уже либо завершать работу, либо закрывать (скрывать) окно пароля и отображать основное окно при помощи GUISetState(@SW_SHOW)
Подробнее про многооконный интерфейс можно узнать в справке:
http://autoit-script.ru/autoit3_docs/guiref/GUIRef_MessageLoopMode.htm
http://autoit-script.ru/autoit3_docs/guiref/GUIRef_OnEventMode.htm
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
InnI [?]
Но всё же, лучше первым создавать основное окно, но не отображать его (не вызывать GUISetState()). Потом создать и отобразить окно пароля, а по результатам уже либо завершать работу, либо закрывать (скрывать) окно пароля и отображать основное окно при помощи GUISetState(@SW_SHOW)
Я бы не создавал заранее окно, которое возможно не будет использоваться. Чтобы не городить GUI внутри GUI лучше делать через функцию. Отдельная функция создаёт GUI и возвращает "Добро" или "Не добро". Функция уничтожит переменные, а следом за ней если было "Добро", то создавать основной GUI.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
AZJIO [?]
Я бы не создавал заранее окно, которое возможно не будет использоваться.
Согласен. Если это окно настроек или что-то подобное. Но вероятность того, что главное окно не будет использоваться, мне кажется, очень низкая. Ключ обычно вводится один раз (пусть даже со второго-третьего запуска) и на долгое время. Но если нужно вводить какое-то подтверждение при каждом запуске... тут, конечно, есть смысл подумать о необходимости предварительного создания.
 
Автор
O

obeyme

Новичок
Сообщения
71
Репутация
0
Всем спасибо! Помогли разобраться! Только в моем коде нет цикла:
Код:
While 1
                    Switch GUIGetMsg()
                        Case -3
                            Exit
                    EndSwitch
                Wend


Но вроде все работает. Вот что получилось:
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
$Form1 = GUICreate("Ключ", 264, 176, 192, 124)
$Input1 = GUICtrlCreateInput("", 24, 64, 225, 21)
GUICtrlCreateLabel("", 40, 16, 4, 4)
$Label1 = GUICtrlCreateLabel("Введите ключ продукта", 24, 16, 147, 17)
$Button1 = GUICtrlCreateButton("ОК", 88, 112, 81, 41)
GUISetState(@SW_SHOW)
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		 Case $Button1			
			If GUICtrlRead ($Input1) = 'Y3' Then
			   MsgBox(0, 'Успех!', 'Ключ правильный!')
			   GUISetState(@SW_HIDE, $Form1)
			   $Form2 = GUICreate('Главное меню', 264, 176, 192, 124)
			   GUISetState(@SW_SHOW, $Form2)
			Else
			   MsgBox(48, 'Ошибка!', 'Ключ не правильный')
			   Exit
			EndIf
	EndSwitch
WEnd
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
obeyme

Код:
#include <GUIConstantsEx.au3>

$iValidKey = _KeyGUI()
If Not $iValidKey Then ; если код не верный, то
	MsgBox(48, 'Ошибка!', 'Ключ не правильный')
	Exit
EndIf
; Иначе делаем всё остальное
MsgBox(0, 'Успех!', 'Ключ правильный!')
; Здесь любой код который нужно выполнить при правильном коде

; Функция может быть в любом месте и её можно вызвать ещё раз
Func _KeyGUI()
	Local $hGui, $Input, $Button, $iValidKey = 0 ; Ответ
	$hGui = GUICreate("Ключ", 264, 176, 192, 124)
	$Input = GUICtrlCreateInput("", 24, 64, 225, 21)
	; GUICtrlCreateLabel("", 40, 16, 4, 4)
	GUICtrlCreateLabel("Введите ключ продукта", 24, 16, 147, 17)
	$Button = GUICtrlCreateButton("ОК", 88, 112, 81, 41)
	GUISetState()
	While 1
		Switch GUIGetMsg()
			Case $Button
				If GUICtrlRead($Input) = 'Y3' Then $iValidKey = 1
				ContinueCase
			Case $GUI_EVENT_CLOSE
				ExitLoop
		EndSwitch
	WEnd
	GUIDelete($hGui)
	Return $iValidKey
EndFunc   ;==>_KeyGUI
 
Автор
O

obeyme

Новичок
Сообщения
71
Репутация
0
В вашем примере все очень непонятно для меня. Самое главное что мой скрип работает :smile: :beer:
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
obeyme
В вашем скрипте непонятны строки
Код:
$Form2 = GUICreate('Главное меню', 264, 176, 192, 124)
               GUISetState(@SW_SHOW, $Form2)

Вы же не собираетесь строить основной GUI внутри второстепенного цикла? Или это муляж?

В вашем примере все очень непонятно для меня
вполне представляю. Если не понятен вызов через функции, то хотя бы стройте свой скрипт последовательно. Первая часть кода должна завершиться как единое целое, потом начаться вторая часть кода, а не внутри первого блока кода вставлять второй самостоятельный блок.
 
Автор
O

obeyme

Новичок
Сообщения
71
Репутация
0
Самое главное, что все работает


Добавлено:
Сообщение автоматически объединено:

Немного подредактировал:
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
$Form1 = GUICreate("Ключ", 264, 176, 192, 124)
$Input1 = GUICtrlCreateInput("", 24, 64, 225, 21)
GUICtrlCreateLabel("", 40, 16, 4, 4)
$Label1 = GUICtrlCreateLabel("Введите ключ продукта", 24, 16, 147, 17)
$Button1 = GUICtrlCreateButton("ОК", 88, 112, 81, 41)
GUISetState(@SW_SHOW)
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		 Case $Button1			
			If GUICtrlRead ($Input1) = 'Y3' Then
			   MsgBox(0, 'Успех!', 'Ключ правильный!')
			   GUIDelete($Form1)
			   $Form2 = GUICreate('Главное меню', 264, 176, 192, 124)
			   GUISetState(@SW_SHOW, $Form2)
			Else
			   MsgBox(48, 'Ошибка!', 'Ключ не правильный')
			   Exit
			EndIf
	EndSwitch
WEnd
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Всё-таки, что делают те две строчки? Восстанавливают ауру окна перед тем как удалить его? Чтобы типа корректно удалить окно?
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
obeyme

Мне интересно, в каком месте Вы будите обрабатывать контролы на втором окне?

Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
$Form1 = GUICreate("Ключ", 264, 176, 192, 124)
$Input1 = GUICtrlCreateInput("", 24, 64, 225, 21)
GUICtrlCreateLabel("", 40, 16, 4, 4)
$Label1 = GUICtrlCreateLabel("Введите ключ продукта", 24, 16, 147, 17)
$Button1 = GUICtrlCreateButton("ОК", 88, 112, 81, 41)
GUISetState(@SW_SHOW)
While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
         Case $Button1
            If GUICtrlRead ($Input1) = 'Y3' Then
               MsgBox(0, 'Успех!', 'Ключ правильный!')
               GUIDelete($Form1)
               $Form2 = GUICreate('Главное меню', 264, 176, 192, 124)
			   $iButton = GUICtrlCreateButton('test', 20, 20, 80, 20) ;~ кнопка, нажатие которой нужно обработать
               GUISetState(@SW_SHOW, $Form2)
            Else
               MsgBox(48, 'Ошибка!', 'Ключ не правильный')
               Exit
		   EndIf
    EndSwitch
WEnd
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Viktor1703 [?]
в каком месте Вы будите обрабатывать контролы на втором окне?
Да хотя бы и в главном цикле - форма ведь одна осталась.
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
Global $iButton = -1 ; предварительное объявление
$Form1 = GUICreate("Ключ", 264, 176, 192, 124)
$Input1 = GUICtrlCreateInput("", 24, 64, 225, 21)
GUICtrlCreateLabel("", 40, 16, 4, 4)
$Label1 = GUICtrlCreateLabel("Введите ключ продукта", 24, 16, 147, 17)
$Button1 = GUICtrlCreateButton("ОК", 88, 112, 81, 41)
GUISetState(@SW_SHOW)
While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button1
            If GUICtrlRead ($Input1) = 'Y3' Then
               MsgBox(0, 'Успех!', 'Ключ правильный!')
               GUIDelete($Form1)
               $Form2 = GUICreate('Главное меню', 264, 176, 192, 124)
               $iButton = GUICtrlCreateButton('test', 20, 20, 80, 20) ;~ кнопка, нажатие которой нужно обработать
               GUISetState(@SW_SHOW, $Form2)
            Else
               MsgBox(48, 'Ошибка!', 'Ключ не правильный')
               Exit
            EndIf
        Case $iButton ; обработка нажатия
            ConsoleWrite("click ")
    EndSwitch
WEnd
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Viktor1703 [?]
И вы считаете это правильным?
Нет. Но ведь это не запрещено.
Когда автор дойдёт до обработки контролов главного окна, я думаю он сам всё поймёт.
А пока у него всё работает :laugh:
 
Автор
O

obeyme

Новичок
Сообщения
71
Репутация
0
Понял свои ошибки. Программирование это как математика - наука точная :smile:
Так правильнее?
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
$Form1 = GUICreate("Ключ", 264, 176, 192, 124)
$Input1 = GUICtrlCreateInput("", 24, 64, 225, 21)
GUICtrlCreateLabel("", 40, 16, 4, 4)
$Label1 = GUICtrlCreateLabel("Введите ключ продукта", 24, 16, 147, 17)
$Button1 = GUICtrlCreateButton("ОК", 88, 112, 81, 41)
GUISetState(@SW_SHOW)
While 1
    Switch GUIGetMsg()
        Case -3
            Exit
        Case $Button1
            If GUICtrlRead($Input1) = 'Y3' Then
                MsgBox(0, 'Успех!', 'Ключ правильный!')
				GUIDelete($Form1)
                $Form2 = GUICreate('Главное меню', 264, 176, 192, 124)
                GUISetState(@SW_SHOW, $Form2)
                While 1
                    Switch GUIGetMsg()
						Case -3
                            Exit
                    EndSwitch
                Wend
            Else
                MsgBox(48, 'Ошибка!', 'Ключ не правильный!')
				Exit
            EndIf
    EndSwitch
WEnd
 
Верх