[архив - Часть 2] AutoIt скрипты

Ответить
 • Просмотры: 19
Аватара пользователя
proxy

Re: [архив - Часть 2] AutoIt скрипты

Сообщение proxy »

спасибо.



от таких добавлений мои функции разростаются как на .....сникерсах и чипсах Изображение))



хм, а свою dll тут ни как не создать? что просто вызывать когда необходимо?
Аватара пользователя
Creat0R

Re: [архив - Часть 2] AutoIt скрипты

Сообщение Creat0R »

proxy


Цитата:



а свою dll тут ни как не создать? что просто вызывать когда необходимо?



Для чего? что она должна делать? ... хотя это не ко мне, я в этих Dll пока блуждаюсь сильно.
Аватара пользователя
Diamond

Re: [архив - Часть 2] AutoIt скрипты

Сообщение Diamond »

gregaz
Цитата:



И еще один похожий вопрос



и чем же он похожий? Изображение



Задачка не так проста как кажется... Для чужих окон юзаем WinMove(), но если речь о системных окнах самого AutoIT, то ИМХО штатными средствами никак, так как на время активности системного окна выполнение скрипта прерывается и изменить параметры окна не представляется возможным... Тем не менее для некоторых системных окон можно написать API-аналог, частично решающий данную проблему... Например, удалось взять контроль над
[Архив - Часть 1.3] AutoIt скрипты
, правда только в классическом исполнении - при запуске вызывается специальная функция, которая может изменить настройки этого окна. В примере меняется стартовый каталог, но аналогично на этапе инициализации можно управлять и другими параметрами.



Думаю не составит труда по тому же принципу написать аналоги FileOpenDialog() и FileSaveDialog().... конечно, если в этом есть необходимость. Изображение
Аватара пользователя
Creat0R

Re: [архив - Часть 2] AutoIt скрипты

Сообщение Creat0R »

Diamond


Цитата:



в конечном счёте в тексте остаётся только @CR который я использую в качестве разделителя



А разве \n это @CR, мне казалось что \r это @CR, а \n это @LF, именно с этого и исходили мои вопросы.



А на счёт изменения функции _FileReadToArray(), я так и не понял, зачем превращать все переводы строк и возврата каретки в символ возврата кареткми (или наоборот Изображение , не очень уж важно), потом делить всё это в массив, когда при этом, ни символ возврата каретки, ни символ перевода строки, не попадает в массив Изображение - У тебя случалось что не все строки с файла попадали в массив?



Так вроде правильнее:





Код:

Код: Выделить всё

$aArray = StringSplit(StringRegExpReplace(FileRead($hFile),"\n|\r",@LF),@LF)

По поводу функции для замены текста в файле...



Вот моя версия на подобную функцию:





Код:

Код: Выделить всё

$Ret = ReplaceText("C:\test.txt", "Old Text", "New Text")
ConsoleWrite($Ret & @LF & @extended)
Func ReplaceText($FileName, $OldText, $NewText)
     If Not FileExists($FileName) Then Return SetError(1, 0, -1)
    If $OldText = "" Then Return SetError(2, 0, 0)
    $OldText = String($OldText)
        Local $hFile = FileOpen($FileName, 0)
    Local $VarToWrite = FileRead($hFile)
    FileClose($hFile)
    If Not StringInStr($VarToWrite, $OldText) Then Return SetError(3, 0, 0)
        Local $ReplStr = StringReplace($VarToWrite, $OldText, $NewText)
    Local $Extended = @extended
        Local $hFileW = FileOpen($FileName, 2)
    FileWrite($hFileW, $ReplStr)
    FileClose($hFileW)
    Return SetError(0, $Extended, 1)
EndFunc
Аватара пользователя
Creat0R

Re: [архив - Часть 2] AutoIt скрипты

Сообщение Creat0R »

Diamond

Дааа, оказывается ты прав.... возьмём этот пример:





Код:

Код: Выделить всё

#include 
#include 
Dim $Array
FileWrite("test.txt", "Line1" & @LF & "Line2" & @CR & "Line3" & @LF & "Line4")
_FileReadToArray("test.txt", $Array)
_ArrayDisplay($Array)

Получается такой массив:





Код:

Код: Выделить всё

[1] = "Line1"
[2] = "Line2Line3"
[3] = "Line4"

