Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


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

Последний раз редактировалось amel27, 04-08-2007 в 14:16. Причина: добавление функций

Это сообщение посчитали полезным следующие участники:

Отправлено: 07:42, 02-08-2007 | #223