Ru-Board.club
← Вернуться в раздел «Программы»

» AutoIT

Автор: gal7
Дата сообщения: 01.10.2008 18:26

Цитата:
Не подскажите почему у меня никак не работает реакция на события в IE?
Нужно вызывать функцию в ответ на клик в окне браузера, никак этого не могу добиться. Пробую так например:

Код:
ObjEvent ($IE, "IEEvent_", "HTMLElementEvents")
Func IEEvent_onclick()
msgbox(0, 1, 1)
EndFunc



Не работает. Смотрел на msdn. Может кто-то знает как сделать?


Если это невозможно сделать подобным образом, напишите, пожалуйста, ато не ясно-либо никто не знает, либо это невозможно. Тогда мне не придется ждать впустую и буду искать что-то еще.

Добавлено:
Еще вопросик, можно ли отключить специальное значение знаков для целого словосочетания? Т.е. вместо StringRegExp("123\d45", "123\\d") писать StringRegExp("123\d45", "123\d"), чтобы нашло "123\d"? В справке не нашел такого (хотя и английского я не знаю).
Автор: ViSiToR
Дата сообщения: 01.10.2008 22:01
Maza Faka 13:32 01-10-2008
Цитата:
Знаешь, как я учил "матчасть"?

Что это такое?




Нужен совет. Имеется файл с данными (ini-структура), эти данные считываются в программе и выводятся на экран. Задача в том, чтобы при запуске программы на разных компьютерах эти данные синхронизировались, т.е запускаю прогу на компе «A», данные синхронизируются (через сеть естественно), вношу изменения в эти данные, закрываю прогу, иду на комп «B» и запускаю там эту программу (или её копию), данные опять же синхронизируются.

На данный момент сделал это очень примитивно:

При запуске проги на компе («A») проверяется файл данных в сети, если есть различия между ним и тем что на диске, заменяется им тот что на диске.

Когда программа закрывается, все внесённые изменения заливаются на сервер (заменяя файл в сети) -> через FTP UDF'ы.

Таким образом сохраняются только те данные, которые были сделаны при последнем запуске программы, не важно на каком компьютере. Это не есть гуд, т.к иногда нужно смешивать записи, добавлять новые, перезаписывая более старые при совпадении.


Я написал UDF для объединения двух файлов ini-структуры, где (опционально) перезаписываются существующие записи в одном из файлов, тот который указан в параметрах функции. Но это не то, нужна более расширенная синхронизация.

Вобщем нужны идеи, как проще реализовать подобное. Чувствую без метки для каждой записи (время создания, идентификаторы и т.п.) тут не обойтись...

Добавлено:
gal7 19:26 01-10-2008
Цитата:
почему у меня никак не работает реакция на события в IE?  

Где задаются и обрабатываются эти события? В справке (под _IE... функциями) пример не работает?


Цитата:
можно ли отключить специальное значение знаков для целого словосочетания?

Можно:


Код:
$sPattern = StringRegExpReplace("123\d", '([][{}()|.?+*\\^])', '\\\1')
$Var = StringRegExp("123\d", $sPattern)
Автор: Leagnus
Дата сообщения: 01.10.2008 22:31
Всё зависит от того, по какому признаку определять, данные из какого файла – A или Б более свежие/актуальные и т.д. Постарайся эти признаки озвучить и сократить их число до самых необходимых. А то картина не совсем ясна: какие признаки критичны, а какие нет. Как компу решить, кто из двух в дилемме лучший?

А никак нельзя один файл на серваке держать и в него всегда писать, хотя бы через временный файл, который существует на время существования процессса?
Автор: timsky
Дата сообщения: 01.10.2008 22:41
ViSiToR
Может перенести эти данные в БД? SQLite хотя бы или мускул?
Замучаешься.
Автор: ViSiToR
Дата сообщения: 01.10.2008 22:49
Leagnus 23:31 01-10-2008
Цитата:
Постарайся эти признаки озвучить и сократить их число до самых необходимых

Признаки, если бы я знал...

По сути вот структура файла:


Код: [Some Header Info 1]
Руборд=http://forum.ru-board.com
Гугель=http://googl.com

[Some Header Info 2]
.....
Автор: timsky
Дата сообщения: 01.10.2008 23:28

Цитата:
что важнее, вот в чём собственно и вопрос... то что я на компе «A» заменил Гугель Яндексом, или то что на компе «B» я всё ещё держу запись о гугле?!

А нам-то откуда знать? Тебе что важнее/нужнее? Если и сам не знаешь, то может объяснишь подробнее, что в итоге требуется от системы?
Автор: NIKZZZZ
Дата сообщения: 02.10.2008 00:08
ViSiToR

Цитата:
Вобщем нужны идеи, как проще реализовать подобное. Чувствую без метки для каждой записи (время создания, идентификаторы и т.п.) тут не обойтись...


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

Основная проблема - правильно организовать очередь на запись (одновременная модификация файла на сервере приведет к непредсказуемым результатам). Здесь необходим какой-либо общий таймер, например можно считывать время с сервера, распредилив его между компьютерами. Далее на сервере создается файл очереди, комп в предоставленное ему время (например 0-4 sec каждой минуты для первого, 6-10 второго и т.д.) добавляет себя в файл очереди, если он там один модифицирует файл и удаляет себя из очереди, или, ждет, проверяя очередь опять-же в предоставленное ему время.





Автор: NIKZZZZ
Дата сообщения: 02.10.2008 02:41
Можно так-же не перезаписывать файл на сервере, а только добавлять в его конец изменения (подобно тому, как это делается reg файлами), собрать нормальный ini из него не представляет проблем.

Автор: Maza Faka
Дата сообщения: 02.10.2008 07:04
ViSiToR

Цитата:
Что это такое?


Цитата:

Из сети
Матчасть - материальная часть. Материальная составляющая. В матчасть так же входят базовые знания, термины и понятия.

База одним словом
Автор: gal7
Дата сообщения: 02.10.2008 10:21

Цитата:
Где задаются и обрабатываются эти события? В справке (под _IE... функциями) пример не работает?


Задаются через функцию "ObjEvent" в разделе "Obj/COM Reference" основной справки, в _IE... нет установок событий. Тот пример в справке работает(но требуемого события у того интерфейса нет). Наверное с этим ничего не получиться, пробую по-другому.
Почему интересно у меня не работает другая функция, так пишу:

Код: GUISetOnEvent ($GUI_EVENT_PRIMARYUP, "IE", $hwndIE)
Func IE()
MsgBox(0,0,0)
EndFunc
Автор: ViSiToR
Дата сообщения: 02.10.2008 13:29
NIKZZZZ 01:08 02-10-2008
Цитата:
Можно использовать один параметр - номер модификации файла на сервере, добавив его в какую-либо секцию

О, это уже идея...


Цитата:
Основная проблема - правильно организовать очередь на запись

Это не проблема, программа для персональных нужд, т.е используется одним юзером (мной пока ), поэтому одновременной записи быть не может. Но мысль неплохая, пригодится для реализации програм интерактивного характера.

03:41 02-10-2008
Цитата:
Можно так-же не перезаписывать файл на сервере, а только добавлять в его конец изменения

Хм, т.е при запуске программа будет сверять изменённые данные?
Но всё же мне кажется нужно делать нечто более универсальное, добавлять на каждую записиь свой идентификатор и время последней модификации. Попробую сделать, позже отпишусь о результатах...
Автор: ViSiToR
Дата сообщения: 02.10.2008 16:39
gal7 11:21 02-10-2008
Цитата:
Почему интересно у меня не работает другая функция, так пишу

GUISetOnEvent() это функция внутреннего использования, её нельзя использовать на внешнее приложение.
Автор: gal7
Дата сообщения: 02.10.2008 19:17
Да, приехали...тупик

Добавлено:
Получилось!!! Оказывается нужно было указывать не ссылку на объект браузера, а ссылку на объект браузера.document(в данном случае).

Добавлено:
Только вот грузиться процессор стал неподетски...
Автор: ViSiToR
Дата сообщения: 02.10.2008 22:45
gal7 20:17 02-10-2008
Цитата:
приехали...тупик