Если применять этот же пример используя изменённую функцию _FileReadToArray(), то мы получаем “нормальный” массив (как и записи в файле) :





Код:

Код: Выделить всё

[1] = "Line1"
[2] = "Line2"
[3] = "Line3"
[4] = "Line4"

Вот полная функция как она, имхо, должна быть построена:





Код:

Код: Выделить всё

Func _FileReadToArray($sFilePath, ByRef $aArray)
    ;==============================================
    ; Local Constant/Variable Declaration Section
    ;==============================================
    Local $hFile = FileOpen($sFilePath, 0)
    If $hFile = -1 Then Return SetError(1)
    $aArray = StringSplit(StringRegExpReplace(FileRead($hFile),"\r|\n", @LF), @LF)
    FileClose($hFile)
    Return 1
EndFunc   ;==>_FileReadToArray

Хм.. надо бы её автору маякнуть об этом.... а ещё лучше, сразу в баг репорт запостить на оф. форум, привести пример что эта функция может возвращать не корректные данные...
Аватара пользователя
Creat0R

Re: [архив - Часть 2] AutoIt скрипты

Сообщение Creat0R »

Но всё же остаётся одна проблема - если в файле содержатся промежуточные символы перевода строки (@LF), то гинерируется пустой элемент массива...



Получается это ошибка функции StringSplit() ?
Аватара пользователя
amel27

Re: [архив - Часть 2] AutoIt скрипты

Сообщение amel27 »

Diamond
Цитата:



чтобы произвести добавление, удаление или замену элементов, массивы используют UDF-функции



Хм... Добавление в конец массива можно сделать через ReDim(), вставку в середину массива без UDF не осуществить в обоих случаях.... Физическое удаление элементов массива проводить не обязательно - достаточно "пометить" их и не использовать при обработке.... по замене не понял - это же обычное присвоение.



Diamond, Creat0R ...по поводу _FileReadToArray():



- у StringSplit() есть флаг, позволяющий использовать более одного символа для разбиения:

Код:

Код: Выделить всё

$a = StringSplit ($text, @CRLF, 1)

- уж коли зашла речь про StringRegExp(), то она вполне самодостаточна:

Код:

Код: Выделить всё

$a = StringRegExp ($text, '(?m)^(.*)$', 3)

Creat0R
Цитата:



оно вообще реализуемо?



ИМХО в общем виде - нет, иначе можно было бы без проблем подчинить себе любое окно, скажем тот же IE... Видимая "подчиненность" отражает классовую сущность окон, поэтому они должны быть как минимум в одном процессе... В случае с MsgBox() код расшарен через DLL и запускается в текущем потоке, поэтому подчинение реализуемо.
Аватара пользователя
eNcub

Re: [архив - Часть 2] AutoIt скрипты

Сообщение eNcub »

Цитата:



eNcub

Цитата:Если это окно не появляется, то нажатие стрелки вверх и энтера всё равно производится





Попробуй так:



Код:



WinWaitActive('Мастер новых подключений', 'Выберите, надо ли автоматически подключаться к Интернету', 5)

If WinActive('Мастер новых подключений', 'Выберите, надо ли автоматически подключаться к Интернету') Then Send('{UP}{ENTER}')



Изображение... попробовал, ничего не изменилось...

еще мысли есть у кого-нибудь? плз..
Аватара пользователя
XXXler

Re: [архив - Часть 2] AutoIt скрипты

Сообщение XXXler »

eNcub,



Код:

Код: Выделить всё

$Wtitle="Мастер новых подключений"
$Wtext="Выберите, надо ли автоматически подключаться к Интернету"
$Timeout=30
WinWait($Wtitle,$Wtext,$Timeout)
If WinExists($Wtitle,$Wtext) Then
  If Not WinActive($Wtitle,$Wtext) Then WinActivate($Wtitle,$Wtext)
  If WinWaitActive($Wtitle,$Wtext,$Timeout) Then Send("{UP}{ENTER}")
EndIf

если я правильно понял цель написания скрипта, то проще использовать твик реестра Изображение
Аватара пользователя
eNcub

Re: [архив - Часть 2] AutoIt скрипты

Сообщение eNcub »

XXXler



таак, а что с реестром? этот вариант тоже не прошел...
Ответить

Вернуться в «AutoIt»