Войти

Показать полную графическую версию : [архив - Часть 2] 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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

Creat0R
31-07-2007, 17:00
amel27,
замени кусок между If и EndIf:
Спасибо! всё работает как раньше!

Creat0R
02-08-2007, 04:11
Как можно послать уведомление в окно GUI, чтобы сработали все функции отзывающиеся на изменение размера окна ($GUI_EVENT_RESIZED и т.п)?

Т.е мне нужно чтобы после появления моего окна GUI, вызвалось что то вроде имитации изменения его размера (как будто бы юзер мышкой изменил размер гуи, и я говорю не про WinMove(), а про изменение с уведомлением (Notifycation)), мне это нужно для того, чтобы все контроли которым присвоено GUICtrlSetResizing(-1, $GUI_DOCKSIZE), поменяли своё положении в соответствии с текущим размером окна (данные о размере берутся с инишки).

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

amel27
02-08-2007, 07:42
Creat0R
можно примерчик?... "на слух" сложно воспринять

ADD: обещанная CallBack-функция для _FileSelectFolder:Func _MyFSFCallbackProc ($hWnd, $iMsg, $wParam, $lParam)
Local $uCB = DllStructCreate ("char[260];int", $lParam)
Switch $iMsg
Case $BFFM_INITIALIZED
DllCall ("user32.dll","int","SendMessage", _
"hwnd", $hWnd, "int", $BFFM_SETSELECTIONA, "int", 1, "ptr", DllStructGetPtr($uCB))
Case $BFFM_SELCHANGED
Local $pIDL=_IDLGetLast($wParam) ; Переход к последнему элементу списка
; Условие на допустимые для выбора типы объектов
If _IDLIsFolder($pIDL) Then
DllCall ("user32.dll","int","SendMessage","hwnd",$hWnd,"int",$BFFM_ENABLEOK,"int",0,"ptr",1)
Else
DllCall ("user32.dll","int","SendMessage","hwnd",$hWnd,"int",$BFFM_ENABLEOK,"int",0,"ptr",0)
EndIf
EndSwitch
EndFunc ;==> _MyFSFCallbackProc

; Рекурсивная функция перехода к последнему объекту списка IDL
Func _IDLGetLast($pIDL)
Local $u1 = DllStructCreate("ushort", $pIDL)
Local $u2 = DllStructCreate("ushort", $pIDL + DllStructGetData($u1,1))
If (DllStructGetData($u1,1) And DllStructGetData($u2,1)) Then Return _IDLGetLast(DllStructGetPtr($u2))
Return $pIDL
EndFunc
; Возврат типа объекта по его PIDL
Func _IDLGetType($pIDL)
Local $u = DllStructCreate("ushort;byte", $pIDL)
Return DllStructGetData($u,2)
EndFunc
; Возврат размера IDL Data
Func _IDLGetSize($pIDL)
Local $u = DllStructCreate("ushort", $pIDL)
Return DllStructGetData($u,1)
EndFunc
; Проверка: является ли объект диском
Func _IDLIsDrive($pIDL)
Local $iType = _IDLGetType($pIDL)
Return $pIDL And ($iType=0x23 Or $iType=0x25 Or $iType=0x29 Or $iType=0x2F)
EndFunc
; Проверка: входит ли буква диска в строку
Func _IDLIsDriveIn($pIDL, $sDrv)
Local $u = DllStructCreate("ushort;byte;char", $pIDL)
If _IDLIsDrive($pIDL) Then Return $pIDL And StringInStr($sDrv, DllStructGetData($u,3),2)
Return 0
EndFunc
; Проверка: является ли объектом файл
Func _IDLIsFile($pIDL)
Local $iType = _IDLGetType($pIDL)
Return $pIDL And ($iType = 0x32 Or $iType = 0x34)
EndFunc
; Проверка: является ли объектом каталог
Func _IDLIsFolder($pIDL)
Local $iType = _IDLGetType($pIDL)
Return $pIDL And ($iType = 0x30 Or $iType = 0x31)
EndFunc
; Проверка: является ли объектом компьютер
Func _IDLIsComputer($pIDL)
Local $iType = _IDLGetType($pIDL)
Return $pIDL And $iType=0x42
EndFunc
; Проверка: является ли объектом сетевой ресурс
Func _IDLIsShare($pIDL)
Local $iType = _IDLGetType($pIDL)
Return $pIDL And $iType=0xC3
EndFunc
; Проверка: является ли объектом "Рабочий стол"
Func _IDLIsDesktop($pIDL)
Local $iSize = _IDLGetSize($pIDL)
Return Not($pIDL And $iSize)
EndFunc
; Проверка: является ли объектом "Мой компьютер"
Func _IDLIsMyComputer($pIDL)
Local $u = DllStructCreate("ushort;byte;byte;byte[16]", $pIDL)
Return $pIDL And DllStructGetData($u,2)=0x1F And DllStructGetData($u,4)='0xE04FD020EA3A6910A2D808002B30309D'
EndFunc
; Проверка: является ли объектом папка "Мои документы"
Func _IDLIsMyDocuments($pIDL)
Local $u = DllStructCreate("ushort;byte;byte;byte[16]", $pIDL)
Return $pIDL And DllStructGetData($u,2)=0x1F And DllStructGetData($u,4)='0xBA8F0D4525ADD01198A80800361B1103'
EndFunc
; Проверка на соответствие регулярному выражению (только для файлов/каталогов)
Func _IDLPathRegExp($pIDL, $sRegExp)
Local $ret, $res=0, $buf = DllStructCreate("char[260]")
If $pIDL Then
$ret = DllCall ("shell32.dll", "int", "SHGetPathFromIDList", "ptr", $pIDL, "ptr", DllStructGetPtr($buf))
If $ret[0] Then $res = StringRegExp(DllStructGetData($buf,1),$sRegExp)
EndIf
Return $res
EndFunc

Creat0R
03-08-2007, 00:54
amel27,
можно примерчик?
Конечно, извеняюсь что сразу не привёл его...


#include <GuiConstants.au3>

Global $Width = 500
Global $Height = 360

$Gui = GuiCreate("Test", $Width, $Height, -1, -1, $WS_SIZEBOX+$WS_MINIMIZEBOX+$WS_MAXIMIZEBOX+$WS_BORDER)
GUIRegisterMsg(0x24, "MY_WM_GETMINMAXINFO")

$LV = GUICtrlCreateListView("Column", 20, 40, $Width-40, $Height-120)

$ButtonOK = GUICtrlCreateButton("OK", 20, $Height-60, 70, 20)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE)

$ButtonExit = GUICtrlCreateButton("Exit", 120, $Height-60, 70, 20)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE)

;Задаём новый размер ГУИ, это будет считано с инишки
$NewWidth = 700
$NewHeight = 400

$WinPosArr = WinGetPos($Gui) ;только для получения X и Y позиции
WinMove($Gui, "", $WinPosArr[0], $WinPosArr[1], $NewWidth, $NewHeight)

; Тут нужно выызвать ту самую имитацию, чтобы все контроли подстроились под новый размер.

GUISetState()

While 1
$Msg = GUIGetMsg()
Switch $Msg
Case -3, $ButtonExit
Exit
Case Else

EndSwitch
WEnd

; Функция для ограничения (минимального) размера окна гуи
Func MY_WM_GETMINMAXINFO($hWnd, $Msg, $wParam, $lParam)
Local $MINMAXINFO = DllStructCreate("int;int;int;int;int;int;int;int;int;int",$lParam)
Local $MINGuiX = 508, $MINGuiY = 368
DllStructSetData($MINMAXINFO, 7, $MINGuiX)
DllStructSetData($MINMAXINFO, 8, $MINGuiY)
Return 0
EndFunc


обещанная CallBack-функция для _FileSelectFolder:
Спасибо!

Осталось несколько уточнении :shuffle:

1. Если начальный каталог не имеет слеша на конце (\), то этот каталог не задаётся функцией, а также если начальный каталог является буквой диска, то таких слешей должно быть аж два (C:\\).
Я конечно могу это решить стандартными средствами, поставив это в начало главной функции...

If StringLen($sIniDir) <= 3 Then $sIniDir &= "\"
If StringRight($sIniDir, 1) <> "\" Or StringLen($sIniDir) <= 3 Then $sIniDir &= "\"
(Кстати, $sIniDir это опечатка? может $sInitDir? :shuffle: )...

Но просто интересно, почему так происходит?

2. Может функцию диактивирования кнопки “ОК” сделать опционально? т.е чтобы это происходило только при использовании флага $BIF_RETURNONLYFSDIRS? (Сейчас оно в любом случае срабатывает).

3. При выборе обьекта рабочего стола, кнопка “ОК” тоже деактивируется, этот обьект вроде является папкой (т.е рабочий путь)?

4. Когда используется флаг $BIF_BROWSEINCLUDEFILES (для выбора файлов), то их выбрать невозможно :( - Кнопка “ОК” не активна.

Creat0R
03-08-2007, 02:54
С файлами разобрался, добавил ещё одно условие в функцию _MyFSFCallbackProc():

If _IDLIfDrive($iType) Or _IDLIfFolder($iType) Or _IDLIfFile($iType) Then

...

EndIf

amel27
03-08-2007, 05:46
Creat0R

1. $iniDir не причем - это у $BFFM_SETSELECTIONA такие требования... поправил через RegExp
2. Думал, но есть ряд трудностей... во-первых я не нашел аналога для $BIF_BROWSEFORPRINTER, во-вторых, это снизит гибкость CallBack-функции (сейчас можно задать любые условия на объект)
3. Добавил функцию _IDLIsDesktop()

Creat0R
03-08-2007, 07:35
amel27,
поправил через RegExp
Спасибо! кстати, а можно точно также править в обратную сторону? т.е очистить все символы с левой стороны? (только то что в начале).

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

Добавил функцию _IDLIsDesktop()
Спасибо, осталось только сделать функцию типа _IDLIsMyDocuments() :shuffle: - Документы весьма важная папка :)

amel27
04-08-2007, 10:28
Creat0Rа можно точно также править в обратную сторону? т.е очистить все символы с левой стороны?конечно можно, какие нужно удалить?
В принципе это не очень важнов дефолтовую функцию удалось добавить поддержку $BIF_RETURNONLYFSDIRS для любых стилей
осталось только сделать функцию типа _IDLIsMyDocuments()добавил _IDLIsDriveIn(), _IDLIsMyComputer(), _IDLIsMyDocuments()


З.Ы. cмотрю, ты свою проблему с ресайзом решил?.. ;)

Creat0R
04-08-2007, 12:20
amel27,
какие нужно удалить?
Ну я как бы хотел это использовать в качестве параметра, т.е символ который нужно почистить будет передаваться как параметр в функции.

Ну к примеру символ |.

в дефолтовую функцию удалось добавить поддержку $BIF_RETURNONLYFSDIRS для любых стилей
А как это приминить? или я что-то не так понял? это ведь позволяет сделать опционально этот флаг?

cмотрю, ты свою проблему с ресайзом решил?
Почти, мне на оф. форуме подсказали альтернативу (и довольно простую)...


#include <GuiConstants.au3>

Global $Width = 500
Global $Height = 360

$Gui = GuiCreate("Test", $Width, $Height, -1, -1, $WS_SIZEBOX+$WS_MINIMIZEBOX+$WS_MAXIMIZEBOX+$WS_BORDER)
GUIRegisterMsg(0x24, "MY_WM_GETMINMAXINFO")

$LV = GUICtrlCreateListView("Column", 20, 40, $Width-40, $Height-120)

$ButtonOK = GUICtrlCreateButton("OK", 20, $Height-60, 70, 20)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE)

$ButtonExit = GUICtrlCreateButton("Exit", 120, $Height-60, 70, 20)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE)

GUISetState(@SW_HIDE, $Gui)

$NewWidth = 700
$NewHeight = 500

