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

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

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

Widok (12-01-2009 14:47): лимит страниц. продолжаем здесь  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

AddXL

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

AutoIt3

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

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

 
Помощь по AutoIT:
  • Справку на русском (и не только) вы всегда(?) сможете найти тут
  • Справочник по командам rundll32
  • Русский справочник по API-функциям
  • Помощь по Регулярным выражениям
  • AutoIt v3: Your Quick Guide (652 КБ) - Ваш быстрый гид в мир AutoIt-а (книга в формате pdf)
     
    Инструметы для 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:
  • Коллекция AutoIt скриптов от Sanja Alone
  • Коллекция скриптов на http://msfn.org
  • Пополняющийся со временем сайт с полезными утилитами и функциями на AutoIt
  • Desktop Icons Restorator - Скрипт-Программа для сохранения/восстановления позиции иконок р.стола.
  • CaptureIt - Утилита предназначена для захвата изображений с вашего экрана.
  • SwitchIt - Скрипт для конвертирования выделенного текста
  • Скрипт расскраски кода AutoIt для публикации в форумах
     
    Общие вопросы и решения на Autoit:
  • Обработчик скриптов добавляющий отладчик (debugger)
  • Интеракция между несколькими скриптами
  • Пример использование интеракции между скриптами - Добавление элементов GUI с внешнего модуля
  • Копирование большого файла с отображением данных прогресса
  • Создание динамического меню в Tray Icon (значёк в области уведомления)
  • Пример создания своего мастера (Wizard)
  • Метод позволяющий запускать код VBS не создавая временных файлов
  • Описание функции GUIRegisterMsg()
  • Пример перехвата вводимых символов с клавиатуры
  • Пример деактивирования TabItem
  • Пример вывода лога в Edit-поле (с поддержкой форматирования текста)
  • Пример остановки/начало выполнения скрипта + Слежение за б.обмена с заменой неподдерживаемых в имени файла символов
  • Пример использования меню с иконками (ModernMenu.au3) -> Список программ в меню значка в системном трее
     
  • Как по PID процесса вычислить путь запускаемого файла
  • Получение IP по подключенному сокету
     
    Отдельные функции (UDF):
  • Функции Отключения/Подключения к Интернету
  • Функция проверки подключения к Интернету
  • Функция для получения структуры директории включая подкаталоги
  • Функция для поиска в файлах
  • Функция для смены разрешения экрана
  • Функция для смены раскладки клавиатуры в определённом окне
  • Функция для получения списка процессов с допол. инфой (путь к исполняемому файлу и др.)
  • Функции и пример для отображения детального процесса закачки файла
  • Функция (и пример использования) для отображения стильного диалога “О Программе” - [Усовершенствованная версия]
  • Функция возвращает пронумерованный список всех классов определённого окна + функция получения хендлов для этих классов
  • Функция для получения заголовка окна (или его идентификатора) по ID процесса (PID)
  • Функция _StringIsUTF8Format() + _StringToUTF() - Первая проверяет если строка содержится в UTF-8 формате, вторая преобразовывает строку в UTF-8 формат
  • Функция _FileOpenDialogEx - Возвращает массив (или строку) с полными путями к выбранным файлам
  • _AU3_Lib* Функции - Предназначены для обработки подключаемых библиотек через #include
  • Функция транслитерации строки
  • Расширенная библиотека для работы с реестром
     
    За шапкой следит ViSiToR  

  • Всего записей: 6 | Зарегистр. 24-11-2005 | Отправлено: 13:20 24-11-2005 | Исправлено: Maz, 11:50 17-04-2017
    ViSiToR



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    timsky 06:27 20-09-2008
    Цитата:
    Notepad++

       - SciTE для аутоита специально заточен, я не представляю как можно писать код в блокноте (даже с «++»'ом ).
     

    Цитата:
    Написал короткие тестовые скрипты

    Кидай их сюда... хотя у меня нет IE7, пока только 6, но проверить думаю можно и там.
     
    А вообще, уменее находить проблему в скрипте желательно приобрести как можно раньше, это поможет в дальнейшем писать скрипты.
    Я всегда пытаюсь свести скрипт к минимому, проверяю как будет отрабатывать без того или инного куска кода, и постепенно дохожу до корня проблемы.
     
    У тебя же проблема в функции «_IEAttach», вот с неё и нужно исходить, проверять всё что её касается; переменные, параметры, функции перед ней и после, при каких обстоятельствах вызывается функция, проверять вобщем нужно всё, проблема обязательно всплывёт!
     

    Цитата:
    Закрываю Эксплорер и снова отркываю - тестовый скрипт начинает работать. В чем ошибка?

    Возможно хендл уже не тот (при вызове скрипта), и при новом окне IE скрипт его "подхватывает".

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

    Всего записей: 3251 | Зарегистр. 01-04-2006 | Отправлено: 07:46 20-09-2008
    Tipulatoid



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ViSiToRThnx
    Добавлено
    Записываю в массив секцию ini-файла

    Код:
    $IniGeneral = IniReadSection("champ.ini", "General")

    В массиве две колонки - 0 - Key и 1 - Value
    Нужно прочитать Value (3) у Key (GroupQuan), строка 11. Делаю так:

    Код:
     MsgBox (0,"",$IniGeneral[_ArraySearch ($IniGeneral, "GroupQuan")][1])

    Это правильно, или есть более прямой способ?
     
    И еще. Требуется создать допустим 3 массива (также считать с ini) с именами $IniGroup1 $IniGroup2 $IniGroup3 Кол-во требуемых массивов заранее неизвестно Как? Так не работает

    Код:
     For $g = 1 to $IniGeneral[_ArraySearch ($IniGeneral, "GroupQuan")][1]
       $IniGroup&Eval("g") = IniReadSection ("champ.ini", "Group" & $g)
       _ArrayDisplay ($IniGroup&Eval("g"))
    Next

    Добавлено
    Вторая проблема решена (нашел на офф. форуме)

    Код:
    For $g = 1 to $IniGeneral[_ArraySearch ($IniGeneral, "GroupQuan")][1]
        Assign ("IniGroup" & $g, IniReadSection ("champ.ini", "Group" & $g))
    Next

    Там же ругают такое решение, говоря что
    Цитата:
    Assign/Eval are, almost always, evil.
    И гораздо лучше использовать массив. Но в моем случае он будет ведь трехмерным, верно? Я думаю, в нем запутаюсь

    Всего записей: 349 | Зарегистр. 22-12-2006 | Отправлено: 08:20 20-09-2008 | Исправлено: Tipulatoid, 12:36 20-09-2008
    timsky



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

    Цитата:
    SciTE для аутоита специально заточен, я не представляю как можно писать код в блокноте

    Счупал я этот SciTE. Заточен - это хорошо, но в нем нет всех мелочей, которые N++ изначально поддерживает без всяких заточек.
    Это как Опера в свое время... вроде бы ничего особенного, но когда привыкнешь - все остальное уже не то. Плюс он изначально понимает АУ3 файлы.
    Вот недавно у товарища был, он в SciTE пишет. Пока ковырялся в его скриптах заметил, что нет того, к чему так привык: двойной щелчок по слову/переменной просто выделяет слово. В N++ при этом выделяются все такие переменные/слова в тексте... очень удобно... да вообще куча наворотов в нем, есть консоль, правда я ее не юзаю... н знаю, чего в нем нет, что есть в SciTE.
     

    Цитата:
    А вообще, уменее находить проблему в скрипте желательно приобрести как можно раньше, это поможет в дальнейшем писать скрипты.  
    Я всегда пытаюсь свести скрипт к минимому, проверяю как будет отрабатывать без того или инного куска кода, и постепенно дохожу до корня проблемы.

     
    Я если пишу код, который еще не опробовал - делаю отдельный пробный скрипт, обкатываю его и обработку ощибок, а потом уже втыкаю в основной код. Так вот это все работало по отдельности, но в реале такой вот затык.
    вот при затыке тестовый скрипт выдает правильный хендл, тайтл, все нормально вплоть до _IEAttach, на этом месте выдает @error 7 и все тут. Как только закрываю IE и пробую снова, но уже на тестовых скриптах - все ок.
    SetTitle.au3

    Цитата:
    #include <IE.au3>
    AutoitSetOption ('WinTitleMatchMode', 2)
     
    $login = 'ЗДЕСЬ ЛОГИН'
    $pass = 'ЗДЕСЬ ПАРОЛЬ'
     
    $account = _IECreate ('https://accounts.craigslist.org', 0, 1)
     
    $form = _IEFormGetObjByName ($account, 'login')
     
    $loginBox = _IEFormElementGetObjByName ($form, 'inputEmailHandle')
    $passBox = _IEFormElementGetObjByName ($form, 'inputPassword')
    _IEFormElementSetValue ($loginBox, $login)
    _IEFormElementSetValue ($passBox, $pass)
     
    _IEFormSubmit ($form)
     
    _IELoadWait ($account)
     
     
    $hwnd = _IEPropertyGet ($account, 'hwnd')
    MsgBox (64, '$hwnd', $hwnd)
     
    $title = WinGetTitle ($hwnd)
    MsgBox (64, 'Old Title', $title)
     
    $title = WinSetTitle ($hwnd,'', $title & ' - ' & $CmdLineRaw)
     
    $title = WinGetTitle ($hwnd)
    MsgBox (64, 'New Title', $title)

     
    GetTitle.au3

    Цитата:
    #include <IE.au3>
    AutoitSetOption ('WinTitleMatchMode', 2)
     
    $hwnd = WinGetHandle ($CmdLineRaw)
     
    $account = _IEAttach ($hwnd, 'HWND')
     
    Select
    Case @error = 5
        MsgBox (16,'Invalid Value', 'Can not access CL window!')
    Case @error = 7
        MsgBox (16,'No Match', 'Can not access CL window!')
    EndSelect
     
    MsgBox (64,'','OK?')

    Всего записей: 2287 | Зарегистр. 08-06-2004 | Отправлено: 15:35 20-09-2008 | Исправлено: timsky, 15:50 20-09-2008
    Maza Faka



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

    Цитата:
    Это правильно, или есть более прямой способ?

    Не совсем понял, что именно ты хочешь сделать, это?

    Код:
     
    $IniGeneral = IniReadSection("champ.ini", "General")
     
    MsgBox(0, "", $IniGeneral[3][1])
     

     
    Добавлено:
    По поводу 2-го вопроса, думаю можно сделать так:

    Код:
    $aNames = IniReadSectionNames("champ.ini")
     
    For $i = 1 To $aNames[0]
        Assign("IniGeneral" & $i, IniReadSection("champ.ini", $aNames[$i]))
    Next
     
    MsgBox(0, "", $IniGeneral1[3][1])

     
    Но опять-же, такое решение мне не нравится, поскольку SciTE ругается на необьявленные переменные.
     
    Добавлено:
    По моему лучшим решением будет считать в массив все секции ini-файла, а затем при необходимости получать ключи\значения прогоняя массив в цикле. Что-то вроде этого:

    Код:
    $aNames = IniReadSectionNames("champ.ini")
     
    _GetValue("champ.ini", $aNames)
     
    Func _GetValue($sIniFile, $sNames)
        Local $aReadSection, $i, $j
     
        For $i = 1 To $sNames[0]
            $aReadSection = IniReadSection($sIniFile, $sNames[$i])
            For $j = 1 To $aReadSection[0][0]
                ConsoleWrite($aReadSection[$j][0] & "=" & $aReadSection[$j][1] & @LF)
            Next
        Next
    EndFunc

    Всего записей: 1420 | Зарегистр. 25-10-2006 | Отправлено: 16:27 20-09-2008
    ViSiToR



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    timsky 15:35 20-09-2008
    Цитата:
    н знаю, чего в нем нет, что есть в SciTE

    Syntax Checker?  
     

    Цитата:
    SetTitle.au3
    .....
    GetTitle.au3
     

    Зачем так сложно? и зачем командная строка используется?
    И как они между собой общаются?
    Мне их запускать вместе, или как?
     
    Тут...

    Код:
    $hwnd = WinGetHandle ($CmdLineRaw)

    Очень не надёжная проверка, т.к эта ком. строка в другом скрипте другая, там входит путь к скрипту.
     
    Подробнеее опиши, что тут из этих скриптов должно получится.
     
    Tipulatoid 08:20 20-09-2008
    Цитата:
    Это правильно, или есть более прямой способ?

    А почему бы просто не читать с ини напрямую?
     

    Код:
    MsgBox (0,"", IniRead("champ.ini", "General", "GroupQuan", ""))


     

    Цитата:
    Вторая проблема решена

    Это очень медленное решение, лучше основываться на считанных данных в переменной, и создать ещё один массив:
     

    Код:
     
    $GroupQuan = IniRead("champ.ini", "General", "GroupQuan", "")
     
    Dim $aGroupQuanArrs[$GroupQuan+1]
     
    For $i = 1 To $GroupQuan
        $aGroupQuanArrs
    [$i] = IniReadSection("champ.ini", "Group" & $i)
    Next

     

    Цитата:
    в моем случае он будет ведь трехмерным

    Нет, см. выше

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

    Всего записей: 3251 | Зарегистр. 01-04-2006 | Отправлено: 17:51 20-09-2008
    timsky



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

    Цитата:
    Подробнеее опиши, что тут из этих скриптов должно получится.

    Эти оба скрипта работают в виде ЕХЕ и командная строка 100% передается обоим одна и та же. Первый скрипт устанавливает в тайтл IE метку, по которой 2-й скрипт это окно среди возможных нескольких с одинаковым тайтлом находит. IE 7 работает в режиме окон, не вкладок.
     
    Смысл таков, что первый скрипт открывает этот сайт, логинится, производит определенные действия (переходит по сслыкам, заполняет формы... все функции _IE...), меняет тайтл окна и затем запускает через RunWait стороннее приложение, которое в результате работы запускает 2-й скрипт... тоже ожидая его завершения.
    Т.е. выстраивается цепочка, где 1-й скрипт ждет завершения стороннего приложения (которое никак не взаимодействует с IE), а то в свою очередь ждет завершения работы 2-го скрипта.
    Это все работает, (в том числе и на IE 7 на Win 2003) проверено уже мною несколько раз. Второй скрипт берет Хэндл тот, что нужно, не срабатывает только IEAttach
    Если я закрываю 1-й скрипт, стороннее приложение и пытаюсь приаттачиться к окну IE - все равно не срабатывает. Я могу делатьс окном что угодно Win... , только IEAttach не срабатывает
    Если закрываю окно IE и тут же запускаю тестовые скрипты, выполняющие то же самое, то работает.
     
    Выложенные тестовые скрипты нужно просто запустить сперва SetTitle (с параметром ком строки) ... это сокращенный вариант 1-гомоего скрипта, стороннее приложение, ессно опускаем, т.к. это сложный лиц. софт, который просто так не заработает.
    Далее запустить GetTitle (с таким же параметром ком строки) - это тоже сокращенный вариант 2-го скрипта, но начинается тот точно так же.
    Тестовые отрабатывают нормально, а вот в реале не могу понять, в чем трабля... думал может это баг какой-то известный кому-нибудь...

    Всего записей: 2287 | Зарегистр. 08-06-2004 | Отправлено: 18:15 20-09-2008 | Исправлено: timsky, 18:30 20-09-2008
    ViSiToR



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    timsky
    Давай попробуем так - $CmdLineRaw использовать пока не будем (в целях отладки), вместо этого придумаем какой нибудь уникальный заголовок, чтобы исключить проблему с распознаванием заголовка.
     
    В первом скрипте (SetTitle) используй это:
     

    Код:
    $sUniqueTitle = "~ _____ My Title _____ ~"
     
    $title = WinSetTitle($hwnd,'', $title & ' - ' & $sUniqueTitle)

    Вместо:

    Код:
    $title = WinSetTitle ($hwnd,'', $title & ' - ' & $CmdLineRaw)

     
     
    А во втором сделай так:

    Код:
    #include <IE.au3>
     
    Opt('WinTitleMatchMode', 2)
     
    $sUniqueTitle = "~ _____ My Title _____ ~"
    $hwnd = WinGetHandle($sUniqueTitle)
     
    $account = _IEAttach(HWnd($hwnd), 'hwnd')
     
    Select
        Case
    @error = 5
            MsgBox (16,'Invalid Value', 'Can not access CL window!')
        Case @error = 7
            MsgBox (16,'No Match', 'Can not access CL window!' & @CRLF & "hwnd (Title) = " & WinGetTitle($hwnd))
    EndSelect
     
    MsgBox (64,'','OK?')

     
    Если будет таже ошибка, проверь что выводится во второй строке Msgbox'а, если ожидаемый заголовок окна, то проблема видимо в распознавании объекта в окне IE, в справке вот что сказано:
     

    Цитата:
    if the window contains a control called "Internet Explorer_Server1" then you can attach to it with this function, if it does not it is a standard window and traditional AutoIt windows functions must be used to control it.

     
    Т.е есть возможность что IE создаёт окно с не стандартными элементами, для какой цели, или при каких обстоятельствах пока не ясно...

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

    Всего записей: 3251 | Зарегистр. 01-04-2006 | Отправлено: 19:30 20-09-2008
    timsky



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

    Цитата:
    Если будет таже ошибка, проверь что выводится во второй строке Msgbox'а, если ожидаемый заголовок окна, то проблема видимо в распознавании объекта в окне IE

    Да, так и есть
    В мессадж боксе был нужный заголовок.
    Я проверил на реальном окне в боевых условиях. И адаптировал твой вариант второго скрипта:
     
    Вот само окно:

    Цитата:
    >>>> Window <<<<
    Title:    Telephone Account Verification - Windows Internet Explorer # 8174579140
    Class:    IEFrame
    Position:    132, 132
    Size:    800, 600
    Style:    0x14CF0000
    ExStyle:    0x00000100
    Handle:    0x001105B4
     
    >>>> Control <<<<
    Class:    
    Instance:    
    ClassnameNN:    
    Advanced (Class):    
    ID:    
    Text:    
    Position:    
    Size:    
    ControlClick Coords:    
    Style:    
    ExStyle:    
    Handle:    0x000B06DA
     
    >>>> Mouse <<<<
    Position:    631, 145
    Cursor ID:    0
    Color:    0xAAAAAA
     
    >>>> StatusBar <<<<
    1:    
    2:    
    3:    
    4:    
    5:    
    6:    
    7:    
    8:    
    9:    
    10:    
     
    >>>> Visible Text <<<<
    Command Bar
    Favorites Command Bar
    Navigation Bar
    Page Control
    https://accounts.craigslist.org/login/phnact?rt=P&rp=//B/fns/#
    https://accounts.craigslist.org/login/phnact?rt=P&rp=//B/fns/#
    Live Search
    Search Control
    Telephone Account Verification - Windows Internet Explorer
    Zoom Level
    ITBarHost
    Menu Bar
     
     
    >>>> Hidden Text <<<<
    Live Search

     
    Вот окно контрола Internet Explorer_Server1... ну то что рендерится движкомм ИЕ.. ты меня понял :

    Цитата:
    >>>> Window <<<<
    Title:    Telephone Account Verification - Windows Internet Explorer # 8174579140
    Class:    IEFrame
    Position:    132, 132
    Size:    800, 600
    Style:    0x14CF0000
    ExStyle:    0x00000100
    Handle:    0x001105B4
     
    >>>> Control <<<<
    Class:    Internet Explorer_Server
    Instance:    1
    ClassnameNN:    Internet Explorer_Server1
    Advanced (Class):    [CLASS:Internet Explorer_Server; INSTANCE:1]
    ID:    
    Text:    
    Position:    0, 60
    Size:    792, 493
    ControlClick Coords:    530, 33
    Style:    0x56000000
    ExStyle:    0x00000000
    Handle:    0x001505AE
     
    >>>> Mouse <<<<
    Position:    666, 248
    Cursor ID:    0
    Color:    0xFFFFFF
     
    >>>> StatusBar <<<<
    1:    
    2:    
    3:    
    4:    
    5:    
    6:    
    7:    
    8:    
    9:    
    10:    
     
    >>>> Visible Text <<<<
    Command Bar
    Favorites Command Bar
    Navigation Bar
    Page Control
    https://accounts.craigslist.org/login/phnact?rt=P&rp=//B/fns/#
    https://accounts.craigslist.org/login/phnact?rt=P&rp=//B/fns/#
    Live Search
    Search Control
    Telephone Account Verification - Windows Internet Explorer
    Zoom Level
    ITBarHost
    Menu Bar
     
     
    >>>> Hidden Text <<<<
    Live Search

     

    Цитата:
    Цитата:if the window contains a control called "Internet Explorer_Server1" then you can attach to it with this function, if it does not it is a standard window and traditional AutoIt windows functions must be used to control it.  
     
     
     
    Т.е есть возможность что IE создаёт окно с не стандартными элементами, для какой цели, или при каких обстоятельствах пока не ясно...

    А вот тут немного не понял текст из справки. Есть решение?
    И где ты эту цитату взял?
     

    Всего записей: 2287 | Зарегистр. 08-06-2004 | Отправлено: 01:29 21-09-2008
    Tipulatoid



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ViSiToR
    Maza Faka
    Ребят, спасибо за ответы. Наверное, стоит сформулировать задачу наиболее полно.
    Итак, требуется сохранять в ini - файл и затем работать со следующими данными:
    1. Общие настройки: (привожу не все для кратости)
    а) Число периодов в игре
    б) Число групп команд в игре (от этого числа зависит кол-во секций [Group№] далее в ini - файле; может быть от 1 до 36)
    2. Информация по каждой группе команд:
    a) Электронный адрес, с которого высылать отчеты командам
    6) его пароль
    в) его логин
    г) его POP3 - сервер
    д) его SMTP - сервер
    е) Путь где лежат файлы группы
    ж) Число команд в группе (может быть от 2 до 6), по каждой команде нужна информация:
        ж1) ее название
        ж2) ее пароль доступа к отчетам
        ж3) ее электронный адрес куда высылать отчеты
     
    Итак, эти данные сохраняю в ini - файл такой структуры (если структура неудачна, посоветуйте плиз как переделать)
    champ.ini

    Код:
    [General]
    PeriodsQuan=20
    GroupQuan=2
    [Group1]
    GroupEmail=1lalala@unknown.ru
    GroupEmailPass=1qwertyuiop
    GroupEmailLogin=1tototo
    GroupEmailPOP=1poppopop
    GroupEmailSMTP=1smtpsmtp
    GroupPath=C:\Games\Delta001
    GroupTeamsQuan=6
    [Group1Teams]
    Team1Name=Команда1-1
    Team1Pass=pass1-1
    Team1Email=team1-1@unknown.net,team1-1@unknown.ru
    Team2Name=Команда1-2
    Team2Pass=pass1-2
    Team2Email=team1-2@unknown.net,team1-2@unknown.ru
    Team3Name=Команда1-3
    Team3Pass=pass1-3
    Team3Email=team1-3@unknown.net,team1-1@unknown.ru
    Team4Name=Команда1-4
    Team4Pass=pass1-4
    Team4Email=team1-4@unknown.net,team1-4@unknown.ru
    Team5Name=Команда1-5
    Team5Pass=pass1-5
    Team5Email=team1-5@unknown.net,team1-5@unknown.ru
    Team6Name=Команда1-6
    Team6Pass=pass1-6
    Team6Email=team1-6@unknown.net,team1-6@unknown.ru
    [Group2]
    GroupEmail=2lalala@unknown.ru
    GroupEmailPass=2qwertyuiop
    GroupEmailLogin=2tototo
    GroupEmailPOP=2poppopop
    GroupEmailSMTP=2smtpsmtp
    GroupPath=C:\Games\Delta002
    GroupTeamsQuan=5
    [Group2Teams]
    Team1Name=Команда2-1
    Team1Pass=pass2-1
    Team1Email=team2-1@unknown.net,team2-1@unknown.ru
    Team2Name=Команда2-2
    Team2Pass=pass2-2
    Team2Email=team2-2@unknown.net,team2-2@unknown.ru
    Team3Name=Команда2-3
    Team3Pass=pass2-3
    Team3Email=team2-3@unknown.net,team2-1@unknown.ru
    Team4Name=Команда2-4
    Team4Pass=pass2-4
    Team4Email=team2-4@unknown.net,team2-4@unknown.ru
    Team5Name=Команда2-5
    Team5Pass=pass2-5
    Team5Email=team2-5@unknown.net,team2-5@unknown.ru
     

    Вот теперь со всем этим чудом надо работать. Надо прочесть все значения в один или несколько массивов, подставлять при необходимости в соотвествующие инпуты; при изменении пользователем значений инпутов, обновлять данные в массиве, а после этого обновлять ini - файл
    Как наиболее грамотно организовать работу с этими данными? Должен ли сделать несколько массивов по каждой группе отдельно  Или всю инфу по группам записать в один массив (тогда, вроде бы он получается трехмерным - например $Games[число групп - их от 1 до 36][настройки группы (e-mail, POP, SMTP, число команд и т.д.), их число стабильно - 7][настройки команды - их 3]
     
    Надеюсь, внятным языком объяснил.

    Всего записей: 349 | Зарегистр. 22-12-2006 | Отправлено: 02:06 21-09-2008 | Исправлено: Tipulatoid, 13:19 21-09-2008
    Maza_Faka



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Tipulatoid
    Непонимаю, зачем тебе нужно создавать массив(ы) с содержимым этого ini-файла? Работай непосредственно с ini-файлом. Надо внести изменения в ini-файл - используй функцию IniWrite(), надо прочитать значение - используй функцию IniRead(), к чему весь этот геморрой с массивами?
     
    P.S.
    $Games[7][3]
    Это не трёхмерный массив, а двухмерный.

    Всего записей: 1420 | Зарегистр. 25-10-2006 | Отправлено: 09:19 21-09-2008
    Tipulatoid



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

    Цитата:
    к чему весь этот геморрой с массивами?

    Большей частью потому, что ViSiToR так прокоментировал мой код

    Цитата:
    P.S  
    Я бы многое ещё изменил, например чтение перевода, это лучше делать при запуске скрипта (в массив), и с файла со структурой ini-файла (IniRead() и т.д).


    Всего записей: 349 | Зарегистр. 22-12-2006 | Отправлено: 09:30 21-09-2008
    ViSiToR



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    timsky 01:29 21-09-2008
    Цитата:
    Есть решение?

    Если я правильно понял, _IEAttach всего лишь возвращает объект окна по заданному свойству (hWnd в нашем случае) ?
    Тогда можно попробовать ещё так:
     

    Код:
    #include <IE.au3>
     
    $sUniqueTitle = "~ _____ My Title _____ ~"
    $hwnd = WinGetHandle($sUniqueTitle)
     
    $account = _IEAttach($hwnd, 'hwnd')
     
    If @error Then
        $hwnd = WinGetHandle("[CLASS:IEFrame;REGEXPTITLE:.*?" & $sUniqueTitle & ".*?]")
        $account = _IEAttach($hwnd, 'hwnd')
     
        If @error Then
            $hwnd = ControlGetHandle("[CLASS:IEFrame; REGEXPTITLE:.*?" & $sUniqueTitle & ".*?]", "", "Internet Explorer_Server1")
            $account = _IEAttach($hwnd, 'hwnd')
        EndIf
    EndIf
     
    Select
        Case
    @error = 5
            MsgBox (16,'Invalid Value', 'Can not access CL window!')
        Case @error = 7
            MsgBox (16,'No Match', 'Can not access CL window!' & @CRLF & "hwnd (Title) = " & WinGetTitle($hwnd))
    EndSelect
     
    MsgBox (64,'','OK?')

     

    Цитата:
    где ты эту цитату взял?

    В справке (описание функции _IEAttach) . Кстати, одно из преимуществ SciT'а - ставим курсор на функции (или выделяем её, кому как удобно), нажимаем F1, и получаем справку открытую на том месте где эта функция описывается .
     
    Tipulatoid 09:30 21-09-2008
    Цитата:
    Большей частью потому, что ViSiToR так прокоментировал мой код

     
    Я предложил массивы для перевода строк, оно удобнее так, а для данных у тебя уже массивы вроде были
     
    Вобщем если заранее известно что будет считываться с ини, и какие данные будут туда помещены, то конечно проще обойтись простыми переменными, но если все эти данные нужно записать в инпуты подряд (в цикле к примеру), то массивом будет проще, вобщем вот пример из того что я понял:
     

    Код:
    $sIniFile           = @ScriptDir & "\Champ.ini"
     
    $PeriodsQuan        = IniRead($sIniFile, "General", "PeriodsQuan", "")
    $GroupQuan          = IniRead($sIniFile, "General", "GroupQuan", "")
    ;Тут как я понял идут остальные настройки, считай их также в отдельные переменные, так будет легче разбираться далее в коде
     
    ;Теперь заполняем массив с группами, это будут массивы в массиве

    Global $aGroups[$GroupQuan+1]
     
    For $i = 1 To $GroupQuan
        $aGroups
    [$i] = IniReadSection($sIniFile, "Group" & $i)
    Next
     
    ;Теперь демонстрация работы с массивами....
    ;Например нужно изменить в секции Group2 значение GroupPath= на D:\Games\Delta006....
     
    ;2 = это номер группы (секции), GroupPath = это имя ключа, а последний параметр это новое значение

    _ChangeGroupValue(2, "GroupPath", "D:\Games\Delta006")
     
    ;Всё, теперь в массиве (и в ini-шке) новое значение:
    $aTmpArr = $aGroups[2] ;тут мы знаем что это группа 2....
    MsgBox(64, "Ret", $aTmpArr[6][1]) ;а тут я просто посмотрел в ini что GroupPath это 6-ой по счёту ключ, но эо только для примера
     
    ;Функция для изменения значения в массиве и в ini-файле.

    Func _ChangeGroupValue($iGroupN, $sKey, $sValue)
        ;$aTmpArr это (двумерный) массив с определённой группой
        Local $aTmpArr = $aGroups[$iGroupN]
     
        For $i = 1 To UBound($aTmpArr)-1
            If $aTmpArr[$i][0] = $sKey Then
                ;Тут мы меняем в массиве значение определённого ключа, и в ini-файл пишем новое значение
     
                $aTmpArr[$i][1] = $sValue
                $aGroups
    [$iGroupN] = $aTmpArr
     
                IniWrite($sIniFile, "Group" & $iGroupN, $sKey, $sValue)
     
                Return
            EndIf
        Next
    EndFunc


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

    Всего записей: 3251 | Зарегистр. 01-04-2006 | Отправлено: 13:03 21-09-2008 | Исправлено: ViSiToR, 13:05 21-09-2008
    Tipulatoid



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    В - общем вот что получилось на чуть измененном ini (его новой вариант изменил в предыдущем посте)
    Untitled58.au3 :
    Код:
    #include <Array.au3>
    $inifile = "champ.ini"
     
    If FileExists ($inifile) Then
       
    FileOpen ($inifile, 0)
       
       
    $IniGeneral =
    IniReadSection ($inifile, "General") ; записали общие настройки в 2-х мерный массив
       ;_ArrayDisplay ($IniGeneral, "Общие настройки")
     
       
    $GroupQuan = IniRead($inifile, "General", "GroupQuan", "")  
       
    Dim $IniGroup[$GroupQuan+1][4]
     
       
    For $g = 1 To $GroupQuan  
          $IniGroup
    [$g][0] =
    IniReadSection($inifile, "Group" & $g) ; записали настройки группы  
          ;_ArrayDisplay ($IniGroup[$g][0], "Настройки группы" & $g)
           
         
    $TeamQuan = IniRead ($inifile, "Group" & $g, "GroupTeamsQuan", "")
         
    Dim $IniGroupTeamNames[1]
         
    Dim $IniGroupTeamPasses[1]
         
    Dim $IniGroupTeamEmails[1]
           
         
    For $t = 1 To $TeamQuan
             
    _ArrayAdd ($IniGroupTeamNames, IniRead ($inifile, "Group" & $g & "Teams", "Team" & $t & "Name", ""))
             
    _ArrayAdd ($IniGroupTeamPasses, IniRead ($inifile, "Group" & $g & "Teams", "Team" & $t & "Pass", ""))
             
    _ArrayAdd ($IniGroupTeamEmails, IniRead ($inifile, "Group" & $g & "Teams", "Team" & $t & "Email", ""))
         
    Next
         
    $IniGroup[$g][1] = $IniGroupTeamNames
    ; записали названия команд группы
          ;_ArrayDisplay ($IniGroup[$g][1], "Команды группы" & $g)
         
    $IniGroup[$g][2] = $IniGroupTeamPasses ; записали пароли команд группы
          ;_ArrayDisplay ($IniGroup[$g][2], "Пароли группы" & $g)
         
    $IniGroup[$g][3] = $IniGroupTeamEmails ; записали электронные адреса команд группы
          ;_ArrayDisplay ($IniGroup[$g][3], "Электронные адреса группы" & $g)
       
    Next
     
     
       
    FileClose ($inifile)
    EndIf
     
    _ArrayDisplay ($IniGeneral, "Общие настройки")
    _ArrayDisplay ($IniGroup[1][0], "Настройки группы 1")
    _ArrayDisplay ($IniGroup[1][1], "Имена команд группы 1")
    _ArrayDisplay ($IniGroup[1][2], "Пароли группы 1")
    _ArrayDisplay ($IniGroup[1][3], "Электронные адреса группы 1")
    _ArrayDisplay ($IniGroup[2][0], "Настройки группы 2")
    _ArrayDisplay ($IniGroup[2][1], "Имена команд группы 2")
    _ArrayDisplay ($IniGroup[2][2], "Пароли группы 2")
    _ArrayDisplay ($IniGroup[2][3], "Электронные адреса группы 2")

    Теперь дело осталось за малым. Как с этим работать? Т.е. как, например вывести в консоль имя 3-ей команды из группы 2?
    Добавлено  
    Visitor, не обновил страницу прежде чем постить. Пошел курить твой пример

    Всего записей: 349 | Зарегистр. 22-12-2006 | Отправлено: 13:18 21-09-2008 | Исправлено: Tipulatoid, 13:45 21-09-2008
    ViSiToR



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Tipulatoid 13:18 21-09-2008
    Цитата:
    вот что получилось на чуть измененном ini

    Ох.... усложняешь всё... пересмотри мой пример, там всё намного проще.
     

    Цитата:
    FileOpen ($inifile, 0)

    Посмотри в справке как этим пользоваться, а для ini оно вообще не нужно
     

    Цитата:
    как, например вывести в консоль имя 3-ей команды из группы 2?

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

    Код:
    $aTmpArr = $IniGroup[2][1] ;тут у нас вроде значение ключа «Team3Name=» в секции «Group2Teams»
    ConsoleWrite($aTmpArr[3])


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

    Всего записей: 3251 | Зарегистр. 01-04-2006 | Отправлено: 13:38 21-09-2008
    Tipulatoid



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ViSiToR
    Да, разобрался. Круто, как всегда

    Всего записей: 349 | Зарегистр. 22-12-2006 | Отправлено: 14:31 21-09-2008
    Hackproof



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

    Код:
    GuiCtrlSetData($log, StringFormat(@crlf & $logstring),1)

     
    Работает она сутками, и поле надо бы как-то очищать, чтобы там например, хранились последние 100 строк. Как это можно изобразить?

    Всего записей: 106 | Зарегистр. 24-05-2008 | Отправлено: 17:41 21-09-2008 | Исправлено: Hackproof, 18:17 21-09-2008
    timsky



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

    Цитата:
    В справке (описание функции _IEAttach) . Кстати, одно из преимуществ SciT'а - ставим курсор на функции (или выделяем её, кому как удобно), нажимаем F1, и получаем справку открытую на том месте где эта функция описывается .

    Ну все, уговорил! Пощупаю его
    Я пробовал аатачить по хендлу, тайтлу, тайтлу окна - один хер. Попробую твой новый вариант сегодня, спасибо! Как-то даже и не замечал, что есть ControlGetHandle
    Вот кстати, как я пытался приаттачиться вчера:

    Цитата:
    #include <IE.au3>
    AutoitSetOption ('WinTitleMatchMode', 2)
     
    $account2 = _IEAttach ('Internet Explorer', 'WindowTitle')
    MsgBox (0,'Error: ', @error)
     
    $account2 = _IEAttach ('Internet Explorer', 'WindowTitle', 1)
    MsgBox (0,'Error: ', @error)
     
    $account2 = _IEAttach ('[TITLE:Internet Explorer; CLASS:IEFrame]', 'Embedded')
    MsgBox (0,'Error: ', @error)
     
    $account2 = _IEAttach ('[TITLE:Internet Explorer; CLASS:IEFrame]', 'Embedded', 1)
    MsgBox (0,'Error: ', @error)
     
    $account2 = _IEAttach ('[TITLE:Internet Explorer; CLASS:IEFrame]')
    MsgBox (0,'Error: ', @error)
     
     
    $account2 = _IEAttach ('[TITLE:Internet Explorer; CLASS:Internet Explorer_Server; INSTANCE:1]')
    MsgBox (0,'Error: ', @error)
     
    $account2 = _IEAttach ('[TITLE:Internet Explorer; CLASS:Internet Explorer_Server]', 1)
    MsgBox (0,'Error: ', @error)
     
     
    $account2 = _IEAttach ('[TITLE:Internet Explorer; CLASS:Internet Explorer_Server1]')
    MsgBox (0,'Error: ', @error)
     
     
    $account2 = _IEAttach ('[TITLE:Internet Explorer; CLASS:Internet Explorer_Server; INSTANCE:1]', 'Embedded')
    MsgBox (0,'Error: ', @error)
     
    $account2 = _IEAttach ('[TITLE:Internet Explorer; CLASS:Internet Explorer_Server; INSTANCE:1]', 'Embedded', 1)
    MsgBox (0,'Error: ', @error)
     
     
    $account2 = _IEAttach ('', 'Instance', 1)
    MsgBox (0,'Error: ', @error)
     
     
    $hwnd = WinGetHandle ('Internet Explorer')
    MsgBox (64,'Handle',$hwnd)
     
    $account2 = _IEAttach ($hwnd, 'HWND')
    MsgBox (0,'Error: ', @error)
     
    $account2 = _IEAttach ($hwnd, 'HWND', 1)
    MsgBox (0,'Error: ', @error)

    Не аттачится - и все

    Всего записей: 2287 | Зарегистр. 08-06-2004 | Отправлено: 19:22 21-09-2008
    ViSiToR



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Hackproof 17:41 21-09-2008
    Цитата:
     поле надо бы как-то очищать, чтобы там например, хранились последние 100 строк

    Т.е в Edit-поле убрать всё кроме последних 100 строк?
     
    Вот так можно:
     

    Код:
    #include <GuiConstantsEx.au3>
     
    $GUI = GUICreate("<Last 100 in Edit> Demo", 300, 220)
     
    $Edit = GUICtrlCreateEdit("", 20, 20, 260, 160)
     
    For $i = 1 To 200
        GUICtrlSetData($Edit, "Line Number " & $i & @CRLF, 1)
    Next
     
    $Clean_Button = GUICtrlCreateButton("Clean Edit", 20, 190, 80, 20)
     
    GUISetState(@SW_SHOW, $GUI)
     
    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                Exit
            Case
    $Clean_Button
                Local $iLimit_Lines = 100
                Local $sNew_Edit_Data = ""
                Local $aRead_Edit = StringSplit(StringStripWS(GUICtrlRead($Edit), 3), @LF)
     
                If $aRead_Edit[0] > $iLimit_Lines Then
                    For
    $i = $aRead_Edit[0] To 1 Step -1
                        $sNew_Edit_Data = $aRead_Edit[$i] & @CRLF & $sNew_Edit_Data
     
                        If $aRead_Edit[0]-$i = $iLimit_Lines-1 Then ExitLoop
                    Next
     
                    GUICtrlSetData($Edit, StringStripWS($sNew_Edit_Data, 3))
                EndIf
        EndSwitch
    WEnd


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

    Всего записей: 3251 | Зарегистр. 01-04-2006 | Отправлено: 00:46 22-09-2008
    Maza Faka



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

    Цитата:
    поле надо бы как-то очищать, чтобы там например, хранились последние 100 строк

    Можно так:

    Код:
    #include <GuiConstantsEx.au3>
    #include <GuiEdit.au3>
     
    $GUI = GUICreate("<Last 100 in Edit> Demo", 300, 220)
     
    $Edit = GUICtrlCreateEdit("", 20, 20, 260, 160)
     
    For $i = 1 To 100
        GUICtrlSetData($Edit, "Line Number " & $i & @CRLF, 1)
    Next
     
    GUISetState(@SW_SHOW, $GUI)
     
    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                Exit
        EndSwitch

     
        $LineCount = _GUICtrlEdit_GetLineCount($Edit)
        If $LineCount > 101 Then
            $sText = ""
            For $i = 1 To 100
                $sText &= _GUICtrlEdit_GetLine($Edit, $i) & @CRLF
            Next
     
            GUICtrlSetData($Edit, "")
            GUICtrlSetData($Edit, $sText, 1)
        EndIf
    WEnd

    Всего записей: 1420 | Зарегистр. 25-10-2006 | Отправлено: 08:37 22-09-2008 | Исправлено: Maza Faka, 08:44 22-09-2008
    Hackproof



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Замечательно, спасибо всем.

    Всего записей: 106 | Зарегистр. 24-05-2008 | Отправлено: 13:17 22-09-2008
       

    Страницы: 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

    Компьютерный форум Ru.Board » Компьютеры » Программы » AutoIT (Часть 1)
    Widok (12-01-2009 14:47): лимит страниц. продолжаем здесь


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru