Показать полную графическую версию : [Архив - Часть 1.3] AutoIt скрипты
ChVL
AutoIt принципиально не переваривает кириллицу в директории
Ну почему, в случае с FileInstall очень даже переваривает, возможно неверно указаны параметры функции? первый параметр не должен содержать переменных и/или макросов, только чистый текст.
Функция WinSetState оказалась несовместимой с WinWaitActive
Если нам нужно скрыть окна, то WinWaitActive ни к чему, окно никогда не будет активным :) - но вот WinWait может помочь, оно позволит ожидать окно, т.е ожидать его появление, а не активность...
WinWait("Title", "", 5)
WinSetState("Title", "", @SW_HIDE)
Функции (и пример использования) для отображения стильного диалога “О Программе”
#include <GUIConstants.au3>
$Title = "About Info"
$MainLabel = "My program Name"
$CopyRLabel = "Copyright © " & @YEAR & " Company/Author. All rights reserved."
$NameURL1 = "App Web Page"
$URL1 = "http://www.autoitscript.com"
$NameURL2 = "Email"
$URL2 = "mailto:my_email@mail.com"
$NameURL3 = "Some additional link"
$URL3 = "http://personalwebpafe.com"
$LinkColor = 0x0000FF
$BkColor = 0xFFFFFF
$ParentGui = GUICreate('Parent For "About Program" Demo')
$Menu = GUICtrlCreateMenu("Help")
$AboutItem = GUICtrlCreateMenuitem("About...", $Menu)
GUISetState()
While 1
Switch GUIGetMsg()
Case -3
Exit
Case $AboutItem
_About($Title, $MainLabel, $CopyRLabel, "v1.0", $NameURL1, $URL1, $NameURL2, $URL2, $NameURL3, $URL3, @AutoItExe, $LinkColor, $BkColor, -1, -1, -1, -1, $ParentGui)
EndSwitch
WEnd
Func _About($Title, $MainLabel, $CopyRLabel, $VerLabel, $NameURL1, $URL1, $NameURL2, $URL2, $NameURL3, $URL3, $IconFile="", $LinkColor=0x0000FF, $BkColor=0xFFFFFF, $Left=-1, $Top=-1, $Style=-1, $ExStyle=-1, $Parent=0)
Local $OldEventOpt = Opt("GUIOnEventMode", 0)
Local $OldRunErrOpt = Opt("RunErrorsFatal", 0)
Local $GUI, $LinkTop=120, $Msg, $CurInfo
Local $CurIsOnCtrlArr[1]
Local $LinkVisitedColor[4] = [3, $LinkColor, $LinkColor, $LinkColor]
Local $LinkLabel[4]
WinSetState($Parent, "", @SW_DISABLE)
If $ExStyle = -1 Then $ExStyle = ""
$GUI = GUICreate($Title, 320, 240, $Left, $Top, $Style, 0x00000080+$ExStyle, $Parent)
GUISetBkColor($BkColor)
GUICtrlCreateLabel($MainLabel, 40, 20, 280, 25, 1)
GUICtrlSetFont(-1, 16)
GUICtrlCreateIcon($IconFile, 0, 10, 20)
GUICtrlCreateGraphic(5, 75, 310, 3, $SS_ETCHEDFRAME)
For $i = 1 To 3
$LinkLabel[$i] = GUICtrlCreateLabel(Eval("NameURL" & $i), 150, $LinkTop, 145, 15, 1)
GUICtrlSetCursor(-1, 0)
GUICtrlSetColor(-1, $LinkColor)
GUICtrlSetFont(-1, 9, 400, 0)
GUICtrlSetTip(-1, Eval("URL" & $i))
$LinkTop += 30
Next
GUICtrlCreateLabel("Program version: " & @LF & $VerLabel, 10, 130, 150, 35, 1)
GUICtrlSetFont(-1, 10, 600, 0, "Tahoma")
GUICtrlCreateLabel($CopyRLabel, 0, 220, 320, -1, 1)
GUISetState(@SW_SHOW, $GUI)
While 1
$Msg = GUIGetMsg()
If $Msg = -3 Then ExitLoop
For $i = 1 To 3
If $Msg = $LinkLabel[$i] Then
While 1
GUISetCursor(0, 1, $GUI)
If GUIGetMsg() = $GUI_EVENT_PRIMARYUP Then
$CurInfo = GUIGetCursorInfo($GUI)
If $CurInfo[4] = $LinkLabel[$i] Then
GUISetCursor(-1, 0, $GUI)
$LinkVisitedColor[$i] = 0xAC00A9
GUICtrlSetColor($LinkLabel[$i], $LinkVisitedColor[$i])
ShellExecute(Eval("URL" & $i))
EndIf
ExitLoop
EndIf
WEnd
GUISetCursor(-1, 0, $GUI)
EndIf
Next
If WinActive($GUI) Then
For $i = 1 To 3
ControlHover($GUI, $LinkLabel[$i], $i, $CurIsOnCtrlArr, 0xFF0000, $LinkVisitedColor[$i])
Next
EndIf
WEnd
WinSetState($Parent, "", @SW_ENABLE)
GUIDelete($GUI)
Opt("GUIOnEventMode", $OldEventOpt)
Opt("RunErrorsFatal", $OldRunErrOpt)
EndFunc
Func ControlHover($hWnd, $CtrlID, $CtrlNum, ByRef $CurIsOnCtrlArr, $HoverColor=0xFF0000, $LinkColor=0x0000FF)
Local $CursorCtrl = GUIGetCursorInfo($hWnd)
ReDim $CurIsOnCtrlArr[UBound($CurIsOnCtrlArr)+1]
If $CursorCtrl[4] = $CtrlID And $CurIsOnCtrlArr[$CtrlNum] = 1 Then
GUICtrlSetFont($CtrlID, 9, 400, 6)
GUICtrlSetColor($CtrlID, $HoverColor)
$CurIsOnCtrlArr[$CtrlNum] = 0
ElseIf $CursorCtrl[4] <> $CtrlID And $CurIsOnCtrlArr[$CtrlNum] = 0 Then
GUICtrlSetFont($CtrlID, 9, 400, 0)
GUICtrlSetColor($CtrlID, $LinkColor)
$CurIsOnCtrlArr[$CtrlNum] = 1
EndIf
EndFunc
Пример Gui-оболочки для консольных конверторов
У меня накопилось с десяток консольных программ типа: архиваторы, конверторы звуковых и графических файлов и т.п. и я подумал, что неплохо было бы для них написать Gui.
Цели, которые я поставил при написании:
1. Список для добавляемых файлов должен быть ListView, при чем с поддержкой перетаскивания файлов (Drag&Drop)
2. Каждый новый Файл должен добавляться в конец списка, а как следствие - сортировка ListView запрещена.
3. В списке не должно быть дубликатов файловых путей.
Это только стартовый интерфейс, но надеюсь он кому-то сэкономит время в написании подобных программ. :)
#include <GUIConstants.au3>
#include <GuiListView.au3>
Opt("GUIOnEventMode",1)
Opt("TrayIconHide",1)
Global Const $WM_DROPFILES = 0x233
Global $StringCount=0
Global $Dict=ObjCreate("Scripting.Dictionary") ; <- Словарь
$hGUI=GUICreate("Конвертор ;)",600,500,-1,-1,-1,$WS_EX_ACCEPTFILES)
GUISetOnEvent($GUI_EVENT_CLOSE,"Quit")
$listview=GUICtrlCreateListView ("Файл|Путь",5,5,590,450,BitOR($LVS_NOSORTHEADER,$LVS_SHOWSELALWAYS))
$ButtonDelete=GUICtrlCreateButton("Удалить",250,465,80,24)
GUICtrlSetOnEvent(-1,"StrDelete")
$ButtonAdd=GUICtrlCreateButton("Добавить",120,465,80,24)
GUICtrlSetOnEvent(-1,"AddOpenFiles")
GUISetState(@SW_SHOWNORMAL)
;~ Регистрируем событие Drag&Drop
GUIRegisterMsg ($WM_DROPFILES, "DropFiles")
While 1
Sleep(1000)
WEnd
;~ Выход из приложения
Func Quit()
Exit(0)
EndFunc
;~ Этот функция была взята с официального форума или... точно не помню ;)
;~ Создаёт массив $gaDropFiles, из файлов полученный при перетаскивании
;~ Вызывается событием, прописанным в GUIRegisterMsg()
Func DropFiles($hWnd, $msgID, $wParam, $lParam)
Local $nSize, $pFileName, $gaDropFiles[1]
Local $nAmt = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", 0xFFFFFFFF, "ptr", 0, "int", 255)
For $i = 0 To $nAmt[0] - 1
$nSize = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", 0, "int", 0)
$nSize = $nSize[0] + 1
$pFileName = DllStructCreate("char[" & $nSize & "]")
DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", DllStructGetPtr($pFileName), "int", $nSize)
ReDim $gaDropFiles[$i+1]
$gaDropFiles[$i] = DllStructGetData($pFileName, 1)
$pFileName = 0
Next
Call ("AddDropedFiles", $gaDropFiles)
EndFunc
;~ Добавляет в ListViev файлы, полученные с помощью перетаскивания (Drag&Drop)
;~ Является продолжением функции DropFiles()
Func AddDropedFiles($gaDropFiles)
Call ("DictionaryAdd")
Local $Count=$StringCount
For $o In $gaDropFiles
If Not $Dict.Exists($o) Then
_GUICtrlListViewInsertItem($listview, $Count, GetFileName($o) & '|' & $o)
Call ("AutoSize")
$Count=$Count+1
EndIf
Next
$Dict.RemoveAll
EndFunc
;~ Добавляет файлы в ListViev с помощью FileOpenDialog()
;~ Вызывается кнопкой
Func AddOpenFiles()
$FilePath = FileOpenDialog("Открыть","","Wave файлы (*.wav) | Все файлы (*.*)",4+1)
If @error <> 1 Then
Local $array = StringSplit($FilePath, "|")
Local $Count = $StringCount
If $array[0]>1 Then
$path=$array[1]
Call ("DictionaryAdd")
For $i=2 To $array[0]
$FullPath=$path & "\" & $array[$i]
If Not $Dict.Exists($FullPath) Then
_GUICtrlListViewInsertItem($listview, $Count, $array[$i] & '|' & $FullPath)
Call ("AutoSize")
$Count=$Count+1
EndIf
Next
ElseIf $array[0]=1 Then
Call ("DictionaryAdd")
If Not $Dict.Exists($array[1]) Then
_GUICtrlListViewInsertItem($listview, $StringCount, GetFileName($array[1]) & '|' & $array[1])
Call ("AutoSize")
Endif
EndIf
$Dict.RemoveAll
EndIf
EndFunc
;~ Удаляет выбранные элементы в ListViev
;~ Вызывается кнопкой
Func StrDelete()
_GUICtrlListViewDeleteItemsSelected($listview)
If _GUICtrlListViewGetItemCount($listview) Then AutoSize()
EndFunc
;~ ========================
;~ Вспомогательные функции:
;~ ========================
; Возвращает имя файла или папки из пути
;~ Вызывается некоторыми функциями
Func GetFileName($FilePath)
If StringRight($FilePath,1)="\" Then
$FilePath=StringTrimRight($FilePath,1)
EndIf
Return StringTrimLeft($FilePath,StringInStr($FilePath,"\",0,-1))
EndFunc
;~ Изменяет размеры колонок в ListViev
;~ Вызывается некоторыми функциями
Func AutoSize()
_GUICtrlListViewSetColumnWidth($listview,1,$LVSCW_AUTOSIZE)
_GUICtrlListViewSetColumnWidth($listview,0,$LVSCW_AUTOSIZE)
EndFunc
;~ Добавляет в словарь все элементы второй колонки ListViev (Пути к файлам)
;~ З.Ы. Поиск дубликатов по словарю, значительно быстрее чем перебор-сравнение в массиве!
Func DictionaryAdd()
$StringCount=_GUICtrlListViewGetItemCount($listview)
For $i=0 To $StringCount
$Item = _GUICtrlListViewGetItemTextArray ($listview, $i)
If IsArray($Item) Then
$Dict.Add($Item[2],"")
EndIf
Next
EndFunc
;~ ---------------------------------------------
;~ Позволят получить файловое расширение из пути или имени файла.
;~ Это единственная функция которая нигде не используется!
Func FileGetExtension($name)
Local $Count=StringInStr($name,".",0,-1)
If $Count=0 Then
Return 0
Else
Return StringTrimLeft($name,$Count)
EndIf
EndFunc
Diamond
Этот функция была взята с официального форума или... точно не помню ;)
Да да, иименно от туда, я и сам ей пользуюсь с удовольствием :), взял тоже именно с оф. форума (её наисал кажется gafrost).
У меня почему то при вызове $dict.Exists скрипт выпадает с ошибкой:
The requested action with this object has failed.
Вобщем я немного изменил скрипт, надеюсь что в лучшую сторону, изменения таковы:
-Функцию _FileOpenDialog() добавил самдельную (от amel27) - позволяет открыть диалог для выбора файла как дочерний диалог ГУИ.
-Добавил функцию для поиска в самом ListView, имхо, так надёжнее, и не так уж намного медленнее ;)
-Во всех функциях где добавляются новые айтемы (файлы), вызывается AutoSize на каждый добавляемый файл, хотя логичнее бдет вызвать один раз эту функцию по оканчанию добавления всех файлов.
-Теперь при добавлении файлов используя перетаскивание, существующие в списке файлы будут подсвечиваться (выделяться) - так думаю более удобно :).
-Функцию GetFileName() немного укоротил ;)
-Добавил отображение иконок для добавляемых файлов, иконки определяются используя функцию _FileGetIcon() (тоже где то на оф. форуме нашел, правда немного изменил).
-Чтобы можно было присваивать иконки айтемам, пришлось вместо вставки айтемов, создавать их встроенными средствами, т.к требуется ControlID.
Вот что получилось:
#include <GUIConstants.au3>
#include <GuiListView.au3>
Opt("GUIOnEventMode",1)
Opt("TrayIconHide",1)
Global Const $WM_DROPFILES = 0x233
Global $StringCount=0
Global $Dict=ObjCreate("Scripting.Dictionary") ; <- Словарь
$hGUI=GUICreate("Конвертор ;)",600,500,-1,-1,-1,$WS_EX_ACCEPTFILES)
GUISetOnEvent($GUI_EVENT_CLOSE,"Quit")
$listview=GUICtrlCreateListView ("Файл|Путь",5,5,590,450,BitOR($LVS_NOSORTHEADER,$LVS_SHOWSELALWAYS))
$ButtonDelete=GUICtrlCreateButton("Удалить",250,465,80,24)
GUICtrlSetOnEvent(-1,"StrDelete")
$ButtonAdd=GUICtrlCreateButton("Добавить",120,465,80,24)
GUICtrlSetOnEvent(-1,"AddOpenFiles")
GUISetState(@SW_SHOWNORMAL)
;~ Регистрируем событие Drag&Drop
GUIRegisterMsg ($WM_DROPFILES, "DropFiles")
While 1
Sleep(1000)
WEnd
;~ Выход из приложения
Func Quit()
Exit(0)
EndFunc
;~ Этот функция была взята с официального форума или... точно не помню ;)
;~ Создаёт массив $gaDropFiles, из файлов полученный при перетаскивании
;~ Вызывается событием, прописанным в GUIRegisterMsg()
Func DropFiles($hWnd, $msgID, $wParam, $lParam)
Local $nSize, $pFileName, $gaDropFiles[1]
Local $nAmt = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", 0xFFFFFFFF, "ptr", 0, "int", 255)
For $i = 0 To $nAmt[0] - 1
$nSize = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", 0, "int", 0)
$nSize = $nSize[0] + 1
$pFileName = DllStructCreate("char[" & $nSize & "]")
DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", DllStructGetPtr($pFileName), "int", $nSize)
ReDim $gaDropFiles[$i+1]
$gaDropFiles[$i] = DllStructGetData($pFileName, 1)
$pFileName = 0
Next
Call ("AddDropedFiles", $gaDropFiles)
EndFunc
;~ Добавляет в ListViev файлы, полученные с помощью перетаскивания (Drag&Drop)
;~ Является продолжением функции DropFiles()
Func AddDropedFiles($gaDropFiles)
Local $SelCount = 1, $LVIID, $IconFile, $IconID
For $o In $gaDropFiles
$FindPathInLV = _FindInListView($listview, 1, $o)
If $FindPathInLV = -1 Then
$LVIID = GUICtrlCreateListViewItem(GetFileName($o) & '|' & $o, $listview)
_FileGetIcon($IconFile, $IconID, $o)
GUICtrlSetImage($LVIID, $IconFile, $IconID)
Else
If $SelCount = 1 Then ControlListView($hGUI, "", $listview, "SelectClear")
_GUICtrlListViewSetItemSelState($listview, $FindPathInLV)
$SelCount = -1
EndIf
Next
If $SelCount = -1 Then ControlFocus($hGUI, "", $listview)
Call ("AutoSize")
EndFunc
;~ Добавляет файлы в ListViev с помощью FileOpenDialog()
;~ Вызывается кнопкой
Func AddOpenFiles()
$FilePath = _FileOpenDialog("Открыть","","Wave файлы (*.wav) | Все файлы (*.*)",4+1, "", "", $hGUI)
If Not @error Then
$FilePath = StringStripCR($FilePath)
Local $array = StringSplit($FilePath, "|")
Local $LVIID, $IconFile, $IconID
If $array[0]>1 Then
$path=$array[1]
For $i=2 To $array[0]
$FullPath=$path & "\" & $array[$i]
If _FindInListView($ListView, 1, $FullPath) = -1 Then
$LVIID = GUICtrlCreateListViewItem($array[$i] & '|' & $FullPath, $listview)
_FileGetIcon($IconFile, $IconID, $FullPath)
GUICtrlSetImage($LVIID, $IconFile, $IconID)
EndIf
Next
ElseIf $array[0]=1 Then
If _FindInListView($ListView, 1, $array[1]) = -1 Then
$LVIID = GUICtrlCreateListViewItem(GetFileName($array[1]) & '|' & $array[1], $listview)
_FileGetIcon($IconFile, $IconID, $array[1])
GUICtrlSetImage($LVIID, $IconFile, $IconID)
EndIf
EndIf
Call ("AutoSize")
EndIf
EndFunc
;~ Удаляет выбранные элементы в ListViev
;~ Вызывается кнопкой
Func StrDelete()
_GUICtrlListViewDeleteItemsSelected($listview)
If _GUICtrlListViewGetItemCount($listview) Then AutoSize()
EndFunc
;~ ========================
;~ Вспомогательные функции:
;~ ========================
; Возвращает имя файла или папки из пути
;~ Вызывается некоторыми функциями
Func GetFileName($FilePath)
Return StringRegExpReplace($FilePath, "^.*\\", "")
EndFunc
;~ Изменяет размеры колонок в ListViev
;~ Вызывается некоторыми функциями
Func AutoSize()
_GUICtrlListViewSetColumnWidth($listview,1,$LVSCW_AUTOSIZE)
_GUICtrlListViewSetColumnWidth($listview,0,$LVSCW_AUTOSIZE)
EndFunc
;~ Добавляет в словарь все элементы второй колонки ListViev (Пути к файлам)
;~ З.Ы. Поиск дубликатов по словарю, значительно быстрее чем перебор-сравнение в массиве!
Func DictionaryAdd()
$StringCount=_GUICtrlListViewGetItemCount($listview)
For $i=0 To $StringCount
$Item = _GUICtrlListViewGetItemTextArray ($listview, $i)
If IsArray($Item) Then
$Dict.Add($Item[2],"")
EndIf
Next
EndFunc
;~ Функция производит поиск в списке List View, в случае удачи, возвращает индекс найденного айтема в списке,
;в противном случае возвращает -1
Func _FindInListView($ListViewID, $SubItem, $WhatToFind, $SubItem2=-1, $WhatToFind2="")
Local $TotalItemsArr = _GUICtrlListViewGetItemCount($ListViewID)
Local $CurrentText, $CurrentText2
If $TotalItemsArr > 0 Then
For $i = 0 To $TotalItemsArr - 1
$CurrentText = _GUICtrlListViewGetItemText($ListViewID, $i, $SubItem)
If $SubItem2 <> -1 Then
$CurrentText2 = _GUICtrlListViewGetItemText($ListViewID, $i, $SubItem2)
If $CurrentText = $WhatToFind And $CurrentText2 = $WhatToFind2 Then Return $i
Else
If $CurrentText = $WhatToFind Then Return $i
EndIf
Next
EndIf
Return -1
EndFunc
;~ Самодельная функци FileOpenDialog() - позволяет открыть диалог для выбора файла как дочерний диалог ГУИ.
Func _FileOpenDialog($sTitle, $sInitDir, $sFilter = 'All (*.*)', $iOpt = 0, $sDefaultFile = "", $sDefaultExt = "", $mainGUI = 0)
Local $iFileLen = 65536 ; Max chars in returned string
; API flags prepare
Local $iFlag = BitOR ( _
BitShift (BitAND ($iOpt, 1),-12), BitShift (BitAND ($iOpt, 2),-10), BitShift (BitAND ($iOpt, 4),-7 ), _
BitShift (BitAND ($iOpt, 8),-10), BitShift (BitAND ($iOpt, 4),-17) )
; Filter string to array convertion
Local $asFLines = StringSplit ( $sFilter, '|'), $asFilter [$asFLines [0] *2+1]
Local $i, $iStart, $iFinal, $suFilter = ''
$asFilter [0] = $asFLines [0] *2
For $i=1 To $asFLines [0]
$iStart = StringInStr ($asFLines [$i], '(', 0, 1)
$iFinal = StringInStr ($asFLines [$i], ')', 0,-1)
$asFilter [$i*2-1] = StringStripWS (StringLeft ($asFLines [$i], $iStart-1), 3)
$asFilter [$i*2] = StringStripWS (StringTrimRight (StringTrimLeft ($asFLines [$i], $iStart), StringLen ($asFLines [$i]) -$iFinal+1), 3)
$suFilter = $suFilter & 'byte[' & StringLen ($asFilter [$i*2-1])+1 & '];byte[' & StringLen ($asFilter [$i*2])+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 ('byte[' & StringLen ($sTitle) +1 & ']')
Local $usInitDir= DllStructCreate ('byte[' & StringLen ($sInitDir) +1 & ']')
Local $usFilter = DllStructCreate ($suFilter & 'byte')
Local $usFile = DllStructCreate ('byte[' & $iFileLen & ']')
Local $usExtn = DllStructCreate ('byte[' & StringLen ($sDefaultExt) +1 & ']')
For $i=1 To $asFilter [0]
DllStructSetData ($usFilter, $i, $asFilter [$i])
Next
; Set Data of API structures
DllStructSetData ($usTitle, 1, $sTitle)
DllStructSetData ($usInitDir, 1, $sInitDir)
DllStructSetData ($usFile, 1, $sDefaultFile)
DllStructSetData ($usExtn, 1, $sDefaultExt)
DllStructSetData ($uOFN, 1, DllStructGetSize($uOFN))
DllStructSetData ($uOFN, 2, $mainGUI)
DllStructSetData ($uOFN, 4, DllStructGetPtr ($usFilter))
DllStructSetData ($uOFN, 7, 1)
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))
; Call API function
$ret = DllCall ('comdlg32.dll', 'int', 'GetOpenFileName', _
'ptr', DllStructGetPtr ($uOFN) )
If $ret [0] Then
If BitAND ($iOpt, 4) Then
$i = 1
While 1
If DllStructGetData ($usFile, 1, $i) =0 Then
If DllStructGetData ($usFile, 1, $i+1) Then
DllStructSetData ($usFile, 1, 124, $i)
Else
ExitLoop
EndIf
EndIf
$i += 1
Wend
EndIf
Return DllStructGetData ($usFile, 1)
Else
SetError (1)
Return ""
EndIf
EndFunc
;~ Функция задаёт значения для переменных $szIconFile и $nIcon путь к файлу и идентификатор иконки в файле
; (для определения иконки по заданному пути к файлу).
Func _FileGetIcon(ByRef $szIconFile, ByRef $nIcon, $szFile)
Local $OldEES = Opt("ExpandEnvStrings", 1)
Local $szRegDefault = "", $szDefIcon = "", $szExt
$nIcon = 0
If _IsDir($szFile) Then
$szRegDefault = RegRead("HKCR\Folder", "")
If $szRegDefault <> "" Then $szDefIcon = RegRead("HKCR\Folder\DefaultIcon", "")
Else
$szExt = StringRegExpReplace($szFile, '^.*\.', '.')
If $szExt = $szFile Then
$szExt = FileFindFirstFile($szFile & ".*")
$szExt = StringRegExpReplace(FileFindNextFile($szExt), '^.*\.', '.')
$szFile = $szFile & $szExt
EndIf
$szRegDefault = RegRead("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\" & $szExt, "ProgID")
If $szRegDefault = "" Then $szRegDefault = RegRead("HKCR\" & $szExt, "")
If $szRegDefault <> "" Then $szDefIcon = RegRead("HKCR\" & $szRegDefault & "\DefaultIcon", "")
EndIf
If $szDefIcon = "" Then
$szIconFile = "shell32.dll"
ElseIf $szDefIcon <> "%1" Then
If StringRegExpReplace($szFile, "^.*\\", "") = "shell32.dll" Then
$szIconFile = $szFile
$nIcon = 0
Else
$arSplit = StringSplit($szDefIcon, ",")
If IsArray($arSplit) Then
$szIconFile = $arSplit[1]
If $arSplit[0] > 1 Then $nIcon = $arSplit[2]
Else
Opt("ExpandEnvStrings", $OldEES)
Return 0
EndIf
EndIf
ElseIf $szDefIcon = "%1" Then
$szIconFile = $szFile
$nIcon = 0
EndIf
Opt("ExpandEnvStrings", $OldEES)
Return 1
EndFunc
;~ Функция предназначена для проверки, является ли заданый путь каталогом.
Func _IsDir($Path)
Return StringInStr(FileGetAttrib($Path), "D")
EndFunc
;~ ---------------------------------------------
;~ Позволят получить файловое расширение из пути или имени файла.
;~ Это единственная функция которая нигде не используется!
Func FileGetExtension($name)
Local $Count=StringInStr($name,".",0,-1)
If $Count=0 Then
Return 0
Else
Return StringTrimLeft($name,$Count)
EndIf
EndFunc
Есть такой вопрос:
Утилита OpenedFilesView (http://www.nirsoft.net/utils/opened_files_view.html), “умеет просматривать” файлы которые заняты разными приложениями...
Среди прочих возможностей программы, она имеет весьма удобную функцию - закрывать файлы (их Handle), чтобы к примеру, можно было удалить/переместить/переименовать файл без проблем, или изменить в нём данные.
Также программа отображает полный путь к приложению которое “держит” эти файлы...
Вопрос в том, возможно ли и на AutoIt получить доступ к подобной информации, а также иметь возможность закрывать Handles файлов, или временно их неитрализовывать (чего в самой программе нет :) )?
Полагаю тут надо копать в сторону DllCall, но я даже и не знаю какой “тип лопаты” выбрать :biggrin:
P.S
На оф. форуме поднимался подобный вопрос, но до сих пор так ни кто и не нашёл решения, надеюсь среди наших, найдутся знатоки и умеющие хорошо копать люди :)
Просьба помочь "чайнику" AutoItа
Надоело вариться в собственном соку
Как правильно организовать скрипт с использованием GUI ?
Хотел обратиться раньше,но решил сначала немного самому пощупать(и не без пользы .оказывается)
Просьба показать на примере,содержащем следующее :
1.Создается окно GUI
2.В нем создаются :
- пара текстовых строк (наверное Label 1 - Label 2)
- пара кнопок ( скажем button 1-Button 2)
3.При нажатии кнопки button 1:
- предыдущая инфа стирается
- создается :
- пара новых текстовых строк
- пара элементов Input ( с каким то текстом )
- пара новых кнопок ( скажем Read-Save)
- при нажатии новой кнопки Read :
- выводится инфа до редактирования текста в окнах Input(Слева в окне GUI)
- при нажатии новой кнопки Save :
- выводится инфа после редактирования текста в окнах Input (Справа в окне GUI)
4.При нажатии кнопки button 2:
- Все окно очищается
- Выводится любая обобщающая информация
Из примера хотелось бы понять :
1.Как правильно вводить текст и очищать окно
2.Как правильно организовать опрос элементов GUI при наличии вновь появляющихся
элементов (кнопок Read-Save,элементов Input и т.п. )
3.Как правильно осуществлять поиск по данной теме форума
Заранее благодарен
gregaz
Просьба показать на примере,содержащем следующее
Вот пример:
Global $Input1, $Input2, $ReadButton=-1, $SaveButton=-1
$Gui = GUICreate("Demo GUI", 400, 300)
$Label1 = GUICtrlCreateLabel("Строка 1", 20, 50, 300)
$Label2 = GUICtrlCreateLabel("Строка 2", 20, 100, 300)
$Button1 = GUICtrlCreateButton("Button1", 100, 260, 70)
$Button2 = GUICtrlCreateButton("Button2", 250, 260, 70)
GUISetState()
While 1
Switch GUIGetMsg()
Case -3
Exit
Case $Button1 ;нажата кнопка "Button1"
;Нажата кнопка "Button1", а значит стираем инфу и вместо неё пишем другую
;(можно конечно удалять контроли и создавать новые, но не вижу в этом смысла ;) )...
GUICtrlSetData($Label1, "Новая строка 1")
GUICtrlSetData($Label2, "Новая строка 2")
;Создаём поля ввода
$Input1 = GUICtrlCreateInput("Поле ввода 1", 20, 140, 300)
$Input2 = GUICtrlCreateInput("Поле ввода 2", 20, 180, 300)
;Создаём кнопки Read-Save
$ReadButton = GUICtrlCreateButton("Read", 100, 220, 70)
$SaveButton = GUICtrlCreateButton("Save", 250, 220, 70)
Case $Button2 ;нажата кнопка "Button2"
;Удаляем всё кроме кнопок "Button1" и "Button2"
GUICtrlDelete($Label1)
GUICtrlDelete($Label2)
GUICtrlDelete($Input1)
GUICtrlDelete($Input2)
GUICtrlDelete($ReadButton)
GUICtrlDelete($SaveButton)
Case $ReadButton ;нажата кнопка "Read"
;Выводим тот текст что создали (я так понял это нужно?)
MsgBox(64, "Info", "Поле ввода 1" & @LF & "Поле ввода 2")
Case $SaveButton ;нажата кнопка "Save"
;Выводим то что в полях ввода
$ReadInput1 = GUICtrlRead($Input1)
$ReadInput2 = GUICtrlRead($Input2)
MsgBox(64, "Info", $ReadInput1 & @LF & $ReadInput2)
EndSwitch
WEnd
Как правильно вводить текст и очищать окно
Это очень сильно зависит от конкретного случая... можно удалить все созданные контроли, но можно и просто очистить данные (GuiCtrlSetData($ControlID, ""), но это также зависит от типа контроля (поле ввода, чекбокс, и т.д).
Как правильно организовать опрос элементов GUI при наличии вновь появляющихся
В каком смысле опрос элементов? чтобы иметь к ним доступ? я это привёл в примере, те контроли, что создаются позже в цикле, нужно заранее обьявить, и желательно со значениями не ровняющимися нулю (0) - типичное поведение переменных обьявленых без значения.
Как правильно осуществлять поиск по данной теме форума
Лучше всего переключить в режим печати (ВСЕ (http://forum.oszone.net/thread-60616-all.html)), и искать на странице (Ctrl F :)).
Creat0R
Рукописная функция _FileOpenDialog у меня возвращает цифры 0x433A5C446F63756D... и т.п. и очень много нулей. :idontnow:
У меня почему то при вызове $dict.Exists скрипт выпадает с ошибкойА в отдельном скрипте сам объект не пробовал тестировать?
-Добавил функцию для поиска в самом ListView, имхо, так надёжнее, и не так уж намного медленнееРазница в скорости станет очевидной при обработке больших объёмов информации. ИМХО "Scripting.Dictionary" очень даже надёжен и я принципиально не хочу:lo: от него отказываться. ;)
иконки определяются используя функцию _FileGetIcon()Я уже начал писать нечто подобное, вот только не знал как получить иконку для папки. Спасибо.
вызывается AutoSize на каждый добавляемый файл, хотя логичнее бдет вызвать один раз эту функцию по оканчанию добавления всех файлов.... уже думал об этом, но потом решил что это не сильно отразиться на скорости добавления - возможно я и не прав... :dont-know
-Чтобы можно было присваивать иконки айтемам, пришлось вместо вставки айтемов, создавать их встроенными средствами, т.к требуется ControlID.Спасибо, буду разбираться. :)
Creat0R
Полагаю тут надо копать в сторону DllCall, но я даже и не знаю какой “тип лопаты” выбрать
По поводу лопаты... Думаю, нужно копать в сторону файловых дескрипторов.
Скорее всего, программе удаётся это сделать за счёт подмены или переназначения блокирующего дескриптора, для своего собственного процесса.
К сожалению, больше ничем помочь не смогу... :dont-know
Creat0R !
Спасибо за помощь !
Многое стало понятнее .
Естественно сразу возникли вопросы :
1. Почему даный пример работает даже без обьявления #include <GUIConstants.au3> ?
2. Правильно ли я понял ,что обявление Global переменных нужно только лишь для Обьявления
начальных значений еще не созданных элементов ( можно наверное и так : $Input1 ="" и т.д.) ?
3. Цикл Switch-Case-EndSwitch полностью аналогичен циклу Select-Case-EndSelect или есть отличия ?
Можно ли здесь поменять их ?
4. Что означает Case -3 (GUIGetMsg()= -3 ) ? Когда появится это значение ?
5. Правильно ли я понял ,что независимо от появляющихся впоследствии элементов GUI , опрос
об их состояниях (значениях) производится ВСЕГДА в одном общем цикле While-Wend ?
Я пытался после создания новых элементов создавать еще внутренний цикл While-Wend ,поскольку иначе они
почему то получались статическими.
6. Можно ли вместо вывода информации в окне MsgBox осуществлять вывод в том же окне GUI ?
7.Можно ли для очиски окна использовать GUICtrlDelete($ControlID) или GuiCtrlSetData($ControlID, "") - что правильнее ?
8. Как праильно осуществлять поиск ранее обсуждавшихся вопросов на форуме ( не на странице) ?
Извините что напрягаю.
Diamond
Рукописная функция _FileOpenDialog у меня возвращает цифры 0x433A5C446F63756D... и т.п. и очень много нулей.
Странно, amel27, что скажешь, от чего это может быть вызвано?
А в отдельном скрипте сам объект не пробовал тестировать?
Не пробовал, но как выяснилось, это вызвано тем, что самопальная функция возвращает символы перевода строки на конце переменной выбранных файлов. При передаче подобной переменной в проверку словаря, действие проваливается.
gregaz
Почему даный пример работает даже без обьявления #include <GUIConstants.au3> ?
Паотому что нет констант из этого вложения используемых примером :)
Правильно ли я понял ,что обявление Global переменных нужно только лишь для Обьявления
начальных значений еще не созданных элементов ( можно наверное и так : $Input1 ="" и т.д.) ?
Совершенно правильно. Если переменные создавать вне функции/циклов (в начале скрипта), то особой необходимости в глобальном обьявлении переменных нет (в данном случае), но всё же это не помешает.
Цикл Switch-Case-EndSwitch полностью аналогичен циклу Select-Case-EndSelect или есть отличия ?
Отличия в том, что при Select подстанавливается полное условие - Case 1 = 1, а при Switch можно один раз указать с чем следует использовать (сравнивать) условия - Switch $Test.... Case 1 - этот случай будет выполнен если переменная $Test будет ровна 1.
Правильно ли я понял ,что независимо от появляющихся впоследствии элементов GUI , опрос
об их состояниях (значениях) производится ВСЕГДА в одном общем цикле While-Wend ?
Не всегда, при желании (необходимости) можно создавать несколько циклов.
Можно ли вместо вывода информации в окне MsgBox осуществлять вывод в том же окне GUI ?
Можно, нужно строить также новый ГУИ ;)
Можно ли для очиски окна использовать GUICtrlDelete($ControlID) или GuiCtrlSetData($ControlID, "") - что правильнее ?
если нужно поменять значение у текстовой строки (Label), то лучше использовать GuiCtrlSetData($ControlID, ""), для полного удаления контроля из ГУИ, нужно использовать GUICtrlDelete($ControlID).
Как праильно осуществлять поиск ранее обсуждавшихся вопросов на форуме
Есть на этом форуме раздел поиска (http://forum.oszone.net/search.php), там вводишь нужный запрос с нужными параметрами (есть помощь там же по поиску), и осуществляется поиск :)
Creat0RСтранно, amel27, что скажешь, от чего это может быть вызвано?чего-то не пойму что там разработчики намутили с юникодом, кто нибудь может объяснить поведение скрипта?.. у меня значения не совпадают в 2 раза +2$u = DllStructCreate ('byte[10]')
ConsoleWrite ("Размер байтового массива: "& DllStructGetSize ($u) &@CRLF)
ConsoleWrite ("Размер данных в массиве: "& StringLen (DllStructGetData ($u,1)) &@CRLF)
Creat0RВопрос в том, возможно ли и на AutoIt получить доступ к подобной информации
ИМХО не тот случай, чтобы внешним утилитам предпочесть DLLCall... Надежней будет сваять GUI-интерфейс над подходящей CMD-утилитой, благо возможностей в AutoIT предостаточно... :) Дополнительные линки по теме:
http://www.thefreecountry.com/utilities/deletelockedfiles.shtml
http://www.microsoft.com/technet/sysinternals/SystemInformation/Handle.mspx
З.Ы. Поясню свою позицию. Дело в том, что в Windows нет документированных API-функций по перечислению открытых хэндлов, все подобные утилиты используют недокументированные вызовы функций ядра что не есть хорошо для обычного приложения, в частности могут возникать утечки памяти... При вызове внешних приложений таких проблем не возникает, так как при закрытии процесса система подчищает за ним все "хвосты". Лопата здесь лежит: http://forum.sysinternals.com/forum_posts.asp?TID=3577&a%20mp. ;)
Creat0R
Помнится, мы мучали функцию _PathSplitByRegExp()... Так вот оказалось, что RegExp-аналог оригинальной функции _PathSplit() занимает всего одну строчку... :)
#include <array.au3>
$path = 'C:\Program Files\AutoIT3\test.au3'
$p = StringRegExp ($path, '(?i)^\s*([A-Z]:|\\\\[^\\]*)(\\.*\\)(.*?)(\.?[^\.]*)\s*$', 3)
_ArrayDisplay ($p, $path)
Creat0R !
Спасибо за пример и разьяснения !
Все встает на свои места.
Еще пару вопросов,если можно :
1.На вопрос: Можно ли вместо вывода информации в окне MsgBox осуществлять вывод в том же окне GUI ?
был дан ответ : Можно, нужно строить также новый ГУИ .
А разве нельзя в этом же GUI вот так(тот же пример) : ? Вроде работает.
Global $Input1, $Input2, $ReadButton=-1, $SaveButton=-1
$Gui = GUICreate("Demo GUI", 400, 300)
$Label1 = GUICtrlCreateLabel("Строка 1", 20, 50, 300,40)
$Label2 = GUICtrlCreateLabel("Строка 2", 20, 100, 300,40)
$Button1 = GUICtrlCreateButton("Button1", 100, 260, 70)
$Button2 = GUICtrlCreateButton("Button2", 250, 260, 70)
GUISetState()
While 1
Switch GUIGetMsg()
Case -3
Exit
Case $Button1 ;нажата кнопка "Button1"
;Нажата кнопка "Button1", а значит стираем инфу и вместо неё пишем другую
;(можно конечно удалять контроли и создавать новые, но не вижу в этом смысла ;) )...
GUICtrlSetData($Label1, "Новая строка 1")
GUICtrlSetData($Label2, "Новая строка 2")
;Создаём поля ввода
$Input1 = GUICtrlCreateInput("Поле ввода 1", 20, 140, 300)
$Input2 = GUICtrlCreateInput("Поле ввода 2", 20, 180, 300)
;Создаём кнопки Read-Save
$ReadButton = GUICtrlCreateButton("Read", 100, 220, 70)
$SaveButton = GUICtrlCreateButton("Save", 250, 220, 70)
Case $Button2 ;нажата кнопка "Button2"
;Удаляем всё кроме кнопок "Button1" и "Button2"
GUICtrlDelete($Label1)
GUICtrlDelete($Label2)
GUICtrlDelete($Input1)
GUICtrlDelete($Input2)
GUICtrlDelete($ReadButton)
GUICtrlDelete($SaveButton)
Case $ReadButton ;нажата кнопка "Read"
;Выводим тот текст что создали (я так понял это нужно?)
GUICtrlSetData($Label1, "Поле ввода 1" & @LF & "Поле ввода 2")
; MsgBox(64, "Info", "Поле ввода 1" & @LF & "Поле ввода 2")
Case $SaveButton ;нажата кнопка "Save"
;Выводим то что в полях ввода
$ReadInput1 = GUICtrlRead($Input1)
$ReadInput2 = GUICtrlRead($Input2)
GUICtrlSetData($Label2, $ReadInput1 & @LF & $ReadInput2)
; MsgBox(64, "Info", $ReadInput1 & @LF & $ReadInput2)
EndSwitch
WEnd
Может быть такая кострукция в чем то неверна и это скажется в других случаях ?
2. Просьба привести любой простой пример выполнения опросов состояний элементов GUI в разных циклах
Может быть даже в том же примере провести опрос состояний кнопок "Read" и "Save"в отдельном цикле ?
3. Что означает Case -3 (GUIGetMsg()= -3 )? Какой-то идентификатор завершения процессов ???
Creat0R
как выяснилось, это вызвано тем, что самопальная функция возвращает символы перевода строки на конце переменной выбранных файлов. При передаче подобной переменной в проверку словаря, действие проваливается.
OK, тестирую...$Dict=ObjCreate("Scripting.Dictionary")
Dim $var[4]
$var[0]="test1 -->" & @CRLF & "<-- возврат каретки и перенос строки"
$var[1]="test2" & @CRLF
$var[2]=@CRLF & "test3" & @CRLF
$var[3]=@CRLF & @CRLF & @LF & @LF & @CR & @CR
;~ Добавление ключей:
For $o In $var
$Dict.Add($o,"")
Next
;~ Проверка добавленных ключей:
For $o In $var
If $Dict.Exists($o) Then
;~ OK!
Else
;~ ...
EndIf
Next
;~ У меня не вылетает
;~ Проверка несуществующего ключа
MsgBox(0,"Должен быть: 0",$Dict.Exists("test5"))
;~ Проверка массива:
$arrayKey=$Dict.Keys
For $i=0 To $Dict.Count-1
MsgBox(0,"Перебор массива...",$arrayKey[$i])
Next
;~ Всё на своём месте.Наверное дело в чём то другом...
Похожая ошибка возникает при попытке добавить в словарь ключ (Кеу) который там уже существует. (Словарь - изначально не поддерживает дубликаты)
amel27
Лопата здесь лежит:
Спасибо, немного покапал, правда не очень глубоко...
Утилита из того топика, вызвращает хэндлы TCP/UDP (правда не совсем понимаю что это), для обычных файлов информации нет :(.
Взял утилиту (http://download.sysinternals.com/Files/Handle.zip) из второго линка (http://www.microsoft.com/technet/sysinternals/SystemInformation/Handle.mspx), она возвращает то что нужно, но 400 с лишним кб, это тяжко, даже очень тяжко :sorry: .
amel27оказалось, что RegExp-аналог оригинальной функции _PathSplit() занимает всего одну строчку...
Оригинально, прадва расширение не возвращается...
Но вообще то, я делал функцию _PathSplitByRegExp() не как аналог функции _PathSplit(), а как что то более юзабельное и функциональнее, можно сказать что это как бы “мод” той функции :).
gregaz
А разве нельзя в этом же GUI вот так(тот же пример)
Можно, но лучше отдельно построить ГУИ для вывода информации, и поместить его в функцию, чтобы при каждом вызове небыло необходимости строить занового гуи:
#include <GuiConstants.au3>
$Gui = GUICreate("Demo GUI", 400, 300)
$Button1 = GUICtrlCreateButton("Button1", 100, 260, 70)
GUISetState()
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case $Button1 ;нажата кнопка "Button1"
$Ret = _GuiMsgBox($WS_EX_TOPMOST, 2, "Info", "Текст 1" & @LF & "Текст 2", 330, 120, _
"Больше не показывать", "OK", "Отмена", $Gui)
MsgBox(0, "", "Вернувшееся значение: " & $Ret)
EndSwitch
WEnd
;Функция для показа самодельного окна MsgBox
Func _GuiMsgBox($Type, $ButtonsNumber, $Title, $Text, $Left, $Top, $CheckBoxText, $FirstButtonText="OK", $SecondButtonText="Cancel", $hWnd=0)
Local $Yes, $No, $OK, $CheckBox=-1, $Gui, $Msg, $ReturnVal = 0
If $hWnd <> 0 Then WinSetState($hWnd, "", @SW_DISABLE)
$Gui = GuiCreate($Title, $Left, $Top, -1, -1, -1, $Type, $hWnd)
GUICtrlCreateLabel($Text, ($Left-($Left-($Left/2/2)))/2, (($Top/2)/2)-10, $Left-($Left/2/2), 40, $SS_CENTER)
Select
Case $ButtonsNumber = 2
$Yes = GUICtrlCreateButton($FirstButtonText, ($Left/2)-90, ($Top/2), 70, 20)
$No = GUICtrlCreateButton($SecondButtonText, ($Left/2)+20, ($Top/2), 70, 20)
Case $ButtonsNumber > 2 Or $ButtonsNumber <= 1
$OK = GUICtrlCreateButton($FirstButtonText, ($Left-70)/2, $Top/2, 70, 20)
EndSelect
If $CheckBoxText <> "" Then $CheckBox = GUICtrlCreateCheckbox($CheckBoxText, 15, $Top-30)
GuiSetState(@SW_SHOW, $Gui)
While 1
$Msg = GUIGetMsg()
Select
Case $ButtonsNumber = 2 And $Msg = $Yes
If GUICtrlRead($CheckBox) = 1 Then
$ReturnVal = 6+8
Else
$ReturnVal = 6
EndIf
ExitLoop
Case $ButtonsNumber = 2 And $Msg = $No
If GUICtrlRead($CheckBox) = 1 Then
$ReturnVal = 7+8
Else
$ReturnVal = 7
EndIf
ExitLoop
Case ($ButtonsNumber = 1 Or $ButtonsNumber <> 2) And $Msg = $OK
If GUICtrlRead($CheckBox) = 1 Then
$ReturnVal = 1+8
Else
$ReturnVal = 1
EndIf
Case $Msg = -3
ExitLoop
EndSelect
Wend
If $hWnd <> 0 Then WinSetState($hWnd, "", @SW_ENABLE)
GUIDelete($Gui)
Return $ReturnVal
EndFunc
Просьба привести любой простой пример выполнения опросов состояний элементов GUI в разных циклах
Не уверен что понимаю просьбу, что значить в разных циклах? цикл не важен, важно действие, что именно требуеся опрашивать, если нужно проверить текст поля ввода, тогда GuiCtrlGetData, если нужно проверить зажат ли той или инной чекбокс (птичка), тогда GuiCtrlRead() - если 1, тогда зажата, в противном случе вернётся 4, и т.д.
Что означает Case -3 (GUIGetMsg()= -3 )? Какой-то идентификатор завершения процессов ???
-3 это тоже самое что и $GUI_EVENT_CLOSE, я просто изначально значение многих констант выучил наизусть, поэтому по привычке использую их как есть, это иногда удобно, и позволяет не использовать вложения библиотеки, типа #Include <GuiConstants.au3>. $GUI_EVENT_CLOSE это константа, функция GuiGetMsg() возвращает её значение (-3) если послана команда закрыть окно ГУИ (пользователь нажал крестик закрытия программы).
Diamond
Наверное дело в чём то другом...
Возможно...
Похожая ошибка возникает при попытке добавить в словарь ключ (Кеу) который там уже существует.
Но у меня выводилась ошибка именно на строке с проверкой $Dict.Exists... :idontnow:
P.S
Но я всё же больше доверяю массивам :tongue: (возможно боязень чего то нового).
Creat0Rправда расширение не возвращаетсяенто частности, уже исправил. :)
Кстати, насчет твоего старого вопроса о массовой замене и функции _StringRexExpReplaceEx… зачем там RegExp? Имхо вариант с обычным StringReplace справится лучше, плюсы очевидны:
- работает быстрее;
- нет проблем с форматными символами (речь о "|");
- если элементу из массива $Pattern нет соответствия в $Replace автоматически предполагается пустая строка.$String = 'file://localhost/%22c:/my%20test/test.zip%22'
Dim $Pattern [4] = ['/','%20','%22','file:\\localhost\']
Dim $Replace[3] = ['\',' ','"']
Func _StringReplaceEx ($String, $Pattern, $Replace)
Local $i
ReDim $Replace[UBound($Pattern)]
For $i=0 To UBound($Pattern)-1
ConsoleWrite ($Pattern[$i]&':'&$Replace[$i]&@CRLF)
$String = StringReplace ($String, $Pattern[$i], $Replace[$i])
Next
Return $String
EndFunc
MsgBox (64, "Results", _StringReplaceEx ($String, $Pattern, $Replace)) ;На выходе имеем это: "c:\my test\test.zip"
Creat0R
функция _GuiMsgBox достаточно громоздкая видимо из-за своей универсальности(на все случаи жизни)
Попробую разобраться в ней.
А пока 1 вопрос :
При закрытии дочернего окна GUI у меня обычно закрывается и родительсое окно.
У тебя же в примере этого не происходит .
Чем это достигнуто ?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.