Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

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

Аватара для Creat0R

Must AutoIt


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

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


amel27,
Цитата:
пример изменений в UDF для получения строки фильтра
Странно, ввожу свой фильтр, но DllStructGetData($uOFN, 7) возвращает тот, который указан в списке

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

Код: Выделить весь код
$hWnd = WinGetHandle("")
$sFilter = "Text File (*.txt)|*.txt|AutoIt v3 Script (*.au3)|*.au3|All (*.*)|*.*"

$Ret = _FileSaveDialog("Save as", "C:\", $sFilter, 18, "New Script", 2, $hWnd)

If Not @error Then MsgBox(64, "Results", StringFormat("Saved as: %s\n\nSelected Filter Index: %d", $Ret, @extended))

Func _FileSaveDialog($sTitle, $sInitDir, $sFilter = 'All (*.*)', $iOpt = 0, $sDefFile = '', $iDefFilter = 1, $hWnd = 0)
    Local $iFileLen = 65536 ; Max chars in returned string

    ; API flags prepare
    Local $iFlag = BitOR(BitShift(BitAND($iOpt, 2), -10), BitShift(BitAND($iOpt, 16), 3))

    ; Filter string to array convertion
    Local $asFLines = StringSplit($sFilter, '|')
    Local $i, $suFilter = ''

    For $i = 1 To $asFLines[0] Step 2
        If $i < UBound($asFLines) Then _
                $suFilter &= 'byte[' & StringLen($asFLines[$i]) + 1 & '];char[' & StringLen($asFLines[$i + 1]) + 1 & '];'
    Next

    ; Create API structures
    Local $uOFN = DllStructCreate('dword;int;int;ptr;ptr;dword;dword;ptr;dword' & _
            ';ptr;int;ptr;ptr;dword;short;short;ptr;ptr;ptr;ptr;ptr;dword;dword')
    Local $usTitle = DllStructCreate('char[' & StringLen($sTitle) + 1 & ']')
    Local $usInitDir = DllStructCreate('char[' & StringLen($sInitDir) + 1 & ']')
    Local $usFilter = DllStructCreate($suFilter & 'byte')
    Local $usFile = DllStructCreate('char[' & $iFileLen & ']')
    Local $usExtn = DllStructCreate('char[1]')

    For $i = 1 To $asFLines[0]
        DllStructSetData($usFilter, $i, $asFLines[$i])
    Next

    ; Set Data of API structures
    DllStructSetData($usTitle, 1, $sTitle)
    DllStructSetData($usInitDir, 1, $sInitDir)
    DllStructSetData($usFile, 1, $sDefFile)
    DllStructSetData($usExtn, 1, "")
    DllStructSetData($uOFN, 1, DllStructGetSize($uOFN))
    DllStructSetData($uOFN, 2, $hWnd)
    DllStructSetData($uOFN, 4, DllStructGetPtr($usFilter))
    DllStructSetData($uOFN, 7, $iDefFilter)
    DllStructSetData($uOFN, 8, DllStructGetPtr($usFile))
    DllStructSetData($uOFN, 9, $iFileLen)
    DllStructSetData($uOFN, 12, DllStructGetPtr($usInitDir))
    DllStructSetData($uOFN, 13, DllStructGetPtr($usTitle))
    DllStructSetData($uOFN, 14, $iFlag)
    DllStructSetData($uOFN, 17, DllStructGetPtr($usExtn))
    DllStructSetData($uOFN, 23, BitShift(BitAND($iOpt, 32), 5))

    ;Set Timer to check FileName Input for file extention
    Local $hCallBack = DllCallbackRegister ("_Check_FSD_Input", "none", "hwnd;int;int;dword")
    Local $ahTimer = DllCall("user32.dll", "int", "SetTimer", "hwnd", 0, _
            "int", TimerInit(), "int", 200, "ptr", DllCallbackGetPtr ($hCallBack))

    ; Call API function
    Local $aRet = DllCall('comdlg32.dll', 'int', 'GetSaveFileName', 'ptr', DllStructGetPtr($uOFN))
    If Not IsArray($aRet) Or Not $aRet[0] Then Return SetError(1, 0, "")

    ;Fre CallBack and kill the timer
    DllCallBackFree ($hCallBack)
    DllCall("user32.dll", "int", "KillTimer", "hwnd", 0, "int", $ahTimer)

    ;Return Results
    Local $sRet = StringStripWS(DllStructGetData($usFile, 1), 3)
    Return SetExtended(DllStructGetData($uOFN, 7), $sRet) ;@extended is the 1-based index of selected filer
EndFunc   ;==>_FileSaveDialog

Func _Check_FSD_Input($hWndGUI, $MsgID, $WParam, $LParam)
    Local $sSaveAs_Title = "[CLASS:#32770;TITLE:Save as]"

    If ControlGetFocus($sSaveAs_Title, "FolderView") = "Edit1" Then Return

    Local $sEdit_Data = ControlGetText($sSaveAs_Title, "FolderView", "Edit1")
    Local $sFilter_Ext = ControlCommand($sSaveAs_Title, "FolderView", "ComboBox3", "GetCurrentSelection")
    $sFilter_Ext = StringRegExpReplace($sFilter_Ext, ".*\(\*(.*?)\)$", "\1")

    If $sFilter_Ext = ".*" Then $sFilter_Ext = ""

    Local $sEdit_Ext = StringRegExpReplace($sEdit_Data, "^.*\.", ".")

    If $sEdit_Ext <> $sFilter_Ext And ($sEdit_Ext <> $sEdit_Data Or $sFilter_Ext <> "") Then
        $sEdit_Data = StringRegExpReplace($sEdit_Data, "\.[^.]*$", "")
        ControlSetText("[CLASS:#32770;TITLE:Save as]", "FolderView", "Edit1", $sEdit_Data & $sFilter_Ext)
    EndIf
EndFunc   ;==>_Check_FSD_Input

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 14:58, 11-02-2008 | #115