Не совсем... я написал UDF: _MouseSetOnEvent(), там можно указать Hwnd параметр, и тогда будут отслеживаться события для определённого окна.


Цитата:
грузиться процессор стал неподетски

Если это цикл, то должен помочь Sleep(10).
Автор: NIKZZZZ
Дата сообщения: 02.10.2008 23:18
ViSiToR

Цитата:
Хм, т.е при запуске программа будет сверять изменённые данные?

Не совсем так. Программа будет добавлять в файл лог своей работы.
Имелся ввиду файл вида

;создан 03.10.2008 11.00
[section1]
key1=xxxx1
key2=zzzz1
[section2]
key1=xxxx2
key2=zzzz2
....
;добавлено 03.10.2008 12.10
[section1]
key1=новое значение ;(значение изменилось)
;добавлено 03.10.2008 12.11
[section1]
key3=vvvv ;(добавлен ключ)
[section2]
key2=- ;( ключ удален)

Программа либо читает последнее значение (section, key) , например регулярным выражением, либо преобразует файл к виду

;создан 03.10.2008 12.11
[section1]
key1=новое значение
key2=zzzz1
key3=vvvv
[section2]
key1=xxxx2
.....

Одновременно получаем бонус - полный лог работы. Кроме этого в коменте можно добавит разную инфу, например о пользователе, при этом можно быборочно получать обновленный файл, например игнорируя обновления определенных пользователей.




Автор: Leagnus
Дата сообщения: 03.10.2008 00:38
Интересно, можно ли средствами AutoIt определить, является ли строка в ANSI кодировке или нет, т.к. у меня строки бывают и в utf8.
Автор: ViSiToR
Дата сообщения: 03.10.2008 01:16
NIKZZZZ 00:18 03-10-2008
Цитата:
Программа будет добавлять в файл лог своей работы.
.....
Одновременно получаем бонус - полный лог работы. Кроме этого в коменте можно добавит разную инфу, например о пользователе, при этом можно быборочно получать обновленный файл, например игнорируя обновления определенных пользователей.

Идея понравилась , но придётся тогда в реальном времени записывать любое изменение, у меня же запись происходит только при выходе...

Leagnus 01:38 03-10-2008
Цитата:
можно ли средствами AutoIt определить, является ли строка в ANSI кодировке или нет

Можно, функция (_StringIsUTF8Format()) от amel27:


Код:
$sANSI_String = "Тест"
$sUTF8_String = _StringToUTF($sANSI_String)

MsgBox(64, "UTF8 -> " & $sUTF8_String, "Is UTF-8 Format = " & _StringIsUTF8Format($sUTF8_String))
MsgBox(64, "ANSI -> " & $sANSI_String, "Is UTF-8 Format = " & _StringIsUTF8Format($sANSI_String))

Func _StringIsUTF8Format($String)
Local $sAsc, $sLen = StringLen($String), $sExt = $sLen

For $i = 1 To $sLen
$sAsc
= Asc(StringMid($String, $i, 1))

If Not BitAnd($sAsc, 0x80) Then
$sExt = 0
ElseIf Not BitXOR(BitAnd($sAsc, 0xE0), 0xC0) Then
$sExt = 1
ElseIf Not(BitXOR(BitAnd($sAsc,0xF0),0xE0)) Then
$sExt = 2
ElseIf Not BitXOR(BitAnd($sAsc, 0xF8), 0xF0) Then
$sExt=3
EndIf

If
$i + $sExt > $sLen Then Return False

For
$j = $i + 1 To $i + $sExt
$sAsc
= Asc(StringMid($String, $j, 1))
If BitXOR(BitAnd($sAsc, 0xC0), 0x80) Then Return False
Next


$i += $sExt
Next

Return True
EndFunc

Func
_StringToUTF($String)
Local $sResult = "", $iCode
Local $VarUTFArr = StringSplit($String, "")

For $i = 1 To $VarUTFArr[0]
$iCode = Asc($VarUTFArr[$i])

Select
Case
$iCode >= 192 And $iCode <= 239
$VarUTFArr[$i] = Chr(208) & Chr($iCode - 48)
Case $iCode >= 240 And $iCode <= 255
$VarUTFArr[$i] = Chr(209) & Chr($iCode - 112)
Case $iCode = 168
$VarUTFArr[$i] = Chr(208) & Chr(129)
Case $iCode = 184
$VarUTFArr[$i] = Chr(209) & Chr(145)
Case Else
$VarUTFArr[$i] = Chr($iCode)
EndSelect

$sResult &= $VarUTFArr[$i]
Next

Return
$sResult
EndFunc
Автор: makarei
Дата сообщения: 03.10.2008 06:54
Подскажите пожалуйста, есть функция Run (консольной программе передаются имена файлов на вход и выход):

Run ( 'program.exe "' & $dialog1 & '" "' & $dialog2 & '"' )

Как можно посмотреть в живую, для дебаггинга, что именно отправляется в командную строку для исполнения. То есть, хочется видеть саму набранную команду, такая какая она отправляется на исполнение.

Заранее спасибо!
Автор: Maza Faka
Дата сообщения: 03.10.2008 07:51
makarei
Попробуй так:

Код:
Run(@ComSpec & ' /k program.exe "' & $dialog1 & '" "' & $dialog2 & '"' )
Автор: Leagnus
Дата сообщения: 03.10.2008 09:20

Цитата:
Можно, функция (_StringIsUTF8Format()) от amel27:

Спасибо! Также спасибо за переработанную я так понял тобой функцию от amel27 _UTF8ToAnsi, которой пользуюсь, чтобы превратить сохранённые Оперой вебстранички в доступные для не понимающих UTF8 программ.
Автор: gal7
Дата сообщения: 03.10.2008 12:31

Цитата:
Цитата:приехали...тупик

Не совсем... я написал UDF: _MouseSetOnEvent(), там можно указать Hwnd параметр, и тогда будут отслеживаться события для определённого окна.



Попробовал функцию оттуда так:

Код: _MouseSetOnEvent($MOUSE_PRIMARYUP_EVENT, "ClickBrowser")
Автор: timsky
Дата сообщения: 03.10.2008 12:43
makarei

Цитата:
Как можно посмотреть в живую, для дебаггинга, что именно отправляется в командную строку для исполнения. То есть, хочется видеть саму набранную команду, такая какая она отправляется на исполнение.

Скомпилируй это и подсунь вместо своего ЕХЕ:

Цитата:
MsgBox (64, 'Командная строка:', '[' & $CmdLineRaw & ']')
Автор: ViSiToR
Дата сообщения: 03.10.2008 13:36
gal7 13:31 03-10-2008
Цитата:
когда происходит клик почему-то все потом "зависает"

Это бывает... исправить пока не удаётся
Автор: gregaz
Дата сообщения: 03.10.2008 21:59
Может кто знает как записать ID3 теги в МР3 файл средствами AutoIT ?
И вообще можно ли это ?
Автор: ViSiToR
Дата сообщения: 03.10.2008 22:20
gregaz 22:59 03-10-2008
Цитата:
как записать ID3 теги в МР3 файл средствами AutoIT ?

С использованием сторонней DLL: http://www.autoitscript.com/forum/index.php?showtopic=54117
Автор: gregaz
Дата сообщения: 03.10.2008 22:38

Цитата:
С использованием сторонней DLL: http://www.autoitscript.com/forum/index.php?showtopic=54117

Решение там вроде недоработано
Читает теги нормально,а пишет некорректно , постоянно дает системные ошибки бывает запишет , но сразу же выгружает скрипт
По моему некорректно испольуется сама cddbcontrol.dll
Уже с месяц бьюсь с ней не могу понять ,что ей не нравится .


Автор: ViSiToR
Дата сообщения: 04.10.2008 01:20
gregaz 23:38 03-10-2008
Цитата:
Решение там вроде недоработано

