Что нового

[Ошибки] Обращение к @GUI_CTRLID приводит к вылету

rollex

Новичок
Сообщения
66
Репутация
1
У меня в коде обращение к @GUI_CTRLID приводит к вылету, хотя GUIOnEventMode включен.

Код:
Opt('GUIOnEventMode',       1)
Opt('TrayOnEventMode',      1)
Opt('TrayMenuMode',         3)
Opt('MustDeclareVars',      1)
Opt('TrayIconHide',         0)

#include <Constants.au3>
#include <GUIConstantsEx.au3>
#include <File.au3>
#include <Array.au3>

HotKeySet('+{ESC}', 'Terminate')

Global $fileReStart = "ReStart.exe"
Global $fileScanerToArhive = "ScanerToArhive.exe"
Global $pathIn = "C:\Сканер\"
Global $fileList = _FileListToArray($pathIn, "*", 1)
Global $fileListBefore = _FileListToArray($pathIn, "*", 1)
Global $dirSize = DirGetSize ($pathIn, 3)
Global $filesCountBefore = $dirSize[1]
Global $pathTo = "\\tmp\"
;~ Global $pathTo = "C:\tmp\"
Global $scanTitle = "EPSON Scan"
Global $winTitle = "СканерОк"
Global $userPath = "none"
Global $i, $resOld, $filesCountAfter, $lastFile, $trayShowOrHide, $res, $editBefore, $cTime, $filesCount, $lastFile, $btnShowOrHide, $arg, $fileListAfter, $temp, $mainWinHide = 0, $scanWinHide = 1

If WinExists($winTitle) Then
	WinSetState($winTitle, "", @SW_ENABLE)
	WinSetState($winTitle, "", @SW_SHOW)
	WinActivate($winTitle)
	Terminate()
EndIf
;################################################################################
$trayShowOrHide = TrayCreateItem("Скрыть")
	TrayItemSetOnEvent(-1, "ShowOrHideMain")

TrayCreateItem("")

TrayCreateItem("Сканировать")
	TrayItemSetOnEvent(-1, "Scaning")
TrayCreateItem("Архивировать")
	TrayItemSetOnEvent(-1, "ScanerToArhive")
TrayCreateItem("Перезапустить")
	TrayItemSetOnEvent(-1, "ReStart")

TrayCreateItem("")

TrayCreateItem("Выход")
	TrayItemSetOnEvent(-1, "Terminate")

TraySetOnEvent($TRAY_EVENT_PRIMARYDOWN, "ShowOrHideMain" )
TraySetOnEvent($TRAY_EVENT_PRIMARYDOUBLE, "ShowOrHideMain" )

TraySetIcon("icon.ico")
TraySetClick(16)

;################################################################################
GUICreate($winTitle, 450, 500)
;~     GUISetOnEvent($GUI_EVENT_CLOSE, 'Terminate')
	GUISetOnEvent($GUI_EVENT_CLOSE, 'ShowOrHideMain')
	GUISetOnEvent($GUI_EVENT_MINIMIZE, 'ShowOrHideMain')

GUICtrlCreateRadio('Шамтиев', 15+150, 15, 100, 20)
    GUICtrlSetOnEvent(-1, 'Terminate')
GUICtrlCreateRadio('Кудашова', 15+150, 35, 100, 20)
    GUICtrlSetOnEvent(-1, 'Terminate')
GUICtrlCreateRadio('Крамарь', 15+150, 55, 100, 20)
    GUICtrlSetOnEvent(-1, 'Terminate')
GUICtrlCreateRadio('Литвинчук', 15+150, 75, 100, 20)
    GUICtrlSetOnEvent(-1, 'Terminate')
GUICtrlCreateRadio('Ткаленко', 15+150, 95, 100, 20)
    GUICtrlSetOnEvent(-1, 'Terminate')
GUICtrlCreateRadio('Хвиль', 15+150, 115, 100, 20)
    GUICtrlSetOnEvent(-1, 'Terminate')

GUICtrlCreateLabel('Файлов в папке:', 15, 475, 90, 20)
Global $label = GUICtrlCreateLabel('*', 15+90, 475, 90, 20)


GUICtrlCreateButton('Скопировать один файл', 145+150, 15, 150, 25)
    GUICtrlSetOnEvent(-1, 'CopyFiles')

GUICtrlCreateButton('Скопировать два файла', 145+150, 15+25, 150, 25)
    GUICtrlSetOnEvent(-1, 'CopyFiles')

GUICtrlCreateButton('Скопировать три файла', 145+150, 15+25+25, 150, 25)
    GUICtrlSetOnEvent(-1, 'CopyFiles')

GUICtrlCreateButton('Скопировать четыре файла', 145+150, 15+25+25+25, 150, 25)
    GUICtrlSetOnEvent(-1, 'CopyFiles')

