Что нового

Почему не закрывается окно

winkot

Новичок
Сообщения
169
Репутация
0
Почему не закрывается окно?

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

While 1
    Test()
    Sleep(3000)
WEnd

Func Test()
    $Form1 = GUICreate("Test", 214, 159, 192, 124)
    $Button1 = GUICtrlCreateButton("Button1", 72, 104, 97, 25)
    GUISetState(@SW_SHOW)
    While 1
        $Msg = GUIGetMsg()
        Switch $Msg
            Case $GUI_EVENT_CLOSE
                Return
            Case $Button1
                WinClose("Test")
        EndSwitch
    WEnd
EndFunc   ;==>Test
 
Автор
W

winkot

Новичок
Сообщения
169
Репутация
0
А почему же такой вариант работает?
Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>


    Test()
    Sleep(3000)


Func Test()
    $Form1 = GUICreate("Test", 214, 159, 192, 124)
    $Button1 = GUICtrlCreateButton("Button1", 72, 104, 97, 25)
    GUISetState(@SW_SHOW)
    While 1
        $Msg = GUIGetMsg()
        Switch $Msg
            Case $GUI_EVENT_CLOSE
                Return
            Case $Button1
                WinClose("Test")
        EndSwitch
    WEnd
EndFunc   ;==>Test


Каким образом внешний While 1 ... WEnd влияет на закрытие окна?
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Без цикла возврат из функции приводит к завершению скрипта. А при завершении скрипта автоматически закрываются все окна.
 

Oki

Продвинутый
Сообщения
452
Репутация
62
В хорошо написанном коде вызов функции GUIDelete() должен присутствовать даже тогда, когда окно само собой закроется. Это как с закрытием файла для чтения в конце его обработки: хотя файл и сам закроется после окончания работы программы/скрипта, но хороший стиль написания кода требует сделать это самостоятельно. В данном случае правильнее всего вот так.
Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

While 1
    Test()
    Sleep(3000)
Wend

Func Test()
    $Form1 = GUICreate("Test", 214, 159, 192, 124)
    $Button1 = GUICtrlCreateButton("Button1", 72, 104, 97, 25)
    GUISetState(@SW_SHOW)
    Do
        $Msg = GUIGetMsg()
        If $Msg = $Button1 Then
            WinClose("Test")
        EndIf
    Until $Msg = $GUI_EVENT_CLOSE
    GUIDelete()
EndFunc   ;==>Test
 
Последнее редактирование:
Автор
W

winkot

Новичок
Сообщения
169
Репутация
0
Как то странно... И WinClose закрывает окно и GUIDelete(). В чем же у них разница?
А GUIDelete() работает только в функциях или в обычном коде тоже?
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
GUIDelete удаляет своё окно - созданное скриптом. WinClose закрывает чужое окно. Естественно, может закрыть и своё, но как-бы "снаружи", как чужое.
 

Oki

Продвинутый
Сообщения
452
Репутация
62
А GUIDelete() работает только в функциях или в обычном коде тоже?
В случае сомнений и для лучшей читабельности кода эту функцию лучше всего вызывать с параметром, то есть указывать дескриптор. Тогда будет неважно, откуда функция вызвана. В данном случае вот так.
Код:
GUIDelete($Form1)
Иногда для удобства можно переключать "рабочее" окно функцией GUISwitch().
Код:
GUISwitch($Form1)
GUIDelete() ; Теперь функция сработает с нужным дескриптором вне зависимости от истории предыдущих дествий, равно как и любые следующие действия по потребности.
 
Последнее редактирование:
Верх