$WinPosArr = WinGetPos($Gui) ;Just for get the X and Y positions
WinMove($Gui, "", $WinPosArr[0]-(($NewWidth-$Width)/2), $WinPosArr[1]-(($NewHeight-$Height)/2), $NewWidth, $NewHeight)
GUISetState(@SW_SHOW, $Gui)

GUISetState()

While 1
$Msg = GUIGetMsg()
Switch $Msg
Case -3, $ButtonExit
Exit
Case Else

EndSwitch
WEnd

Func MY_WM_GETMINMAXINFO($hWnd, $Msg, $wParam, $lParam)
Local $MINMAXINFO = DllStructCreate("int;int;int;int;int;int;int;int;int;int",$lParam)
Local $MINGuiX = 508, $MINGuiY = 368
DllStructSetData($MINMAXINFO, 7, $MINGuiX)
DllStructSetData($MINMAXINFO, 8, $MINGuiY)
Return 0
EndFunc


Т.е сначала задать GuiSetState() (в невидимом режиме - @SW_HIDE), и только потом менять размер окна, тогда все контроли в соответствии с новым размером ГУИ меняют и своё положение).

amel27
04-08-2007, 14:13
Creat0R
я как бы хотел это использовать в качестве параметраFunc _StripLead($str, $chars)
;$chars = StringRegExpReplace($chars, '([][{}()|.?+*\\^])', '\\\1')
$chars = StringRegExpReplace($chars, '([]\\^])', '\\\1') ; укороченный вариант для классов
Return StringRegExpReplace($str,'^['& $chars &']+([^'& $chars &'])', '\1')
EndFunc
А как это приминить?да как обычно... если задан флаг, то для "калассики" работает штатный метод, а для "нового стиля" автоматом подключается CallBack-функция... для этого ей передается указатель на структуру с флагами... ну, а если флаг не задан то никаких действий не проводится... Единственное ограничение - для "нового стиля" флаг $BIF_RETURNONLYFSDIRS будет подавлять действие штатного флага $BIF_SHAREABLE, поэтому (в текущей редакции) вместе их применять нельзя.

З.Ы. к тексту _MyFSFCallbackProc() добавил функцию _IDLPathRegExp()... может быть полезна при выборе конкретных типов файлов, например "*.EXE", маска передается в формате RegExp()

ADD: зачеркнул - постоянно забываю, что $BIF_SHAREABLE не влияет на "Ок", он меняет тип выводимых объектов в дереве

Creat0R
06-08-2007, 04:28
amel27,
_StripLead...
Спасибо!
Я кстати нашёл ещё один способ как это можно сделать, только не уверен надёжен ли он:

StringRegExpReplace($Str, '\A' & $Char & '+', '')

И для конечных символов...

StringRegExpReplace($Str, $Char & '+\z', '')




как обычно... если задан флаг, то для "калассики" работает штатный метод, а для "нового стиля" автоматом подключается CallBack-функция
Я флаги вовсе не ставлю, но кнопка всё ровно не активна, как будто флаг $BIF_RETURNONLYFSDIRS используется :idontnow:

Заметил один глюк при использовании $BIF_BROWSEINCLUDEFILES - Если сразу после появления окна нажать Отмена или ОК (на выбранном элементе), то функция не сразу возвращает (проходит около секунды).

И ещё, значки для файлов (если есть таковы в начальном каталоге), все имеют иконку Internet Explorer :) - А остальные значки (для папок и системные элементы), вовсе не имеют значков, все как будто папки... это длится также около секунды, потом всё нормально становится.

