Войти

Показать полную графическую версию : [решено] Объединение нескольких GUI в один файл au3


sLiDeR-X
26-01-2015, 13:43
Привет, ребята. Прошу вашей помощи.
Раньше делал скрипты только на cmd/bat. Решил попробовать AutoIt.
Получилось за неделю кое-что накалякать. То, что получилось собрать на коленке прикрепил.
Основной файл - Dispatcher.au3 - работает в фоне (трее) и ждет особых файлов на съемных носителях, потом выполняет определенные действия.
Есть еще 2 файла, отвечающие каждый за определенные действия, не связанные с основным файлом.

Вот, что не получается - как это все объединить в один файл?
Надеюсь на вашу отзывчивость.

-TRM-
26-01-2015, 18:59
sLiDeR-X, Вроде так...

sLiDeR-X
26-01-2015, 19:49
-TRM-, спасибо за попытку, но это я пробовал в самый первый раз - не работает это. Я так понял происходит прерывание работы основного процесса. В общем, не катит.

madmasles
27-01-2015, 13:00
sLiDeR-X,
ИМХО, будет лучше, если Вы напишите что Вы в итоге хотите получить (чем подробнее, тем лучше).

sLiDeR-X
27-01-2015, 15:04
Хочу, чтоб исполняемый файл был один (Dispatcher.au3).

Программа (Dispatcher.au3) висит в трее и мониторит файлы *.dat на USB до тех пор, пока ее принудительно не закроют. При обнаружении таких файлов копирует их себе в папку и затем отправляет на фтп.

Управление программой происходит из меню в трее. Там же есть пункт "Запись табельного номера". По клику на этот пункт должно появиться GUI окно с функцией создания файла табельного номера, введенного вручную. Смог реализовать это только запуском отдельного au3 файла (TabNumber.au3) по меню в трее. То есть это как отдельный процесс. Вопрос в том, как скрипт из TabNumber.au3 включить в состав Dispatcher.au3 и чтоб это все работало только из Dispatcher.au3. Т.е. программа работает в штатном режиме, пользователь выбрал в меню "Запись табельного", программа приостановилась, открыла GUI на ввод табельного, пользователь ввел, закрыл GUI, и программа продолжила свою работу дальше. Аналогично и с файлом Registration.au3.

Сейчас все работает, но работают 3 скрипта вместо одного желаемого.
Думаю понятно объяснил.

По сути, я не могу понять как можно в одном скрипте работать с совершенно разными по функционалу GUI окнами.

Архив в шапке перезалил.

madmasles
27-01-2015, 15:33
мониторит файлы *.dat на USB »Можно отслеживать подключение новых флешек (см. пример WM_DEVICECHANGE в русской справке), а не гонять цикл постоянно.
У Вас ищутся все файлы, в имени или расширении которых есть цифра. Какие возможны варианты этих файлов?

sLiDeR-X
27-01-2015, 15:56
madmasles, цифра в имени всегда есть. А еще может быть файл mash.dat, в котором записан табельный номер, но он не должен участвовать в процессе копирования. Использовать программу будут на специальных местах, где подключение иных съемных носителей, маловероятна. Поэтому сделал поиск именно таким способом.
WM_DEVICECHANGE не учитывает смену карты памяти. А специфика использования данной программы подразумевает обработку в основном именно карт памяти типа ММС/SD. Поэтому поставил таймаут 3 секунды на опрос.

-TRM-
27-01-2015, 17:13
как скрипт из TabNumber.au3 включить в состав Dispatcher.au3 »
Ну так я же Вам с трёх файлов сделал один. Что не так ?!

sLiDeR-X
27-01-2015, 17:37
-TRM-, а я ответил. Запусти и посмотри на ошибки.

-TRM-
27-01-2015, 19:08
Запусти и посмотри на ошибки. »
На какие ошибки ? Вот тебе он же, но скомпилированный...

sLiDeR-X
27-01-2015, 19:17
-TRM-, твой скомпилированный работает.
Выложи au3 свой, пожалуйста.

-TRM-
28-01-2015, 10:17
sLiDeR-X, -TRM-, твой скомпилированный работает.
Выложи au3 свой, пожалуйста. »

sLiDeR-X
28-01-2015, 12:53
-TRM-, ты сделал на первых выложенных файлах. В шапке сейчас другие уже. Там GUI окна работают по ключу Opt("GUIOnEventMode", 1).
Сделал по аналогии, как сделал ты - у меня ошибки появляются, программа работает не корректно. Я так понял загвоздка именно из-за GUIOnEventMode=1.