GUICtrlCreateButton('Скопировать пять файлов', 145+150, 15+25+25+25+25, 150, 25)
    GUICtrlSetOnEvent(-1, 'CopyFiles')

GUICtrlCreateButton('Сканировать', 15, 15, 120, 80)
    GUICtrlSetOnEvent(-1, 'Scaning')

GUICtrlCreateButton('Перезапустить', 15, 15+80, 100, 20)
    GUICtrlSetOnEvent(-1, 'ReStart')

GUICtrlCreateButton('П', 15+100, 15+80, 20, 20)
    GUICtrlSetOnEvent(-1, 'ReStart')

$btnShowOrHide = GUICtrlCreateButton('Скрыть/Показать', 15, 15+80+20, 120, 20)
    GUICtrlSetOnEvent(-1, 'ShowOrHide')

GUICtrlCreateButton('Архивировать файлы', 180, 465, 120, 25)
    GUICtrlSetOnEvent(-1, 'ScanerToArhive')

GUICtrlCreateButton('В трей', 345, 465, 100, 25)
;~     GUICtrlSetOnEvent(-1, 'Terminate')
		GUICtrlSetOnEvent(-1, 'ShowOrHideMain')

Global $edit = GUICtrlCreateEdit('', 15, 165, 450-30, 300-15)

GUISetState()

If Not ProcessExists("escndv.exe") Then
	ReStart()
EndIf

While 1
	ScanPath()
	GUICtrlSetData($label, $filesCount & " (" & Round($dirSize[0] / 1024) & " KB)")
    Sleep(1000)
WEnd


;################################################################################
Func CopyFiles()
	$fileList = _FileListToArray($pathIn, "*", 1)
	$i = $fileList[0]
	$lastFile = $fileList[$i]
	Switch @GUI_CTRLID
		Case 11
			FileCopyToUserPath($userPath)
		Case 12
			FileCopyToUserPath($userPath)
			FileCopyToUserPath($userPath)
		Case 13
			FileCopyToUserPath($userPath)
			FileCopyToUserPath($userPath)
			FileCopyToUserPath($userPath)
		Case 14
			FileCopyToUserPath($userPath)
			FileCopyToUserPath($userPath)
			FileCopyToUserPath($userPath)
			FileCopyToUserPath($userPath)
		Case 15
			FileCopyToUserPath($userPath)
			FileCopyToUserPath($userPath)
			FileCopyToUserPath($userPath)
			FileCopyToUserPath($userPath)
			FileCopyToUserPath($userPath)
		Case Else
			$res = "  Ошибка индекса контрола."&@CRLF
			Logging()
	EndSwitch
EndFunc

;################################################################################
Func FileCopyToUserPath($arg)
	$fileList = _FileListToArray($pathIn, "*", 1)
	If FileExists($pathIn&$lastFile) Then
		If $userPath <> "none" Then
			$res = FileCopy($pathIn&$lastFile, $pathTo&$arg)
			ConsoleWriteError($res)
			If $res == 1 Then
				$res = "  Копирование '"&$lastFile&"' в '"&$pathTo&$userPath&"' завершено."&@CRLF
			Else
				$res = "  Копирование '"&$lastFile&"' в '"&$pathTo&$userPath&"' не удалось."&@CRLF
			EndIf
			$i = $i - 1
			Logging()
			$lastFile = $fileList[$i]
		Else
			$res = "  Необходимо указать папку пользователя."&@CRLF
			Logging()
		EndIf
	EndIf
EndFunc

Func ScanPath()
	$dirSize = DirGetSize($pathIn, 3)
	$filesCount = $dirSize[1]
	$filesCountAfter = $dirSize[1]
	If $filesCountAfter > $filesCountBefore Then
		$fileList = _FileListToArray($pathIn, "*", 1)
		$res = "  Новый файл: '"&$fileList[$filesCountAfter]&"'."&@CRLF
		Logging()
		$filesCountBefore = $dirSize[1]
	EndIf
EndFunc

Func Logging()
	$cTime = @HOUR&":"&@MIN&":"&@SEC&" "
	$editBefore = GUICtrlRead($edit)
;~ 	If $resOld <> $res Then
		GUICtrlSetData($edit, $cTime&$res&@CRLF&$editBefore&" ")
;~ 	EndIf
	If $mainWinHide == 1 Then
		TrayTip("", $res, 5)
	EndIf
;~ 	$resOld = $res
EndFunc