amel27
06-08-2007, 07:46
Creat0R
кстати нашёл ещё один способ как это можно сделатьугу, в принципе то же самое, только у тебя для одного символа, а у меня для произвольного набора начальных символов... а "плюсик" ты правильно подметил ;) ... у себя тоже поправил, и укоротил строку замены
флаги вовсе не ставлю, но кнопка всё ровно не активнаисправил (http://forum.oszone.net/post-620304-1223.html) (с битовыми операциями намутил), и еще добавил симуляцию "селекта" для дефолтовой папки - на ней не срабатывало затенение "Ок" (так как не было сообщения $BFFM_SETSELECTION)
Если сразу после появления окна нажать Отмена или ОК (на выбранном элементе), то функция не сразу возвращает (проходит около секунды).да нет, у меня вроде без тормозов :dont-know
значки для файлов (если есть таковы в начальном каталоге), все имеют иконку Internet Explorer - А остальные значки (для папок и системные элементы), вовсе не имеют значков, все как будто папки... это длится также около секунды, потом всё нормально становится.ну, это експлорер так обновляет элементы... тут видимо ничего не поделать

Creat0R
06-08-2007, 08:57
amel27,
в принципе то же самое, только у тебя для одного символа
Да нет вроде... (для этого там и плюсик ;) ) - Я понял что ты имел в виду - если в качестве символа задана серия разных символов, то в моём случае только первое вхождение будет заменено...
Но и с ствоим методом есть небольшая проблема:

$Char = '\t'

$Char = StringRegExpReplace($Char, '([][{}()|.?+*\\^])', '\\\1')
$Ret = StringRegExpReplace("\\test", '(?i)^[' & $Char & ']+([^' & $Char & '])', '\1')

ConsoleWrite($Ret)

Т.е под символ \ подставляется ещё один такой символ (для его отмены), и тогда неверно возвращается (должно в этом случае вернуться исходное значение - без изменении, так как в начале не найдено вхождение \t).



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


;=======================================
;$Flag = 0 (или любое значение кроме 1,2, и 3) - обычная замена всех вхождении заданного символа
;$Flag = 1 - убирание заданного символа в начале $String
;$Flag = 2 - убирание заданного символа в конце $String
;$Flag = 3 - убирание заданного символа в начале и в конце $String
;
;$ReplaceAll = 0 (по умолчанию) - заменяется только первое вхождение заданного(ных) символа(ов)
;$ReplaceAll = 0 - заменяются все вхождения символов с заданой стороны (в зависимости от значения $Flag)
;=======================================
Func _StringStripChars($String, $Char, $Flag=0, $ReplaceAll=0)
If StringLen($String) = 0 Or Not StringInStr($String, $Char) Then Return SetError(1, 0, $String)
Local $Patern, $RetStr = $String
$Char = StringRegExpReplace($Char, '([][{}()|.?+*\\^])', '\\\1')
Switch $Flag
Case 1
$Patern = '(?i)\A' & $Char
If $ReplaceAll = 1 Then $Patern = '(?i)\A' & $Char & '+'
$RetStr = StringRegExpReplace($String, $Patern, '')
Return $RetStr
Case 2
$Patern = '(?i)' & $Char & '\z'
If $ReplaceAll = 1 Then $Patern = '(?i)' & $Char & '+\z'
$RetStr = StringRegExpReplace($String, $Patern, '')
Return $RetStr
Case 3
$Patern = '(?i)\A' & $Char & '|' & $Char & '\z'
If $ReplaceAll = 1 Then $Patern = '(?i)\A' & $Char & '+|' & $Char & '+\z'
$RetStr = StringRegExpReplace($String, $Patern, '')
Return $RetStr
Case Else
$String = StringReplace($String, $Char, '')
Return SetError(0, @extended, $String)
EndSwitch
Return SetError(2, 0, $String)
EndFunc


В этой функции хотелось бы реализовать ещё одну тему - чтобы в качестве $ReplaceAll можно было задать параметр для указания того, сколько символов следует убирать. Т.е если передать к примеру 3, тогда только три первых(/последних/с обоих сторон) символа (заданных через $Char) будут убираться, если же оставить этот параметр по умолчанию (0), то чтобы убирался только первый символ, для убирания всех начальных/конечных символов, задавать -1.
Это конечно можно сделать проверкой длины и т.п... но хотелось именно средствами RegExp...

исправил
Что-то я если честно запутался уже - где следует использовать функцию _MyFSFCallbackProc(), а где _FileSFCallbackProc() :dont-know

у меня вроде без тормозов
Это при использовании флага $BIF_BROWSEINCLUDEFILES? без него всё нормально.