Вот как сделал я:

sLiDeR-X
30-01-2015, 10:38
Если отбросить работу самой программы, то как сделать вот это (хочу понять сам принцип):
Поправьте код
#include <WindowsConstants.au3> ;Стиль окон GUI
#include <GUIConstantsEx.au3> ;Раширенный стили GUI

TraySetToolTip('Название')
Opt("TrayMenuMode", 1 + 2)
Opt("TrayOnEventMode", 1)
TraySetState(1)

$iRegistration = TrayCreateItem('Регистрация программы')
TrayItemSetOnEvent(-1, "_Registration")
$iExit = TrayCreateItem('Выход')
TrayItemSetOnEvent(-1, '_Quit')


;Программа запущена в трее и выполняет _SomeFunc() раз в 3 секунды
While 1
_SomeFunc()
Sleep(3000)
WEnd



Func _SomeFunc()
;Основная работа программы
ConsoleWrite('Основной цикл' & @LF)
EndFunc

;Функция вызова GUI окна. После отработки должно исчезнуть, а программа должна продолжить работать по основному циклу.
Func _Registration()
Opt("GUIOnEventMode", 1)
$hGui = GUICreate('Регистрация программы', 370, 225)
GUISetOnEvent($GUI_EVENT_CLOSE, "_CLOSEClicked")
$BtnOk = GUICtrlCreateButton("ОК", 250, 190, 100, 25)
GUICtrlSetOnEvent($BtnOk, "_OKButton")

GUISetState()

While 1
Sleep(1000)
WEnd
EndFunc


Func _CLOSEClicked()
If @GUI_WinHandle = $hGui Then
;Закрыть окно и продолжить основной цикл
EndIf
EndFunc

Func _OKButton()
MsgBox(4096 + 64, '', 'Регистрация произведена!')
;Выполнить некоторые операции, закрыть окно и продолжить основной цикл
EndFunc

Func _Quit()
Exit
EndFunc

madmasles
30-01-2015, 13:12
sLiDeR-X,
ИМХО, нет смысла дублировать темы на разных форумах. Я начинаю путаться, где Вам отвечать. :)

sLiDeR-X
30-01-2015, 15:52
madmasles, благодарю за помощь!
Хотя я уже сделал немного по другому - обошелся без GUIOnEventMode=1 и сделал через While и GUIGetMsg

Вот ответ на мой вопрос:
#NoTrayIcon

#include <WindowsConstants.au3> ;Стиль окон GUI
#include <GUIConstantsEx.au3> ;Раширенный стили GUI

Opt("TrayMenuMode", 1 + 2)
Opt("TrayOnEventMode", 1)
Opt("GUIOnEventMode", 1)

TrayCreateItem('Регистрация программы')
TrayItemSetOnEvent(-1, "_Registration")
TrayCreateItem('Выход')
TrayItemSetOnEvent(-1, '_Quit')
TraySetToolTip('Название')
TraySetState(1)


;Программа запущена в трее и выполняет _SomeFunc() раз в 3 секунды
While 1
_SomeFunc()
Sleep(3000)
WEnd

Func _SomeFunc()
;Основная работа программы
Sleep(500)
ConsoleWrite('Основной цикл' & @LF)
EndFunc ;==>_SomeFunc

;Функция вызова GUI окна. После отработки должно исчезнуть, а программа должна продолжить работать по основному циклу.
Func _Registration()
GUICreate('Регистрация программы', 370, 225)
GUISetOnEvent($GUI_EVENT_CLOSE, "_CLOSEClicked")
GUICtrlCreateButton("ОК", 250, 190, 100, 25)
GUICtrlSetOnEvent(-1, "_OKButton")
GUISetState()
EndFunc ;==>_Registration

Func _CLOSEClicked()
GUIDelete(@GUI_WinHandle)
EndFunc ;==>_CLOSEClicked

Func _OKButton()
MsgBox(4096 + 64, '', 'Регистрация произведена!', 0, @GUI_WinHandle)
;Выполнить некоторые операции, закрыть окно и продолжить основной цикл
EndFunc ;==>_OKButton

Func _Quit()
Exit
EndFunc ;==>_Quit




© OSzone.net 2001-2012