Func Scaning()
	$filesCountBefore = $dirSize[1]
	If WinExists("Ход работы") Then
		$res = "  Сканирование уже идет..."&@CRLF
	Else
		If Not ProcessExists($fileReStart) Then
			ControlClick($scanTitle, "", "[CLASS:Button; INSTANCE:22]", "left", 1)
			$res = "  Попытка сканирования..."&@CRLF
		Else
			$res = "  Обработчик не запущен."&@CRLF
		EndIf
	EndIf
	Logging()
EndFunc

Func ReStart()
	$filesCountBefore = $dirSize[1]
	If ProcessExists("escndv.exe") Then
		ConsoleWrite(@GUI_CTRLID)
		If WinExists("Ход работы") Then
			$res = "  Перезапуск отменен, идет сканирование."&@CRLF
		Else
			If Not ProcessExists($fileReStart) Then
				Run($fileReStart)
				$res = "  Перезапуск обработчика..."&@CRLF
			EndIf
		EndIf
	Else
		If WinExists("Ход работы") Then
			$res = "  Запуск отменен. Идет сканирование..."&@CRLF
		Else
			If Not ProcessExists($fileReStart) Then
				Run($fileReStart)
				$res = "  Запуск обработчика..."&@CRLF
			EndIf
		EndIf
	EndIf
MsgBox(1, @GUI_CTRLID, @GUI_CTRLID)
	If @GUI_CTRLID == 18 Then
		ProcessClose("escndv.exe")
		Run($fileReStart)
		$res = "  Принудительный перезапуск обработчика..."&@CRLF
	EndIf
	Logging()
EndFunc

Func ScanerToArhive()
	If Not ProcessExists($fileScanerToArhive) Then
		Run($fileScanerToArhive)
		$res = "  Архивация файлов..."&@CRLF
	EndIf
	Logging()
	$filesCountBefore = $dirSize[1]
EndFunc

Func ShowOrHide()
	If $scanWinHide == 0 Then
		WinSetState($scanTitle, "", @SW_DISABLE)
		WinSetState($scanTitle, "", @SW_HIDE)
		GUICtrlSetData($btnShowOrHide, 'Показать')
		$scanWinHide = 1
	Else
		WinSetState($scanTitle, "", @SW_ENABLE)
		WinSetState($scanTitle, "", @SW_SHOW)
		WinActivate($scanTitle)
		GUICtrlSetData($btnShowOrHide, 'Скрыть')
		$scanWinHide = 0
	EndIf
EndFunc

Func ShowOrHideMain()
	If $mainWinHide == 0 Then
		WinSetState($winTitle, "", @SW_DISABLE)
		WinSetState($winTitle, "", @SW_HIDE)
		TrayItemSetText($trayShowOrHide, 'Показать')
		$mainWinHide = 1
	Else
		WinSetState($winTitle, "", @SW_ENABLE)
		WinSetState($winTitle, "", @SW_SHOW)
		WinActivate($winTitle)
		TrayItemSetText($trayShowOrHide, 'Скрыть')
		$mainWinHide = 0
	EndIf
EndFunc

Func Ops()
	MsgBox(0, "Внимание", "Не нужно закрывать это окно. Достаточно свернуть его.", 10)
EndFunc
;################################################################################
Func Terminate()
    Exit
EndFunc
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Читай внимательнее справку. @GUI_CTRLID определена только для GUI, для Tray используй @TRAY_ID.
 
Автор
R

rollex

Новичок
Сообщения
66
Репутация
1
Yashied
Так я и отлавливаю состояние элементов окна, а не трея. Или где-то ошибка?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Код:
GUICtrlSetOnEvent(-1, 'ReStart')


Код:
TrayItemSetOnEvent(-1, "ReStart")


Код:
If Not ProcessExists("escndv.exe") Then
    ReStart()
EndIf


В последних двух случаях будет ошибка, т.к. @GUI_CTRLID не будет определен.
 
Автор
R

rollex

Новичок
Сообщения
66
Репутация
1
Yashied
А как явно определить в начале кода @GUI_CTRLID, чтобы при обращении к нему скрипт не вылетал?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,487
rollex [?]
как явно определить в начале кода @GUI_CTRLID, чтобы при обращении к нему скрипт не вылетал?
Если грубо, тогда так:
Код:
$GUI_CTRLID = Execute('@GUI_CTRLID')

а если нет, то можно так:

Код:
GUICtrlSetOnEvent(-1, 'Event')
Event(1)

Func Event($vParam)
    $GUI_CTRLID = ''
    If IsDeclared('vParam') Then $GUI_CTRLID = @GUI_CTRLID
EndFunc
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
rollex сказал(а):
А как явно определить в начале кода @GUI_CTRLID, чтобы при обращении к нему скрипт не вылетал?

Это не переменная, а макрос, т.е. вычисляется в момент обращения. Для того, чтобы скрипт не вылетал, нужно разделить функции для GUI и Tray.
 
Верх