Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Объединение нескольких GUI в один файл au3 (http://forum.oszone.net/showthread.php?t=294490)

sLiDeR-X 26-01-2015 13:43 2461530

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

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

-TRM- 26-01-2015 18:59 2461739

sLiDeR-X, Вроде так...

sLiDeR-X 26-01-2015 19:49 2461765

-TRM-, спасибо за попытку, но это я пробовал в самый первый раз - не работает это. Я так понял происходит прерывание работы основного процесса. В общем, не катит.

madmasles 27-01-2015 13:00 2462090

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

sLiDeR-X 27-01-2015 15:04 2462181

Хочу, чтоб исполняемый файл был один (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 2462193

Цитата:

Цитата sLiDeR-X
мониторит файлы *.dat на USB »

Можно отслеживать подключение новых флешек (см. пример WM_DEVICECHANGE в русской справке), а не гонять цикл постоянно.
У Вас ищутся все файлы, в имени или расширении которых есть цифра. Какие возможны варианты этих файлов?

sLiDeR-X 27-01-2015 15:56 2462205

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

-TRM- 27-01-2015 17:13 2462242

Цитата:

Цитата sLiDeR-X
как скрипт из TabNumber.au3 включить в состав Dispatcher.au3 »

Ну так я же Вам с трёх файлов сделал один. Что не так ?!

sLiDeR-X 27-01-2015 17:37 2462250

-TRM-, а я ответил. Запусти и посмотри на ошибки.

-TRM- 27-01-2015 19:08 2462302

Вложений: 1
Цитата:

Цитата sLiDeR-X
Запусти и посмотри на ошибки. »

На какие ошибки ? Вот тебе он же, но скомпилированный...

sLiDeR-X 27-01-2015 19:17 2462307

-TRM-, твой скомпилированный работает.
Выложи au3 свой, пожалуйста.

-TRM- 28-01-2015 10:17 2462535

Вложений: 1
sLiDeR-X,
Цитата:

Цитата sLiDeR-X
-TRM-, твой скомпилированный работает.
Выложи au3 свой, пожалуйста. »


sLiDeR-X 28-01-2015 12:53 2462587

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

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

sLiDeR-X 30-01-2015 10:38 2463649

Если отбросить работу самой программы, то как сделать вот это (хочу понять сам принцип):
Поправьте код
Код:

#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 2463754

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

sLiDeR-X 30-01-2015 15:52 2463878

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



Время: 11:18.

Время: 11:18.
© OSzone.net 2001-