Войти

Показать полную графическую версию : [Архив - Часть 1.3] AutoIt скрипты


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

kalikanzaros
05-01-2007, 16:03
есть ли у кого нибудь красивое решение установки alcohol120 а потом сразу lingvo11?
так как пока что у меня все это выглядит достаточно сложно и некрасиво... :(

запускаю autoit скрипты из wpi 5.6, который в свое очередь стартует из RunOnceEx.cmd который стартует с CD...
надеюсь про запуск строчка будет понятна :)

вот как сейчас это работает у меня: скрипт alcohol120 отрабатывает, а потом команда %reboot%, wpi перезагружает комп, я наивный думал что потом продолжится установка alcohol120, и только затем стартанет lingvo11, но нет, wpi запускается раньше и не дает закончить установку....
конечно можно сделать в 3 строки, что-то типа:
alcoho120.exe (без добавления в автозагрузку скрипта после перезагрузки)
%reboot%
alchol120.exe (скрипт закончит установку)

и потом начнется установка lingvo11, скрипт lingvo11 первым делом запустит установленный alcohol и даст ему секунд 5-10 для создания виртуального CD, после чего alcohol будет закрыт, а установка lingvo11 продолжена...

но мне кажется есть решение проще и красивее, нет ни у кого идей?

Diamond
05-01-2007, 17:24
Creat0R
Ты наверное заметил что во время работы цикла также недоступна обработка системного события (т.е. Выход из GUI). Я думаю, единственный путь привязать функцию к основному циклу. Может кто-то считает по другому? :)
Opt("GuiOnEventMode", 1)
#include <GUIConstants.au3>
Global $StartProgress=0, $i=0
$gui = GUICreate("Abort GUI", 420, 140, -1, -1, $WS_SIZEBOX)
$Button = GUICtrlCreateButton("Start", 180, 20, 70)
GUICtrlSetOnEvent($Button, "SetExitLoop")
GUISetOnEvent(-3, "ExitScript")
$Progress = GUICtrlCreateProgress(60, 60, 300, 15)
GUISetState(@SW_SHOW)

While 1
Sleep(10)
If $StartProgress = 1 Then
Button()
EndIf
WEnd

Func Button()
$i=$i+1
If $i=101 Then
$i=0
EndIf
GUICtrlSetData($Progress, $i)
EndFunc

Func SetExitLoop()
If $StartProgress=1 Then
$StartProgress = 0
GUICtrlSetData($Button, "Start")
Else
$StartProgress = 1
GUICtrlSetData($Button, "Abort")
EndIf
EndFunc

Func ExitScript()
Exit
EndFunc

Creat0R
06-01-2007, 00:06
Diamond_m
привязать функцию к основному циклу.
Это в каком то роде решает проблему, спасибо!

НО!, ах это "но"...

Проблема в том, что основной цикл не удобно использовать, у меня на кнопку старта, повешаны многие операции (функции, и статус бар ещё). Т.е запускается скрипт, нажимаем кнопку Старт, пускается по событию функция кнопки, в этой функции существует цикл, т.е в самом конце цикла происходит выход с него ExitLoop (обязательно), и мне нужно сделать так, чтобы в процессе выполнения всего этого цикла (показа статус бара, прогресс бара, выполнения разных функции и т.п), можно было нажать на кнопку "Аборт", и тогда должен происходить выход из цикла (не закрывая программу) - а точнее, должно выводиться сообщение с вопросом, мол хочет ли юзерь прервать операцию, и если ответить положительно, то выходим из цикла, если отрецательно, ничего не делаем, продолжаем с того же места на котором была нажата кнопка "Аборт" (тот же "Старт" переименованный)...

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

В приведённом тобой примере, функция которая вызывается по нажатию кнопки, как бы вызывается без прерывно, т.e постоянно начинается с начала, а мне нужно чтобы начало функции не происходило, при нажатии на "Аборт" просто приостанавливалось её (функции) выполнение.

Кстати, вот если не убирать иконку в трее, и оставить её функциональность по умолчанию, то при нажатии на неё появяется меню, там можно выбрать пункт Script Paused, и скрипт полностью преостанавливается - вот может можно как то точно также имитировать подобную паузу (вызвать функцию во время паузы)?

P.S
Надеюсь не запутался в объяснениях, просто уже голова пухнет от того что не могу никак сообразить, как решить эту, кажется простую задачку. :wacko:

Creat0R
06-01-2007, 01:59
ВО! такой вариант работает по нажатию на горячую клавишу (Ctrl S), почему же событие не срабатывает при нажатии на кнопку? :idontnow:



Opt("GuiOnEventMode", 1)
#include <GUIConstants.au3>
HotKeySet("^s", "SetExitLoop")

Global $ExitLoop, $Mark = 10
$gui = GUICreate("Abort GUI", 420, 140, -1, -1, $WS_SIZEBOX)
$Button = GUICtrlCreateButton("Start", 180, 20, 70)
GUICtrlSetOnEvent($Button, "Button")
GUISetOnEvent(-3, "ExitScript")

$Progress = GUICtrlCreateProgress(60, 60, 300, 15)
GUISetState(@SW_SHOW)

While 1
Sleep(100)
WEnd

Func Button()
GUICtrlSetData($Button, "Abort")
While $ExitLoop = 0
For $i = $Mark To 100
If $i = 100 Then $i = 0
GUICtrlSetData($Progress, $i)
If $ExitLoop = 1 Then
$Mark = $i
ExitLoop
EndIf
Sleep(10)
Next
WEnd
GUICtrlSetData($Button, "Start")
$ExitLoop = 0
EndFunc

Func SetExitLoop()
$ExitLoop = 1
EndFunc

Func ExitScript()
Exit
EndFunc

Diamond
06-01-2007, 04:21
Creat0R
Нужно каким то образом, заставить вызвать событие (функцию) из самого цикла
Чтобы реализовать это, придётся отказаться от Opt("GuiOnEventMode", 1), тогда опрос событий GUIGetMsg() можно будет проводить непосредственно в твоём цикле. Другого выхода не вижу. :idontnow: Возможно это не удобно с точки зрения программиста но с точки зрения функциональности скрипта - вполне приемлемо.

RemoteAdmin
06-01-2007, 13:16
Всем привет! Помогите новичку.
Вообщем возникла такая проблема. Мне нужно заменить один текст внутри exe файла, на свой.

Ну например, текст: This program cannot be run in DOS mode
Заменить на текст: <----------------AutoIT RuleZ---------------->

Я пытался использовать вот эту функцию:
Func ReplaceText($FileNameT, $OldText, $NewText)
$hFile = FileOpen($FileNameT, 0)
$aArray = StringSplit(FileRead($hFile, FileGetSize($FileNameT)), @LF)
If Not @error Then
FileClose($hFile)
$hFilew = FileOpen($FileNameT, 2)
For $iaar = 1 To $aArray[0] - 1
$ReplStrT = StringReplace($aArray[$iaar], $OldText, $NewText)
FileWrite($hFilew, $ReplStrT & @LF)
Next
FileClose($hFilew)
EndIf
EndFunc
Текст заменяется, но из конца файла отрезается маленький кусок, т.е. как я понимаю, он после разбиения файла на подстроки, не может его обратно собрать.

Я также пытался, передавать ему не простые строки текста, но и в HEX, Binary формате (BinaryString), всё равно не может ничё сделать.
На офф, форумах AutoIT нашёл функции BinaryWrite/BinaryRead, но так и не смог в них разобратся.

Не могли бы вы помочь мне, в реализации моей затеи, желательно с примерами. Спасибо.

Creat0R
06-01-2007, 16:46
Diamond_m
Чтобы реализовать это, придётся отказаться от Opt("GuiOnEventMode", 1), тогда опрос событий GUIGetMsg() можно будет проводить непосредственно в твоём цикле.
В принципе это даже очень подходит, просто отменяем проверку событии (Opt("GuiOnEventMode", 0)) перед началом цикла, а в начало цикла ставим $Msg = GuiGetMsg() - ну и потом всё что нужно обрабатываем на основе $Msg = $ID ... а в конце цикла просто включаем обратно обработку событии - вобщем, вроде проблема решена :) - спасибо.

Diamond
06-01-2007, 19:55
Creat0R
а в конце цикла просто включаем обратно обработку событииОтлично придумал!!! :victory: Это позволит не переписывать большую часть скрипта заново, а также добавит ему гибкости.

Creat0R
07-01-2007, 23:32
RemoteAdmin
из конца файла отрезается маленький кусок
Это можно поправить убрав - 1 от общего числа массива (For $iaar = 1 To $aArray[0]), но тогда в конец файла всегда будет дописываться новая строка...

Могу предложить такой вариант на функцию замены текста в файле:


Func ReplaceText($FileName, $OldText, $NewText)
If $OldText <> "" Then
$hFile = FileOpen($FileName, 0)
$VarToWrite = FileRead($hFile, FileGetSize($FileName))
$ReplStr = StringReplace($VarToWrite, $OldText, $NewText)
FileClose($hFile)
$hFilew = FileOpen($FileName, 2)
FileWrite($hFilew, $ReplStr)
FileClose($hFilew)
EndIf
EndFunc


Diamond_m
Отлично придумал!!!
Это благодаря твоим наводкам ;) - спасибо ещё раз!

Creat0R
09-01-2007, 06:05
Написал две примитивные функции - Одна предназначена для не совсем точного подсчёта скорости закачки (по InetGet), а друга на основе этой скорости закачки высчитывает сколько времени осталось до окончания (в секундах)...
НО! я полагаю что есть более точное решение этой задумке, ведь по идее, должны учитываться не просто полученные данные в интервале одной секунды, а ещё и скорость модема, скорость отдачи на сервере и т.п... вот как бы всё это расчитать, и построить точную функцию для подсчёта скорости закачки и оставшееся время до окончания? :idontnow:

Вот эти две функции и пример их применения:


;Заносим в переменную $URL ссылку на закачку.
$URL = "http://www.autoitscript.com/cgi-bin/getfile.pl?autoit3/autoit-v3.2.2.0-setup.exe"

;Берём из ссылки только имя файла.
$FileName = StringRegExpReplace($URL, "^.*/", "")

;Ставим ссылку на закачку в фоновом режиме.
InetGet($URL, "C:\" & $FileName, 1, 1)

;Получаем общий размер файла по ссылке (в байтах).
$InetGetSize = InetGetSize($URL)

;Пока файл закачивается, проверяем размер, оставшееся время, и выводим в трее результаты.
While @InetGetActive
$BytesCheckBefore = @InetGetBytesRead
Sleep(1000)
$BytesCheckAfter = @InetGetBytesRead
$SpeedByBytes = _InetGetSpeed($BytesCheckAfter, $BytesCheckBefore)
TrayTip("Download", "Approximately Remained Time (seconds): " & Round(_InetGetRemained(@InetGetBytesRead, $InetGetSize, $SpeedByBytes)), 0, 1)
WEnd

;Функция возвращает скорость скачивания на основе полученных данных (до, и после секунды) - возвращаются байты в секунду (b/s).
Func _InetGetSpeed($BytesCheckAfter, $BytesCheckBefore)
$RetSpeedByBytes = $BytesCheckAfter - $BytesCheckBefore
If $RetSpeedByBytes < 0 Then Return 0
Return $RetSpeedByBytes
EndFunc

;Функция возвращает оставшееся время в секундах (за счёт вычесления из общего размера файла и деления на скорость скачивания).
Func _InetGetRemained($Bytes, $TotalBytesSize, $SpeedByBytes)
$RemainedBytes = $TotalBytesSize - $Bytes
If $RemainedBytes <= 0 Then Return 0
Return $RemainedBytes / $SpeedByBytes
EndFunc



P.S.
Если файл около 2-ух 3-ёх MB, то функции подсчитывают довольно точно, но если речь идёт уже о 5-ти и более MB, то счётчик начинает показыать результаты в хаотичном порядке.

timon_90
09-01-2007, 12:53
Привет народ... Я в этом деле новичок, но мне нужно сделать автоматизацию не из самых простых (как для меня) :) Вообщем помогите плиз чем сможете... Что собственно нужно:
Есть кейген...
1) Нужно его запустить (сделал)
2) Нажать на кнопку Generate (не получилось, но это впринципе не обязательно)
3) Скопировать текст(ключ), который он выдал (тоже непонятно)
4) Затем создать новую запись в реестре по заданному мной пути (ну в данном случае это HKEY_LOCAL_MACHINE\SOFTWARE\Electronic Arts\EA Games\Battlefield 2\ergc)
5) Создать там параметр со стандартным именем (строковый, REG_SZ)
6) Изменить его значение на такое - x9392тотсерийникбезчёрточек
вот собственно и конец... Если никто не сможет помочь по каким либо причинам то расскажите хотя бы как делать вышеперечисленные операции :) Заранее спасибо !!!

Sanja Alone
09-01-2007, 15:29
timon_90
Для начала, прочти FAQ (http://oszone.net/display.php?id=3663)

2). Пункт 7 раздела Вввод данных / работа с элементами управления FAQ (http://oszone.net/display.php?id=3663) - ф-ция ControlClick();
3). Ф-ция ControlGetText();
4,5,6). Пункт 2 раздела Импорт данных из reg-файла в реестр FAQ (http://oszone.net/display.php?id=3663) - ф-ция RegWrite(). Заменить черточки пустотой - StringReplace("серийник с черточками","-","").

P.S. Во многих моих скриптах (http://sanjaalone.h15.ru/au3.php) выполняются подобные действия - используй их в кач-ве примера (посмотри скрипт для Alcohol, FR7, SoundForge 6 и др.)

timon_90
09-01-2007, 15:43
Сенк большой!) Если будет чёто не понятно то напишу)

Diamond
09-01-2007, 17:26
Для тех кто хочет использовать трекерную музыку в проектах AutoIt.
Трекерная музыка фактически не загружает CPU и из-за её малых размеров, пользуется популярностью программистов при написании кейгенов, кряков, трайнеров, а также инсталяторов.
Для проигрывания трекерных модулей в AutoIt я использую библиотеку BASSMOD.dll.
BASSMOD.dll (не путать с bass.dll) можно скачать c оф. сайта http://www.un4seen.com весит 33,5 КБ
Много трекерной музыки можно найти на сайте http://www.keygenmusic.net а также на http://www.websound.ru

Размещаем в папку \AutoIt3\Include\ скрипт(bassmod.au3) следующего содержания:

#include-once
; Поддерживает: .mod .xm .it .s3m .mtm
; P.S. Глобальные константы добавлены исключительно для удобства...
;---------------------------------
; Music flags:
Global Const $BASS_MUSIC_RAMP = 1 ; normal ramping
Global Const $BASS_MUSIC_RAMPS = 2 ; sensitive ramping
Global Const $BASS_MUSIC_LOOP = 4 ; loop music
Global Const $BASS_MUSIC_FT2MOD = 16 ; play .MOD as FastTracker 2 does
Global Const $BASS_MUSIC_PT1MOD = 32 ; play .MOD as ProTracker 1 does
;Global Const $BASS_MUSIC_POSRESET = 256 ; stop all notes when moving position
Global Const $BASS_MUSIC_SURROUND = 512 ;surround sound
Global Const $BASS_MUSIC_SURROUND2 = 1024 ;surround sound (mode 2)
Global Const $BASS_MUSIC_STOPBACK = 2048 ;stop the music on a backwards jump effect
;Global Const $BASS_MUSIC_CALCLEN = 8192 ;calculate playback length
Global Const $BASS_MUSIC_NONINTER = 16384 ; non-interpolated mixing
;---------------------------------
Func BassMod($dllPath,$sPath,$flag)
If $dllPath="" Or $dllPath="-1" Then
$dllPath="BASSMOD.dll"
EndIf
If Not FileExists($dllPath) Then
If Not SysFileExist($dllPath) Then
MsgBox(16,"Error","Не найден BASSMOD.dll")
Exit
EndIf
EndIf
Global $music_handle = -1
Global $BassModDll = DllOpen($dllPath)
$init = DllCall($BassModDll, "int", "BASSMOD_Init", "int", -1, _ ;device
"int", 44100, _ ;freq Hz
"int", 0) ;flag
$fName = DllStructCreate("char[255]")
DllStructSetData($fName, 1, $sPath)
$load = DllCall($BassModDll, "int", "BASSMOD_MusicLoad", "int", False, _ ;loading from memory
"ptr", DllStructGetPtr($fName), _ ;file
"int", 0, _ ;offset
"int", 0, _ ;length
"int", $flag) ;flag
$music_handle = $load[0]
$fName = 0
DllCall($BassModDll, "int:cdecl", "BASSMOD_MusicPlay", "int", $music_handle)
EndFunc
Func BassModClose()
If IsDeclared("BassModDll") Then
DllCall($BassModDll, "int:cdecl", "BASSMOD_Free", "int", $music_handle) ;clear resource
DllClose($BassModDll)
EndIf
EndFunc
; Проверка наличия указанного файла в путях переменной %Path%
Func SysFileExist($sFile)
$old=@WorkingDir
$array = StringSplit(EnvGet("PATH"),";")
For $i=1 To $array[0]
FileChangeDir($array[$i])
$get=FileExists($sFile)
If $get=1 Then ExitLoop
Next
FileChangeDir($old)
Return $get
EndFunc
Синтаксис:
BassMod($dllPath,$sPath,$flag)
$dllPath - Путь к BASSMOD.dll (Если в качестве пути указать (-1 или "") функция поищет BASSMOD.dll в текущем директории а также в путях определённых для системной переменной %path% )
$sPath - Путь к трекерному модулю
$flag - Метод обработки (см. предыдущий код: Music flags)
BassModClose() - закрывает BASSMOD.dll и выгружает музыку из памяти (Эту функцию следует вызывать при выходе из GUI)
Пример использования:

#include <GUIConstants.au3>
#include <bassmod.au3>
Opt("GUIOnEventMode", 1)
$title="BASSMOD_TEST"
$test=GUICreate($title,320,240)
GUISetOnEvent($GUI_EVENT_CLOSE,"ExitGui")
GUISetState()

BassMod(-1,"Music.xm",512+4)

While 1
Sleep(1000)
WEnd

Func ExitGui()
BassModClose()
Exit(0)
EndFunc

Creat0R
10-01-2007, 00:54
Diamond_m
Спасибо! давно искал подобное решение - оно позволяет проигрывать мелодию в фоновом режиме, и многое другое...

Примечание и вопрос:

Примечание - Если путь к BASSMOD.dll не указать полный (просто "BASSMOD.dll"), то мелодия не играет. Это можно исправить изменив немного первое условие функции BassMod, и добавив после него такую строку:

If StringRegExpReplace($dllPath, "^.*\\", "") = $dllPath Then $dllPath = @ScriptDir & "\" & $dllPath

Т.е первые две строки будут выглядеть так:

If $dllPath = "" Or $dllPath = -1 Then $dllPath = @ScriptDir & "\BASSMOD.dll"
If StringRegExpReplace($dllPath, "^.*\\", "") = $dllPath Then $dllPath = @ScriptDir & "\" & $dllPath

Вопрос:
-Я в системной папке нашёл файл BassMod.dll, возможно ли как то использовать его?

Diamond
10-01-2007, 07:53
Creat0R
Если путь к BASSMOD.dll не указать полный (просто "BASSMOD.dll"), то мелодия не играет.
Странно... У меня почему-то играет... Использую "AutoIt v 3.2.0.1" Может произошла ошибка инициализации самой библиотеки? Даже не знаю что и подумать.
Я в системной папке нашёл файл BassMod.dll, возможно ли как то использовать его?
...если при вызове функции вместо пути к BASSMOD.dll указать -1 или "" AutoIt в первую очередь поищет библиотеку в директории скрипта и не найдя его там, продолжит поиск в путях переменной %path% (обычно это WINDOWS и WINDOWS\system32) т.е. попытается инициализировать найденную тобой библиотеку. Это не желательно поскольку "неизвестный" BassMod.dll вполне может оказаться устаревшим или что нибудь ещё...
Я считаю что лучше указывать полный путь, чтобы уж знать наверняка, что играет правильный BASSMOD.dll.
P.S.
Скорее всего какая нибудь программа временно извлекла BASSMOD.dll для одноразового проигрывания музыки, а в последствии не стала его удалять. Лично я считаю такое поведение некорректным для программы, поскольку это засоряет системную папку.

Вот ещё вариант для скомпилированного скрипта с применением FileInstall() (по крайней мере как это вижу я)
Все ресурсные файлы извлекаются в @TempDir только после запуска окна справки, а после его закрытия сразу удаляются.

#include <GUIConstants.au3>
#include <bassmod.au3>
Opt("GUIOnEventMode", 1)
$title="BASSMOD_TEST"
$test=GUICreate($title,320,240)
GUISetOnEvent($GUI_EVENT_CLOSE,"ExitGui")
$CTRL_help = GUICtrlCreateButton ("", 260, 20, 30, 30,$BS_ICON)
GUICtrlSetImage($CTRL_help,"shell32.dll",23,1)
GUICtrlSetOnEvent($CTRL_help,"help")
Global $HelpStart=0
Global $lib=@TempDir & "\BASSMOD.dll"
Global $sound=@TempDir & "\moon trip.xm"
GUISetState()

While 1
Sleep(100)
WEnd

Func ExitGui()
BassModClose()
FileDelete($lib)
If @GUI_WINHANDLE = $help Then
GUIDelete()
$HelpStart=0
Else
Exit(0)
EndIf
EndFunc

Func help()
Local $size = WinGetPos("")
If $HelpStart=0 Then
Local $HelpInfo="На этом месте могла бы быть ваша реклама..." & @CRLF & _
"Но её здесь точно не будет!"
Global $help=GUICreate("О программе...",240,180,$size[0]+40,$size[1]+40,-1,$WS_EX_TOOLWINDOW,$test)
$label_help=GUICtrlCreateLabel($HelpInfo,0,0,240,180)
GUICtrlSetBkColor(-1,0x000000)
GUICtrlSetColor(-1,0x000000)
GUISetOnEvent($GUI_EVENT_CLOSE,"ExitGui")
GUISetState()
$HelpStart=1 ;защита от повторного запуска help'а
$color=0
Sleep(120)
Do
Sleep(40)
$color=$color+5
$H=StringRight(Hex($color),2)
GUICtrlSetColor ($label_help,"0x" & $H & $H & $H)
Until $color=255
FileInstall("BASSMOD.dll",$lib,1)
FileInstall("moon trip.xm",$sound,1)
BASSMOD($lib,$sound,1024+4)
; Т.к. музыка загружена в память, файл модуля можно сразу же удалить
FileDelete($sound)
EndIf
EndFunc

nadge
10-01-2007, 13:51
Добрый день.


Проблема такая. Некоторые пользователи любят во время установки программ крутить и тыкать во все стороны мышью :) У меня довольно много программ настраиваются при помощи скриптов автоит. Пользователи от этого офигевают - мышка сама ездит :)

Вобщем нужно на время установки запретить использование мыши и клавиатуры. Кто-нибудь делал так? Как это можно реализовать?

godoo
10-01-2007, 15:24
nadge все вопросы по AutoIt задавайте пожалуйста в соответствующей теме http://forum.oszone.net/thread-60616.html
Если почитать эту тему, то ответ на Ваш вопрос уже давно есть:
;блокируем мышь и клаву
If @OSType="WIN32_NT" Then BlockInput ( 1 ) включить BlockInput ( 0 )

nadge
10-01-2007, 17:19
nadge все вопросы по AutoIt задавайте пожалуйста в соответствующей теме http://forum.oszone.net/thread-60616.html
Сорри, тему заметил только после создания своей.


Спасибо за ответ.

Creat0R
14-01-2007, 14:57
Хотел было спросить, как переделать функцию для поиска в файле, чтобы искать можно было исключительно слово целиком (Match whole word only), но сначала решил немного поковыряться в ней (функция от Sanja Alone), и на моё же удивление, у меня получилось это осуществить... :yes:
Не знаю пока корректный ли мой способ, но вроде работает:



Func _FindTextInFile($iFile, $Text, $MtchWholeWrdFlag = 0, $CaseSense = 0)
If Not FileExists($iFile) Then Return -1
Dim $ret[2]
Local $File = FileOpen($iFile, 0)
$a = StringSplit(FileRead($File, FileGetSize($iFile)), @LF)
FileClose($File)

If StringIsASCII($Text) Then
For $i = 1 To UBound($a, 1) - 1
If StringInStr($a[$i], $Text, $CaseSense) Then
$ret[0] = $i
$ret[1] = $a[$i]
If $MtchWholeWrdFlag = 1 Then
$StrPos = StringInStr($ret[1], $Text)
If StringStripWS(StringMid($ret[1], $StrPos - 1, 1), 2) <> "" Or StringStripWS(StringMid($ret[1], $StrPos + StringLen($Text), 1), 2) <> "" Then $ret = 0
EndIf
Return $ret
EndIf
Next
Else
For $i = 1 To UBound($a, 1) - 1
If StringInStr(StringLower($a[$i]), StringLower($Text)) Then
$ret[0] = $i
$ret[1] = $a[$i]
If $MtchWholeWrdFlag = 1 Then
$StrPos = StringInStr(StringLower($ret[1]), StringLower($Text))
If StringStripWS(StringMid($ret[1], $StrPos - 1, 1), 2) <> "" Or StringStripWS(StringMid($ret[1], $StrPos + StringLen($Text), 1), 2) <> "" Then $ret = 0
EndIf
Return $ret
EndIf
Next
EndIf
EndFunc


Если у 3-го параметра указать 1, то поиск будет осуществляться с учётом слова целиком, если опустить этот параметр (или указать 0), то поиск будет обычный :) .

Немного переделал функцию, тепрь если искать кириллицу, то чувствительность к целому слову учитывается... но вот если проверять учитывая регистр, то для кириллицы не действует... также добавил в функцию 4-ты параметр, который определяет чувствительность к регистру букв. А также в начале функции поставил проверку на существование файла, если не существует, то возвращается -1.

P.S.
Если кто-то знает более правильный способ, или более эффективный, то буду рад узнать его ;)




© OSzone.net 2001-2012