Я как то переделал для себя (Startup, т.е регистрация Dll'ки выполнялась не правильно), у меня тоже при использовании в скрипте вызывало крах, но так и не смог выявить причину, подозреваю что как то связанно со специфическими символами в тегах, ну или с путями к файлам...

Вобщем вот моя версия UDF'ов (плюс пример):

[more=Подробнее]

Код: #include <Array.au3> ;Only for displaying the results

Global $CddbControl_Dll = @ScriptDir & '\CddbControl.dll'
Global $File = @ScriptDir & '\Some File.mp3'

;Startup the CddbControl
_CddbControl_Startup()
_CddbControl_Error_Handler(@error, 'CddbControl.dll Not Found!', 1)

;Get all tags into array and show them...
$aOld_Tags = _CddbControl_GetID3Tag($File)
_CddbControl_Error_Handler(@error, 'There was an error (%i) to get an array with ID3 tags.', 1)

_ArrayDisplay($aOld_Tags, '_CddbControl_GetID3Tag')

;Set "Title" tag to "_CddbControl Title"
_CddbControl_SetID3Tag($File, 'Title', '_CddbControl Title')
_CddbControl_Error_Handler(@error, 'There was an error (%i) to set ID3 tag (Title).', 1)

;Get all tags with new value into array and show them...
$aNew_Tags = _CddbControl_GetID3Tag($File)
_CddbControl_Error_Handler(@error, 'There was an error (%i) to get an array with ID3 tags.', 1)

_ArrayDisplay($aNew_Tags, '_CddbControl_GetID3Tag')

;Set back the original "Title" tag value
_CddbControl_SetID3Tag($File, 'Title', $aOld_Tags[1][1])
_CddbControl_Error_Handler(@error, 'There was an error (%i) to set ID3 tag (Title).', 1)

;Show the "Title" tag (to see if it was restored back)
MsgBox(64, 'Results', 'Old Title: ' & _CddbControl_GetID3Tag($File, 'Title'))

;Shutdown the CddbControl
_CddbControl_Shutdown()

Func _CddbControl_Startup()
If Not FileExists($CddbControl_Dll) Then Return SetError(-1, 0, 0)

RunWait('Regsvr32.exe /s /i "' & $CddbControl_Dll & '"', @WindowsDir)
Return 1
EndFunc ;==>_CddbControl_Startup

Func _CddbControl_Shutdown()
If Not FileExists($CddbControl_Dll) Then Return SetError(-1, 0, 0)

Run('Regsvr32.exe /s /u ' & $CddbControl_Dll, @WindowsDir)
Return 1
EndFunc ;==>_CddbControl_Shutdown

Func _CddbControl_GetID3Tag($sFile, $sTag = "")
Local $oId3 = ObjCreate("CDDBControl.CddbID3Tag")

If Not IsObj($oId3) Then Return SetError(1, 0, "")
If Not FileExists($sFile) Then Return SetError(2, 0, "")

$oId3.LoadFromFile($sFile, False)

Local $aRet_Tags[16][2]
$aRet_Tags[0][0] = 15

$aRet_Tags[1][0] = 'Title'
$aRet_Tags[1][1] = $oId3.Title
$aRet_Tags[2][0] = 'LeadArtist'
$aRet_Tags[2][1] = $oId3.LeadArtist
$aRet_Tags[3][0] = 'Album'
$aRet_Tags[3][1] = $oId3.Album
$aRet_Tags[4][0] = 'TrackPosition'
$aRet_Tags[4][1] = $oId3.TrackPosition
$aRet_Tags[5][0] = 'Year'
$aRet_Tags[5][1] = $oId3.Year
$aRet_Tags[6][0] = 'Genre'
$aRet_Tags[6][1] = $oId3.Genre
$aRet_Tags[7][0] = 'Comments'
$aRet_Tags[7][1] = $oId3.Comments
$aRet_Tags[8][0] = 'Label'
$aRet_Tags[8][1] = $oId3.Label
$aRet_Tags[9][0] = 'FileId'
$aRet_Tags[9][1] = $oId3.FileId
$aRet_Tags[10][0] = 'ISRC'
$aRet_Tags[10][1] = $oId3.ISRC
$aRet_Tags[11][0] = 'CopyrightHolder'
$aRet_Tags[11][1] = $oId3.CopyrightHolder
$aRet_Tags[12][0] = 'CopyrightYear'
$aRet_Tags[12][1] = $oId3.CopyrightYear
$aRet_Tags[13][0] = 'PartOfSet'
$aRet_Tags[13][1] = $oId3.PartOfSet
$aRet_Tags[14][0] = 'Movie'
$aRet_Tags[14][1] = $oId3.Movie
$aRet_Tags[15][0] = 'BeatsPerMinute'
$aRet_Tags[15][1] = $oId3.BeatsPerMinute

If $sTag <> "" Then
For
$i = 1 To 15
If $aRet_Tags[$i][0] = $sTag Then Return $aRet_Tags[$i][1]
Next

Return
SetError(3, 0, "")
EndIf

Return
$aRet_Tags
EndFunc ;==>_CddbControl_GetID3Tag

;===============================================================================================================
; 'TitleAlbum', 'Movie', 'Title', 'CopyrightYear', 'CopyrightHolder', 'Comments', 'Label', 'BeatsPerMinute',
; 'LeadArtist', 'PartOfSet', 'TrackPosition', 'Year', 'Genre', 'FileId', 'ISRC'
;================================================================================================================

Func _CddbControl_SetID3Tag($sFile, $sTag, $sValue)
Local $oId3 = ObjCreate("CDDBControl.CddbID3Tag")

If Not IsObj($oId3) Then Return SetError(1, 0, 0)
If Not FileExists($sFile) Then Return SetError(2, 0, 0)

; False means open for read-write
$oId3.LoadFromFile($sFile, False)

Switch $sTag
Case 'TitleAlbum'
$oId3.Album = $sValue
Case 'LeadArtist'
$oId3.LeadArtist = $sValue
Case 'Title'
$oId3.Title = $sValue
Case 'TrackPosition'
$oId3.TrackPosition = $sValue
Case 'Year'
$oId3.Year = $sValue
Case 'Genre'
$oId3.Genre = $sValue
Case 'Comments'
$oId3.Comments = $sValue
Case 'Label'
$oId3.Label = $sValue
Case 'FileID'
$oId3.FileId = $sValue
Case 'IRSC'
$oId3.ISRC = $sValue
Case 'CopyrightHolder'
$oId3.CopyrightHolder = $sValue
Case 'CopyrightYear'
$oId3.CopyrightYear = $sValue
Case 'PartOfSet'
$oId3.PartOfSet = $sValue
Case 'Movie'
$oId3.Movie = $sValue
Case 'BeatsPerMinute'
$oId3.BeatsPerMinute = $sValue
Case Else
Return
SetError(3, 0, 0)
EndSwitch

$oId3.SaveToFile($sFile)

Return 1
EndFunc ;==>_CddbControl_SetID3Tag

Func _CddbControl_Error_Handler($iError, $sErrMsg, $iExit = 1)
If $iError = 0 Then Return

If
$iExit Then $sErrMsg &= @CRLF & @CRLF & 'OK ==> EXIT'
MsgBox(262144 + 16, 'CddbControl Error', StringFormat($sErrMsg, $iError))

If $iExit Then Exit _CddbControl_Shutdown()
EndFunc ;==>_CddbControl_Error_Handler
Автор: Hackproof
Дата сообщения: 04.10.2008 03:34
Давно как-то придумал процедуру обновления программы, которая выкачивает с FTP SFX-архив с новой версией. Сначала сделал запуск через батник, который пингует что-то для задержки, потом запускает архив. Этот вариант глючил где-то в 30% случаев, и сейчас переписал код так:

Код: ...Получение сигнала на обновление...
...Закачка файла...
run("c:\scripts\update.exe")
exit
Автор: ViSiToR
Дата сообщения: 04.10.2008 04:37
Hackproof 04:34 04-10-2008
Цитата:
Как бы скрипту успеть выйти без использования промежуточных файлов?


Вот так можно:


Код:
Run(@ComSpec & ' /c ping -n 2 localhost > nul & Start "" "c:\scripts\update.exe"', '', @SW_HIDE)
Exit
Автор: timsky
Дата сообщения: 04.10.2008 13:10
Hackproof
А я бы запускал апдейтер. А в нем поставил бы ожидание закрытия приложения в цикл.. мало ли:

Цитата:
While ProcessExists('program.exe')
Sleep (100)
Wend

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192

Предыдущая тема: Quintura Search


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.