amel27
06-08-2007, 11:49
Creat0R
должно в этом случае вернуться исходное значение - без изменении, так как в начале не найдено вхождение \tдык это уже получается замена подстроки, а не символов... у меня удаляются любые символы (из заданного множества) в любом сочетании, в твоей функции в это множество входит только один символ
В этой функции хотелось бы реализовать ещё одну тему - чтобы в качестве $ReplaceAll можно было задать параметр для указания того, сколько символов следует убирать.; $Chars - удаляемые символы
; $Flags - тип замены:
; $Flag = 0 - удаление символов по всей строке
; $Flag = 1 - удаление символов в начале строки
; $Flag = 2 - удаление символов в конце строки
; $Flag = 3 - удаление символов в начале И в конце строки
; другие значения флагов равносильны $Flag = 0, $Count=0
; $Count - количество удаляемых символов
; $Count<=0 - глобальное удаление всех вхождений (для заданных значений флагов)
Func _StringStripChars($String, $Chars, $Flag=0, $Count=0)
$Chars = StringRegExpReplace($Chars, '([]\\^])', '\\\1')
Local $Pattern = '(?i)[' & $Chars & ']', $sCnt = '{1,'& $Count &'}'
If $Count<=0 Then $sCnt='+'
If $Flag <>0 Then $Count = 0
If $Flag=1 Then $Pattern= '(?i)^['& $Chars &']'& $sCnt
If $Flag=2 Then $Pattern= '(?i)[' & $Chars &']'& $sCnt &'$'
If $Flag=3 Then $Pattern= '(?i)^['& $Chars &']'& $sCnt &'|[' & $Chars &']'& $sCnt &'$'
Return StringRegExpReplace($String, $Pattern, '', $Count)
EndFunc
Что-то я если честно запутался уже - где следует использовать функцию _MyFSFCallbackProc(), а где _FileSFCallbackProc()пока хватает штатной имхо _MyFSFCallbackProc не нужна

Creat0R
06-08-2007, 21:07
amel27,
это уже получается замена подстроки, а не символов...
Ну почему, мы как бы заменяем набор символов с определённой стороны (или с обоих), на оф форуме часто спрашивают про подобные действия, такая функция во многих случаях бывает очень полезной.

Спасибо за (довольно укороченную) функцию _StringStripChars() :) - но в ней тоже есть проблема...

К примеру:

$Ret = _StringStripChars("_test_", '-_', 1, 0)

ConsoleWrite($Ret)

Получаем на выходе test_ - а должно вернуться _test_, т.е должно заменяться только найденное в начале (из за того что указан $Flag = 1), ведь там нету символа -.

А вот к примеру если имеем такую строку: -_-_test_, то используя $Count = 1 должно вернуться -_test_

$Ret = _StringStripChars("-_-_test_", '-_', 1, 1)

ConsoleWrite($Ret)

А возвращается _-_test_ - я понимаю что заменяется только первое вхождение, но суть этой функции в том, чтобы заменялось то вхождение, которое передаётся через $Chars, вне зависимости от количества символов, т.е чтобы оно расматривалось как одно целое значение (символ).

У меня получилось это сделать обычными средствами (циклами и проверками String...), но это не так быстро как через RegExp :(.

пока хватает штатной
Спасибо, теперь всё стало ясно! в принципе больше от этой функции (я имею в виду вообще всё что касается _FileSelectFolder() ), ничего и не требуется, достигнут как говорится - идеал! :)

amel27
07-08-2007, 03:45
Creat0R
т.е чтобы оно расматривалось как одно целое значение (символ)"несколько символов как одно целое" вроде и есть строка ;) тогда и UDF должна по другому называться:; $SubString - удаляемая подстрока
; $Flags - тип замены:
; $Flag = 0 - удаление вхождений подстроки по всей строке
; $Flag = 1 - удаление вхождений подстроки в начале строки
; $Flag = 2 - удаление вхождений подстроки в конце строки
; $Flag = 3 - удаление вхождений подстроки в начале И в конце строки
; другие значения флагов равносильны $Flag = 0, $Count=0
; $Count - количество удаляемых вхождений
; $Count<=0 - глобальное удаление всех вхождений (для заданных значений флагов)
Func _StringStripString($String, $SubString, $Flag=0, $Count=0)
$SubString = StringRegExpReplace($SubString, '([][{}()|.?+*\\^])', '\\\1')
Local $Pattern = '(?i)(' & $SubString & ')', $sCnt = '{1,'& $Count &'}'
If $Count<=0 Then $sCnt='+'
If $Flag <>0 Then $Count = 0
If $Flag=1 Then $Pattern= '(?i)^('& $SubString &')'& $sCnt
If $Flag=2 Then $Pattern= '(?i)(' & $SubString &')'& $sCnt &'$'
If $Flag=3 Then $Pattern= '(?i)^('& $SubString &')'& $sCnt &'|(' & $SubString &')'& $sCnt &'$'
Return StringRegExpReplace($String, $Pattern, '', $Count)
EndFunc
достигнут как говорится - идеалтут идеала ИМХО не бывает :) ... к примеру, есть идея добавить автоматическое "раскрытие" содержимого папки для флага $BIF_BROWSEINCLUDEFILES... как ты думаешь?.. Ну и далеко не все возможности SHBrowseForFolder() еще использованы ;)

З.Ы. в функции _StringStripChars() была ошибка - слово "Pattern" кое-где было с одной "t" (исправил)

Creat0R
07-08-2007, 04:34
amel27,
тогда и UDF должна по другому называться:
Название мне нравится :) - а функционал ещё больше! Спасибо!

есть идея добавить автоматическое "раскрытие" содержимого папки для флага $BIF_BROWSEINCLUDEFILES... как ты думаешь?
Да, было бы полезно.

Кстати, теперь почему то не нужно проверять окончание начального каталога, т.е работает без тех двух добавленных строк (с ними кстати НЕ работает :) ).

в функции _StringStripChars() была ошибка - слово "Pattern" кое-где было с одной "t" (исправил)
Да, я заметил, забыл сказать ;)

amel27
07-08-2007, 11:23
Creat0R
Да, было бы полезнообломс... :( помучил я сообщение $BFFM_SETEXPANDED и мне не понравилось. Да, оно открывает папку, но не всегда - если файлов в папке многовато, то папка отображается вообще как пустая (без "плюсика"), причем не нашел возможности потом "обновить" список папок, хотя может только у меня такой глюк? Странно, что нигде в тырнете не нашел ничего подобного... Одно радует - в "классическом" варианте папка всегда открывается. Можешь сам проверить - попробуй в CallBack-функции вместо:
DllCall ("user32.dll","int","SendMessage", "hwnd", $hWnd, "int", $BFFM_SETSELECTIONA, "int", 1, "ptr", DllStructGetPtr($uCB,1))подставить:DllCall ("user32.dll","int","SendMessage", "hwnd", $hWnd, "int", $BFFM_SETEXPANDED, "int", 1, "wstr", DllStructGetData($uCB,1))
Кстати, теперь почему то не нужно проверять окончание начального каталога, т.е работает без тех двух добавленных строк (с ними кстати НЕ работает )прямо мистика... :dont-know тут я ничего не менял, хотя первую-то строчку наверное надо оставить?

spooll
07-08-2007, 12:43
Премного извиняюсь, почитал документацию, немного разобрался, стал скрипты писать, все ок, но теперь понадобилось сделать так, чтобы если программа уже установлена, то скрипт завершался, сразу не нашел , а тут страниц очень много, подскажите пожалуйста :)
Типа такого:
if exists ("c:\1c\1c.exe") Then Exit

Maza Faka
07-08-2007, 14:13
spooll,
Либо так и проверять, к примеру:

If FileExists(@ProgramFilesDir & "\MyProgram\Program.exe") Then
Exit
Else
;...Your script
EndIf


Либо проверять ключ в реестре:

If RegEnumVal("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ICQLite", 1) Then
Exit
Else
;...Your script
EndIf




© OSzone.net 2001-2012