Перейти из форума на сайт.


Система IP-видеонаблюдения "Линия". Скачать бесплатную демо-версию для 16 камер. НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Программы » AutoIT (Часть 2)

Модерирует : gyra, Maz

Widok (01-06-2010 13:08): Лимит страниц. Продолжаем здесь.  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166

   

Widok



Moderator-Следопыт
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

AutoIt3
(Часть 1)

 
 
Домашняя страница: http://www.autoitscript.com
Страница загрузки: http://www.autoitscript.com/autoit3/downloads.php
 
Описание:

Цитата:
AutoIt v3 - это язык для написания сценариев, напоминающий BASIC. Основным его назначением является автоматизация работ с Windows GUI (графическим интерфейсом пользователя MS Windows). Для выполнения этой сложной задачи предоставляется комбинация испытанных методов, включающих в себя эмуляцию нажатий комбинаций клавиш клавиатуры, перемещения указателя мыши, управление окнами и их визуальными элементами. Как показывает практика, эти "приводные ремни" весьма эффективны для получения работающих решений в ситуациях, когда другие стандартные средства (например, VBScript и SendKeys) оказываются бессильны.
Умеет он очень и очень многое! Бесплатный.

 
Помощь по AutoIT:
  • Справку на русском (и не только) вы всегда(?) сможете найти тут
  • Учебник по AutoIt для начинающих
  • Видео-руководства на YouTube (англ.)
  • AutoIt v3: Your Quick Guide (652 КБ) - Ваш быстрый гид в мир AutoIt-а (книга в формате pdf) - Та же книжка online.
  • Справочник по командам rundll32
  • Справка WinAPI (Win 32 API по шагам)
  • Русский справочник по API-функциям
  • Полезная информация по WinAPI на русском
  • Помощь по регулярным выражениям
  • Tutorial on DllCall() & DllStructs - Небольшое (пока?) руководство по использованию функции DllCall*()
     
     
    Ресурсы, посвящённые AutoIt
  • AutoIt в Википедии
  • AutoIt Russian Community - Русское сообщество AutoIt
  • Jabber-конференция для обсуждения мелких вопросов касающихся AutoIt
  • Обзор скриптового языка AutoIt (рус.)
  • AutoIt на Yahoo! Groups
  • Раздел в конфиренции OSzone.net, посвящённый AutoIt
  • Пополняющийся со временем сайт с полезными утилитами и функциями на AutoIt
  • Коллекция AutoIt-скриптов от Sanja Alone
  • Коллекция AutoIt-скриптов от MSFN (могут быть устаревшие).
  • Коллекция AutoIt-скриптов от AZJIO
     
     
    !!! Полезные советы и заметки - новичкам и не только
     
     
  • Рекомендации по написанию скриптов
     
     
    Инструменты для AutoIt:
  • AutoIt Path Switcher - Переключение пути к папке AutoIt.
  • AutoIt3Wrapper [Страница закачки] - Программа для компиляции скрипта с дополнительными возможностями (добавление значка, описания и т.п).
  • Koda (724 Kb) - Визуализация работы с GUI - аналог Visual Basic.
  • CodeWizard (400 Kb) - нечто простенькое на вариант Koda.
  • AutoItMacroGenerator (34 Kb) - Записывает в реальном времени действия пользователя в AutoIt-код.
  • ScriptWriter (78 Kb) - Аналог AutoItMacroGenerator.
  • API Constants (1042 Kb) - Утилита для просмотра всех констант API-функции и не только.
  • Страница закачки утилит, которые идут в отдельной поставке редактора SciTE.
  • AutoIt-меню для браузера Opera.
     
    Готовые скрипты и программы с открытым кодом на AutoIt:
  • Desktop Icons Restorator - Скрипт-программа для сохранения/восстановления позиции значков рабочего стола.
  • CaptureIt - Утилита для захвата изображений с экрана.
  • SwitchIt - Скрипт для конвертирования выделенного текста.
  • Скрипт раскраски кода AutoIt для публикации в форумах
     
    Общие вопросы и решения на Autoit:
  • Обработчик скриптов добавляющий отладчик (debugger) - Последняя версия: AutoItScript Add Debugger
  • Интеракция между несколькими скриптами
  • Пример использование интеракции между скриптами - Добавление элементов GUI с внешнего модуля
  • Чтение и запись данных с/в окна/о SciTE
  • Пример автообновления версии своего приложения
  • Копирование большого файла с отображением данных прогресса
  • Создание динамического меню в Tray Icon (значок в области уведомлений)
  • Пример создания своего мастера (Wizard)
  • Метод, позволяющий запускать код VBS без создания временных файлов
  • Описание функции GUIRegisterMsg()
  • Пример перехвата вводимых символов с клавиатуры
  • Пример деактивирования TabItem
  • Пример вывода лога в Edit-поле (с поддержкой форматирования текста)
  • Пример остановки/начало выполнения скрипта + Слежение за буфером обмена с заменой неподдерживаемых в имени файла символов
  • Подключение приложения (GUI) к буферу обмена
  • Пример использования меню с значками (ModernMenu.au3) -> Список программ в меню значка в системном трее
  • Пример подсчёта интервала времени между нажатиями клавиш
  • Слежение нажатых элементов в текущем окне (под курсором)
  • Написание instant messaging Бота на AutoIt
  • Способ, позволяющий посылать нажатие клавиши в неактивное окно (не путать со свёрнутым)
  • Сервер <=> Клиент - Пример передачи файла
  • Пример отображения только элементов GUI (без самой оболочки)
  • Модуль, превращающий ваше приложение в Trial-версию
  • Слежение за выделенным текстом и с последующим его помещением в файл
     
    Отдельные функции и библиотеки (UDF):
  • Функции, относящиеся к интернету
  • Функции для работы с процессами и окнами
  • Функции для работы с файлами
  • Функции для GUI/Tray
  • Системные функции
  • Разное (то, что не подпадает под другие категории)
     


     
    За шапкой следит ViSiToR  

  • Всего записей: 24190 | Зарегистр. 07-04-2002 | Отправлено: 14:47 12-01-2009 | Исправлено: Maz, 11:50 17-04-2017
    wellic

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    То что я зык скриптовый, тут даже нет сомнений. Например, Perl тоже скриптовый язык, хотя его можно завернуть в exe оболочку. Даже батники можно завернуть в exe оболочку, но от этого они программой не становятся. Это просто грубо говоря в одном флаконе проигрыватель и код.
     
    AutoIT скриптовый, так как его скрипт просто крутиться виртуальной машинкой для P-кода.
     
    А все языки процедурные, которые привел в пример sproxy я знаю и пишу/писал на них. А процедруный или структурный язык называется не потому, что код выполняется пошагово, а потому, что базовой единицей является процедура или функция.
     
    Самым классическим языком структурным, и первым, который был - это Фортран. Который заменил собой в свое время ассемблер. Вот там и появились класиические циклы и процедуры И даже такой оператор как COMMON, аналог absolute в паскале, или union в С. Я писал и на фортране. Очень тяжело перестроиться со структурного на ООП стиль программирования. По разному мозги должны быть устроены.
     
    А вот то, что в AutoIT нет возможности ограничивать нормально область вилимости переменный в разрезе нескольких модулей - это плохо. Я думал, что я хелп не дочитал, а оказывается, что так оно и есть.  
     
     
    Добавлено:
    PS: А за консультации и советы, вем откликнувшимся ОГРОМНОЕ СПАСИБО!!!
    Я тоже сторонник помогать другим на форумах бесплатно, а деньги зарабатывать нужно на работе Либо просто быстрее работать. Вот для этого и нужен AUTOIT, чтобы работать быстрее.
     
    Добавлено:
    to sproxy В примере? который ты дал есть одно слабое место

    Код:
    Global $hGUI_1, $hGUI_2, $hGUI_3  
    Global $nGUI_1_Button, $nGUI_2_Checkbox, $nGUI_3_Button, $nGUI_3_Input
     
     
    У меня в моей проге этих переменных несколько сотен. Это пременные, которые отвечают за разные чекбоксы, кнопочки галочки. И нужны они только тогда, когда конкретная форма работает и то, только для этой формы. Вот потому и возник вопрос. Как организовать серьезный проект без особого использования  глобальных переменных. А для этого каждая форма должна жить, как бы своей жизнью.
     
    Я вижу, что в на данный момент, в автоит сейчас такого сделать невозможно, или достаточно не удобно, т.к. это к сожалению не полноценный язык. Перл когда-то тоже был таким скриптовым языком, для ускорения написания административных задач. Зато сейчас он полноценный интерпретируемый язык.
     

    Всего записей: 339 | Зарегистр. 06-05-2002 | Отправлено: 10:02 16-04-2009
    wellic

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Вот подправленый код sproxy
    Но хотелось бы посмотреть чей-то код, где одновременно используется режимы и OnEvent и MessageLoop. А вообще, возможно ли одновременно использование 2-х режимов.
     
    А есть ли у кого хорошая расскраска для Colorer и Fara под AutoIT. Я конечно процентов 80 работаю в SciTE, но поиск и замена с помощью регекспов лучше в фаре. Да еще всякие мелочи. Я для себя сделал под солорер, но мне самому не нравиться
     

    Код:
    #include <GuiConstantsEx.au3>
     
    Global $hGUI_1, $hGUI_2, $hGUI_3
    Global $nGUI_1_Button, $nGUI_2_Checkbox, $nGUI_3_Button, $nGUI_3_Input
     
    Opt("TrayMenuMode", 1)
    Opt("TrayOnEventMode", 1)
    Opt("GUIOnEventMode", 0)
    TraySetClick(16)
     
    $Func_1_TrayItem = TrayCreateItem("Функция №1")
    TrayItemSetOnEvent(-1, "_GUICreate_Func_1")
    $Func_2_TrayItem = TrayCreateItem("Функция №2")
    TrayItemSetOnEvent(-1, "_GUICreate_Func_2")
    $Func_3_TrayItem = TrayCreateItem("Функция №3")
    TrayItemSetOnEvent(-1, "_GUICreate_Func_3")
    TrayCreateItem("")
     
    $Exit_TrayItem = TrayCreateItem("Exit")
    TrayItemSetOnEvent(-1, "_exit")
     
    While 1
      $nmsg = GUIGetMsg(1)
      If $nmsg[0] == 0 Then ContinueLoop
     
      Switch
    $nmsg[0]
        Case $GUI_EVENT_CLOSE
          GUISetState(@SW_HIDE, $nmsg[1])
          ToolTip("")
        Case $nGUI_1_Button
          ToolTip("Вы нажали Кнопку.", -1, -1, "Инфо", 1)
        Case $nGUI_2_Checkbox
          Local $sCheckbox_Data = "Вы сняли отметку с галочки."
          If GUICtrlRead($nGUI_2_Checkbox) = $GUI_CHECKED Then $sCheckbox_Data = "Вы поставили отметку на галочке."
          ToolTip($sCheckbox_Data, -1, -1, "Инфо", 1)
        Case $nGUI_3_Button
          ToolTip("Вы ввели: " & GUICtrlRead($nGUI_3_Input), -1, -1, "Инфо", 1)
     
      EndSwitch
    WEnd
     
    Func
    _GUICreate_Func_1()
      ToolTip("")
      $hGUI_1 = GUICreate("Функция №1", 300, 120, 350, 150)
      $nGUI_1_Button = GUICtrlCreateButton("Кнопка", 20, 40, 60, 20)
      GUISetState(@SW_SHOW)
    EndFunc   ;==>_GUICreate_Func_1
     
    Func _GUICreate_Func_2()
      ToolTip("")
      $hGUI_2 = GUICreate("Функция №2", 300, 120, 350, 300)
      $nGUI_2_Checkbox = GUICtrlCreateCheckbox("Галочка", 20, 40, 60, 20)
      GUISetState(@SW_SHOW)
    EndFunc   ;==>_GUICreate_Func_2
     
    Func _GUICreate_Func_3()
      ToolTip("")
      $hGUI_3 = GUICreate("Функция №3", 300, 120, 350, 450)
      $nGUI_3_Input = GUICtrlCreateInput("Строка", 20, 10, 260, 20)
      $nGUI_3_Button = GUICtrlCreateButton("Показать ввод", 20, 40, 120, 20)
      GUISetState(@SW_SHOW)
    EndFunc   ;==>_GUICreate_Func_3
     
    Func _exit()
      Exit
    EndFunc
      ;==>_exit


    Всего записей: 339 | Зарегистр. 06-05-2002 | Отправлено: 12:04 16-04-2009 | Исправлено: wellic, 12:33 16-04-2009
    sproxy



    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    wellic
    Вот, теперь понятно - почему упомнается "скриптовость" в хепле - благодарю.
     
    Пример не мой - Визитора, только все так же для примера переделан на OnEvent.
     
    Вариант с минимум переменных:
    Подробнее...
     
    Либо вот так предпочтитейльней:
    Подробнее...
     
    OnEventFunc.au3
     
    + есть замечательные функции:

    Цитата:
    Eval
    Assing
    Call

    иногда просто незаменимы
     
    ViSiToR, wellic, все - убедился, скриптовый, скриптовый.....благодарю за ликбез )

    Всего записей: 556 | Зарегистр. 21-11-2007 | Отправлено: 13:26 16-04-2009 | Исправлено: sproxy, 14:46 16-04-2009
    wellic

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите, где здесь ошибка. Почему не нажимается кнопка1

    Код:
    #include <GuiConstantsEx.au3>
     
    Global $hGUI_1, $hGUI_2, $hGUI_3
    Global $nGUI_1_Button, $nGUI_2_Checkbox, $nGUI_3_Button, $nGUI_3_Input
     
    Opt("TrayMenuMode", 1)
    Opt("TrayOnEventMode", 1)
    Opt("GUIOnEventMode", 1)
    TraySetClick(16)
     
    $Func_1_TrayItem = TrayCreateItem("Функция №1")
    TrayItemSetOnEvent(-1, "_GUICreate_Func_1")
    $Func_2_TrayItem = TrayCreateItem("Функция №2")
    TrayItemSetOnEvent(-1, "_GUICreate_Func_2")
    $Func_3_TrayItem = TrayCreateItem("Функция №3")
    TrayItemSetOnEvent(-1, "_GUICreate_Func_3")
    TrayCreateItem("")
    $Exit_TrayItem = TrayCreateItem("Exit")
    TrayItemSetOnEvent(-1, "_exit")
     
    While 1
      Sleep(1000)
    WEnd
     
    Func
    _GUICreate_Func_1()
      Local $iOldEvent = Opt("GUIOnEventMode", 1)
      ToolTip("")
      $hGUI_1 = GUICreate("Функция №1", 300, 120, 350, 150)
      GUICtrlCreateButton("Кнопка", 20, 40, 60, 20)
      GUISetOnEvent(-1, "_button1")
      GUISetState(@SW_SHOW, $hGUI_1)
      GUISetOnEvent($GUI_EVENT_CLOSE, "_closefrm")
      Opt("GUIOnEventMode", $iOldEvent)
    EndFunc   ;==>_GUICreate_Func_1
     
    Func _GUICreate_Func_2()
      Local $iOldEvent = Opt("GUIOnEventMode", 0)
      ToolTip("")
      $hGUI_2 = GUICreate("Функция №2", 300, 120, 350, 300)
      $nGUI_2_Checkbox = GUICtrlCreateCheckbox("Галочка", 20, 40, 60, 20)
      GUISetState(@SW_SHOW)
      While 1
        Local $msg = GUIGetMsg()
        Switch $msg
          Case $GUI_EVENT_CLOSE
            ToolTip("")
            GUISetState(@SW_HIDE, $hGUI_2)
            GUIDelete($hGUI_2)
            ExitLoop
          Case
    $nGUI_2_Checkbox
            Local $sCheckbox_Data = "Вы сняли отметку с галочки."
            If GUICtrlRead($nGUI_2_Checkbox) == $GUI_CHECKED Then $sCheckbox_Data = "Вы поставили отметку на галочке."
            ToolTip($sCheckbox_Data, -1, -1, "Инфо", 1)
        EndSwitch
      WEnd

      Opt("GUIOnEventMode", $iOldEvent)
    EndFunc   ;==>_GUICreate_Func_2
     
    Func _GUICreate_Func_3()
      Local $iOldEvent = Opt("GUIOnEventMode", 1)
      ToolTip("")
      $hGUI_3 = GUICreate("Функция №3", 300, 120, 350, 450)
      $nGUI_3_Input = GUICtrlCreateInput("Строка", 20, 10, 260, 20)
      $nGUI_3_Button = GUICtrlCreateButton("Показать ввод", 20, 40, 120, 20)
      GUISetOnEvent(-1, "_button3")
      GUISetOnEvent($GUI_EVENT_CLOSE, "_closefrm")
      GUISetState(@SW_SHOW)
      Opt("GUIOnEventMode", $iOldEvent)
    EndFunc   ;==>_GUICreate_Func_3
     
    Func _exit()
      Exit
    EndFunc
      ;==>_exit
     
    Func _button1()
      ToolTip("Вы нажали Кнопку.", -1, -1, "Инфо", 1)
    EndFunc   ;==>_button1
     
    Func _button3()
      ToolTip("Вы ввели: " & GUICtrlRead($nGUI_3_Input), -1, -1, "Инфо", 1)
    EndFunc   ;==>_button3
     
    Func _closefrm()
      ToolTip("")
      GUISetState(@SW_HIDE, @GUI_WinHandle)
      GUIDelete(@GUI_WinHandle)
    EndFunc   ;==>_closefrm

    Всего записей: 339 | Зарегистр. 06-05-2002 | Отправлено: 15:03 16-04-2009
    deadbead

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    Можно попробовать через ControlSend("[CLASS:D3D Window]", "", "", "клавишы")

    К сожалению ControlSend ничего не дает... т.е. почти ничего. В игре есть чат. Если чат активен, то через ControlSend символы в чат печатаются, но если чат НЕ активен, то посланные клавиши не отрабатывают...
     

    Цитата:
    озможно там используется прямой доступ к памяти (к аксселератору ключей), вызовом типа SendMessage

     
    Пробовал я и через SendMessage... может не так пробовал?
     

    Код:
    Const $VK_DOWN = 0x28
     
    $hWnd     = WinGetHandle("[CLASS:D3D Window]")
     
    _SENDMESSAGE($hWnd, $WM_KEYDOWN, $VK_DOWN)

    Всего записей: 19 | Зарегистр. 02-12-2008 | Отправлено: 15:30 16-04-2009
    ViSiToR



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    sproxy 08:40 16-04-2009
    Цитата:
    как называется скомпилированный файл на AutoIt?

    А при чём тут компилляция в exe? Батник тоже можно скомпилировать так
    Просто скриптовый код интерпритируется при запуске (выполнении), хотя иногда компилляция перед выполнением тоже делается.
     

    Цитата:
    Ограниченность - по мойму, это не серьезный довод

    Ок, это не довод, это я ошибся в направлении, но есть другой довод - скриптовый он потому, что пишется как сценарии, а сценарии это и есть скрипт (Script).
     
    Вот кстати статья на эту тему, а вот и упоминание об AutoIt (на том же ресурсе).

    ----------
    ViSiToR a.k.a CreatoR
    CreatoR это не ник, CreatoR это стиль жизни!

    Всего записей: 3251 | Зарегистр. 01-04-2006 | Отправлено: 15:52 16-04-2009
    wellic

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    sproxy

     

    Цитата:
    Либо вот так предпочтитейльней:  
    Подробнее...  

     
    Здесь ошибка. Подправь пожалуйста.

    Код:
     
             Case 'Close Second win'  
                        GUIDelete(StringRegExpReplace($sWinList, '<SecondWin.+?)>', '\1'))  
                        StringRegExpReplace($sWinList, '<SecondWin:.+?>', '')  
                        GUICtrlSetData(@GUI_CtrlId, 'Open Second win')

    Всего записей: 339 | Зарегистр. 06-05-2002 | Отправлено: 16:02 16-04-2009
    sproxy



    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

    Цитата:
    Здесь ошибка. Подправь пожалуйста.


    Код:
     
    Case 'Close Second win'
         GUIDelete(StringRegExpReplace($sWinList, '<SecondWin:(.+?)>', '\1'))
         StringRegExpReplace($sWinList, '<SecondWin:.+?>', '')
         GUICtrlSetData(@GUI_CtrlId, 'Open Second win')
     

     
    Добавлено:
    Про скриптовость, wellic, ViSiToR, - все понял, согласен  ;) Благодарю, за разъяснение )
    Храмает мое самообучение )
     
     
    Добавлено:
    wellic 15:03 16-04-2009
    Цитата:
    Подскажите, где здесь ошибка. Почему не нажимается кнопка1

     
    Подробнее...
     

    Код:
      GUICtrlCreateButton("Кнопка", 20, 40, 60, 20)  
      ;было:
      ;GUISetOnEvent(-1, "_button1")  
      ;а надо:
      GUICtrlSetOnEvent(-1, "_button1")  

     
    + после вызова _GUICreate_Func_2(), пока будет выполняться данная функция,
    т.е. пока не будет закрыто/удаленно коно № 2, - действия в других окна не будут происходить/выполняться.
    Так как в этой функции будет выполняться цикл, для MessageLoops ($msg = GUIGetMsg()).
    Действия в других окнах будут буферизироваться - т.е. будут выполненны после завершения
    функции _GUICreate_Func_2().
    => возможно так и задуманно....?

    Всего записей: 556 | Зарегистр. 21-11-2007 | Отправлено: 16:31 16-04-2009 | Исправлено: sproxy, 16:48 16-04-2009
    ViSiToR



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    wellic 15:03 16-04-2009
    Цитата:
    где здесь ошибка. Почему не нажимается кнопка1

    Ну хотябы потому, что функция по завершению выходит из режима OnEvent, а кнопка на нём и основывается. А почему бы не проверять всё это в главном цикле, а элементы, чтобы не плодить переменные, хранить в массиве:
     
    Пример
     
    В этом примере кстати, если попытаться запустить ту же функцию снова, то её диалог просто активируется, повтороного GUI не создаётся.

    ----------
    ViSiToR a.k.a CreatoR
    CreatoR это не ник, CreatoR это стиль жизни!

    Всего записей: 3251 | Зарегистр. 01-04-2006 | Отправлено: 16:51 16-04-2009
    wellic

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Спасибо
    Цитата:
    ViSiToR
    и
    Цитата:
    sproxy
    . Все понял. Придется писать набор утилит по тдельности. И синхронизировать их работу через ini-файл

    Всего записей: 339 | Зарегистр. 06-05-2002 | Отправлено: 17:00 16-04-2009
    sproxy



    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

    Цитата:
    И синхронизировать их работу через ini-файл

    Что то очень сложное? Смысл?
     
    Реализация много оконности - вполне реализуема.
    Только определитесь OnEvent или MessageLoop и в определенном работайте.
     
    К примеру, все время работаю с OnEvent, а для диалоговых окон, когда нужен MsgBox - но свой,
    блокирую основное окно и создаю новое информационное коно на MessageLoop (но не всегда,
    просто иногда при большой вложенности, OnEvent не срабатывает).

    Всего записей: 556 | Зарегистр. 21-11-2007 | Отправлено: 17:15 16-04-2009
    ViSiToR



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    wellic 17:00 16-04-2009
    Цитата:
    синхронизировать их работу через ini-файл

    В шапке есть пример интеракции между скриптами, возможно поможет.

    ----------
    ViSiToR a.k.a CreatoR
    CreatoR это не ник, CreatoR это стиль жизни!

    Всего записей: 3251 | Зарегистр. 01-04-2006 | Отправлено: 17:35 16-04-2009
    wellic

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Я уже сделал прототип. Вроде работает. Интеракции я разобрал, тут они вроде не нужны. Все будет и так запутано
     
    Для чего я все это затеял? Я делаю инструментик для себя, чтобы и утилитки написанные мной (которые нужны под рукой) запускать быстро из трея. И панели с кнопочками сделать, чтобы висели, и из них можно было вызывать написаные функции.
     
    Я отлично понимаю, что если я перешел в режим MessageLoop, то пока я его не закрою, никакие действия в других моих функциях работать не будут. Разве что по таймеру.
     
    Я все это горожу, чтобы можно было легче модульно писать. Добавил пункт в трей и вызов функции. И написал эту функцию с необходимой функциональностью в отдельном каталоге исходников. Так и проект проще наращивать. И код весь в одном месте.  
     
    А вот функции могут быть разные и те, которым пофиг где фокус ввода, и те которые его все время держат на себе. Потому я думал, что можно каждую функцию сделать в некотором контейнере, который обрабатывает свою очередь сообщений.
     
    У меня прототип вроде работает. За базу взят механизм OnEvent, но в некоторых фунциях можно делать MessageLoop, просто не забывать вернуть механизм обработки сообщений.
     
    В главном модуле должен быть только один вызов некоторый функции, которая либо живет до конца работы программы, либо берет на себя фокус, и после закрытия формы умирает Пример умирающей формы - это например или пользовательские настройки программы, или не который интерфейс с пользователем для уточнения работы некоторых функций. Вообщем, то что должно быть временным. Обычно такие формы содежат в себе кучу контролов (кнопки, картинки, панельки, списки, и т.п.) Вот потомуих проще описывать в MessageLoop, а не городить под каждый контрол отдельную функцию.  
     
    Еще раз всем спасибо. Вроде, все в мозгах вырулилось.
     
    Добавлено:
     
    Еще бы добавили  в AutoIt конструкцию типа

    Код:
    Local Func f(x)
    ....
    EndFunc

     
    Вот тогда на нем реально большие проекты можно было бы писать

    Всего записей: 339 | Зарегистр. 06-05-2002 | Отправлено: 17:55 16-04-2009
    ViSiToR



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    wellic 17:55 16-04-2009
    Цитата:
     проще описывать в MessageLoop, а не городить под каждый контрол отдельную функцию.

    Как я (и sproxy) показал в своих примерах, это совсем не обязательно, можно указывать одну и ту же функцию, и обрабатывать по Swith @GUI_CtrlID/@TRAY_ID....
     
    Добавлено:
    wellic 17:55 16-04-2009
    Цитата:
    Еще бы добавили  в AutoIt конструкцию типа

    Что она должна делать?

    ----------
    ViSiToR a.k.a CreatoR
    CreatoR это не ник, CreatoR это стиль жизни!

    Всего записей: 3251 | Зарегистр. 01-04-2006 | Отправлено: 18:12 16-04-2009
    wellic

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    wellic 17:55 16-04-2009  
    Цитата:Еще бы добавили  в AutoIt конструкцию типа  
     
    Что она должна делать?

     
    Вот например,
     

    Код:
     
    main.au3
    #include "file1.au3"
    #include "file2.au3"
     
    console(x)   ; как скрыть x,
    f()                ; как отменить конфликт имен
     
    file1.au3
    Local x = 0    ;как сделать реально локальную переменную модуля
     
    Func f()
     x = 1
     ConsoleWrite(x)
    endfunc
     
    file1.au3
    Local x = 100 ;как сделать реально локальную переменную модуля
     
    Func f()    
    ; а вот здесь бы хотелось сделать Local Func f()
    ; чтобы ее имя не передавалось в вызывающую функцию
    ; для этого модуля
     x = 200
     ConsoleWrite(x)
    endfunc
     
     

     
    Естественно, это сильно упрощенная модель.
    Но мне нравятся языки ( втом числе и скриптовые), где я управляю областью видимости переменных и функций, а соотвественно и памятью. Это важно для больших задач.
     
    Для меня загадка,  чем в данном примере Local отличается от Global. Если заменить, то разницы не будет при выполнении. Единственно компилятор разок-другой гавкнет и все. А если включить Opt("MustDeclareVars", 1) то main.au3 вообще не должен компилиться  
     
     
     
    Добавлено:

    Цитата:
    wellic 17:55 16-04-2009  
    Цитата: проще описывать в MessageLoop, а не городить под каждый контрол отдельную функцию.  
     
    Как я (и sproxy) показал в своих примерах, это совсем не обязательно, можно указывать одну и ту же функцию, и обрабатывать по Swith @GUI_CtrlID/@TRAY_ID....  
     

     
    Функция то будет одна, но именна переменых каждой формы снова понадобятся все
     

    Всего записей: 339 | Зарегистр. 06-05-2002 | Отправлено: 18:32 16-04-2009 | Исправлено: wellic, 18:34 16-04-2009
    deadbead

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    Возможно там используется прямой доступ к памяти (к аксселератору ключей), вызовом типа SendMessage?

     
    Существуют ли утилиты, которые способные отследить что за сообщения (WindowsMessage) отправляет приложение и кому?

    Всего записей: 19 | Зарегистр. 02-12-2008 | Отправлено: 18:40 16-04-2009
    wellic

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Вот конечный вариант тестовой программки. Все бы нормально, если локальные переменные были бы локальными Программка работает, но нет чувства удовлетворенности.
     
    Весь код здесь
     
    Добавлено:
    deadbead

    Цитата:
    Существуют ли утилиты, которые способные отследить что за сообщения (WindowsMessage) отправляет приложение и кому?

     
     
    Да поищи в гугле типа SpyWin или WinSpy. Таких утилит куча от бесплатных до платных.

    Всего записей: 339 | Зарегистр. 06-05-2002 | Отправлено: 18:45 16-04-2009 | Исправлено: wellic, 18:48 16-04-2009
    sproxy



    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    wellic
    так и задуманно? это просто тест?- файл form3.au3, как в будут считаны данные из $nGUI_3_Input ?

    При желание, можно хэндлы нужных контролов хранить в отдельной переменой (как пример выше с окнами WinList),
    тогда для каждого модуля будет только одна глобальная переменная, некий $sModuleName_HwdList.
     
    + считывать данные через ClassnameNN / Advanced (Class) элемента (есди модуль имеет GUI), но думаю с  $sModuleName_HwdList проще да и гибче.
     
    А вообще, в целом - зачем заморачиваться на #include "common.au3" - не проще отдельно запускать exe файл?
    А интеракция, самая банальная и имхо удобная: передовать комманды через Edit поле AutoIt окна Главного файла программы.
    В данном случае, думаю, это наилучшее и решение.
     
    ....либо, даже, можно сделать скрытое Gui окно и понасоздавать в нем Label / Edit - для передачи комманд.
    К примеру 1-ый label служит только для вставки туда комманд для главного кона или информирование, что
    готов результат, а 1-ый Edit будет служит для вставки результатов (если текст там или еще что).
     
    В этом случае:
    1. Главное окно будет независемо от модулей, банально считывать exe файлы в папке Modules и на их основе строить Tray меню.
    2. Уж творить с модулями можно будет все что угодно, не заморачиваясь на пространство имен и т.д. конфликты
    3. Можно делать гибко: некторые модули могут запускаться только в одной копии, а некотрые (скажем копирование файлов) запускать в множестве копий.
    4. В главной программе Tray меню можно сделать даже GUI окном и сделать его очень удобным: графа № 1 запускает модуль, а рядом кнопочка крестик - что бы явно убить процесс модуля
     
    ....и т.д. - плюшки......ухх столько понаделать можно )))

    Всего записей: 556 | Зарегистр. 21-11-2007 | Отправлено: 20:45 16-04-2009 | Исправлено: sproxy, 22:09 16-04-2009
    wellic

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Когда приложение состоит из полусотни форм, и до сотни разных *.au3, то в скрытые окна не понакидываешь скрытых элементов У меня сейчас около нескольких десятков утилит (каждая состоит из от 3 до 10 файлов au3), которые надоело запускать по отдельности. Но связать их без существенной переделки в одну программу с данным компилятором невозможно. Или надо писать утилиту, которая бы перед компиляцией переименовывала локальные переменные или локальные функции, чтобы небыло накладок между модулями. Я такой препроцессор писал на Perl. Но это все геморой, и усложняет процес разработки
     
    Мне в AutoIT нравится скорость разработки и простота работы с окнами других программ.  
    Но похоже реальное, крупное приложение будет трудновато писать. Мне сейчас надо писать систему, которая бы связывала в одно целое около десятка  программ разработаных разными программистами. А это подразумевает достаточно большое кол-во кода.  
     
    Т.к. настоящей модульности в AutoIT практически нет. Это есть самый большой недостаток скриптового языка. Думаю, если AutoIT будет развиваться, то автор сделает эту малость, типа локальных переменных модуля и локальных функций модуля. Просто когда делается компиляция, то надо ее в 2 прохода.  
     
    К сожалению, на данный момент, в AutoIT можно писать только небольшие системные утилиты и "нажиматели" кнопок. А всю функциональность писать надо развитых языках и встраивать в меню автоита. Вот у меня сейчас дилема, писать на AutoIT или Perl/Python.
     
    Я для себя так и не решил, зачем в AutoIT локальные переменные, если они работают только внутри функций. Ну и сделали бы, если переменную объявил внутри функции, то она локальная, а если снаружи - то глобальная. Потому что, в данный момент оно так и работает. И зачем использовать ключевые слова Global и Local - не понятно. Может я что-то пропустил?  
     
     
    Добавлено:

    Цитата:
    wellic  
    так и задуманно? это просто тест?- файл form3.au3, как в будут считаны данные из $nGUI_3_Input ?  

     
    Все работает она локальная для модуля Вот и выплывает проблема, что переменные в разных модулях могут называться одинаково. Но предназначены для разных форм.   И надо городить огород, чтобы имена не повторялись.

    Всего записей: 339 | Зарегистр. 06-05-2002 | Отправлено: 22:59 16-04-2009 | Исправлено: wellic, 23:13 16-04-2009
    sproxy



    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

    Цитата:
    Когда приложение состоит из полусотни форм, и до сотни разных *.au3, то в скрытые окна не понакидываешь скрытых элементов  У меня сейчас около нескольких десятков утилит (каждая состоит из от 3 до 10 файлов au3),

    Возможно, не так понял, изначально подумал, что из tray просто запускаются самомтоятельные фукции/приложени.
    И не думал, что между собой они взаимодействуют.
    Но имхо - даже в этом случае - это удобне.
     
    Получается что у каждого модуля будет свой API.
    Скажем как передоваемые параметры коммандной строки. (кстати их то же можно использовать).
    делается очень легко, далее просто копируется с изминением названия комманд (если треубется) и изминенением дествий вызываемых коммандой.
     

    Цитата:
    У меня сейчас около нескольких десятков утилит (каждая состоит из от 3 до 10 файлов au3),

    А сейчас править их не придется?
     
    + / - конечно по спицифике. но если они сейчас работают в одном Едином приложени, имхо, помойму тут больше сложнейсте, чем с отдельными приложениями.

    Всего записей: 556 | Зарегистр. 21-11-2007 | Отправлено: 23:12 16-04-2009
       

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166

    Компьютерный форум Ru.Board » Компьютеры » Программы » AutoIT (Часть 2)
    Widok (01-06-2010 13:08): Лимит страниц. Продолжаем здесь.


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.Board
    © Ru.Board 2000-2017

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru