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

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [Архив - Часть 1.3] AutoIt скрипты

Закрытая тема
Настройки темы
[Архив - Часть 1.3] AutoIt скрипты

Старожил


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

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


Изменения
Автор: Vadikan
Дата: 25-01-2008
Внимание!
Тема переведена в архивное состояние





(настоятельно рекомендуется к прочтению/поиску)


Руководство к действию по работе c AutoIt.

Помогите пожалуйста. Нужен маленький скриптик для решения некоторых рутинных задачь.
Вот что нужно сделать последовательно:

1) в папке DIR1 находим и удаляем файлы в названии которых присутствует text_1
2) в папке DIR2 находим xxx.sif и удаляем строки, в которых присутствует text_1
3) в папке DIR3 находим xxx.inf и добавляем в его секцию [XXX] несколько строчкек (text_2, text_3, ..., text_n)
4) в папке DIR4 находим yyy.inf ищем в его секции [YYY] text_4 и заменяем его на text_5
5) сохраняем все изменения и выводим отчёт о проделанной работе :-)

Заранее благодарен.

Отправлено: 05:05, 03-12-2006

 

Аватара для Creat0R

Must AutoIt


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

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


ChVL
Цитата:
AutoIt принципиально не переваривает кириллицу в директории
Ну почему, в случае с FileInstall очень даже переваривает, возможно неверно указаны параметры функции? первый параметр не должен содержать переменных и/или макросов, только чистый текст.

Цитата:
Функция WinSetState оказалась несовместимой с WinWaitActive
Если нам нужно скрыть окна, то WinWaitActive ни к чему, окно никогда не будет активным - но вот WinWait может помочь, оно позволит ожидать окно, т.е ожидать его появление, а не активность...

Код: Выделить весь код
WinWait("Title", "", 5)
WinSetState("Title", "", @SW_HIDE)

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

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

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


Отправлено: 21:43, 04-06-2007 | #481



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Creat0R

Must AutoIt


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

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


Функции (и пример использования) для отображения стильного диалога “О Программе”

Код: Выделить весь код
#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

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

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

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


Отправлено: 02:40, 06-06-2007 | #482


Пользователь


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

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


Пример 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

Отправлено: 18:52, 06-06-2007 | #483


Аватара для Creat0R

Must AutoIt


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

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


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

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

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

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

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

Отправлено: 22:17, 06-06-2007 | #484


Аватара для Creat0R

Must AutoIt


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

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


Есть такой вопрос:

Утилита OpenedFilesView, “умеет просматривать” файлы которые заняты разными приложениями...
Среди прочих возможностей программы, она имеет весьма удобную функцию - закрывать файлы (их Handle), чтобы к примеру, можно было удалить/переместить/переименовать файл без проблем, или изменить в нём данные.

Также программа отображает полный путь к приложению которое “держит” эти файлы...

Вопрос в том, возможно ли и на AutoIt получить доступ к подобной информации, а также иметь возможность закрывать Handles файлов, или временно их неитрализовывать (чего в самой программе нет )?

Полагаю тут надо копать в сторону DllCall, но я даже и не знаю какой “тип лопаты” выбрать

P.S
На оф. форуме поднимался подобный вопрос, но до сих пор так ни кто и не нашёл решения, надеюсь среди наших, найдутся знатоки и умеющие хорошо копать люди

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

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

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


Отправлено: 02:13, 07-06-2007 | #485


Аватара для gregaz

Пользователь


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

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


Просьба помочь "чайнику" 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.Как правильно осуществлять поиск по данной теме форума
Заранее благодарен

Отправлено: 12:22, 07-06-2007 | #486


Аватара для Creat0R

Must AutoIt


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

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


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) - типичное поведение переменных обьявленых без значения.

Цитата:
Как правильно осуществлять поиск по данной теме форума
Лучше всего переключить в режим печати (ВСЕ), и искать на странице (Ctrl F ).

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

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

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:59, 07-06-2007 | #487


Пользователь


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

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


Creat0R
Рукописная функция _FileOpenDialog у меня возвращает цифры 0x433A5C446F63756D... и т.п. и очень много нулей.
Цитата:
У меня почему то при вызове $dict.Exists скрипт выпадает с ошибкой
А в отдельном скрипте сам объект не пробовал тестировать?
Цитата:
-Добавил функцию для поиска в самом ListView, имхо, так надёжнее, и не так уж намного медленнее
Разница в скорости станет очевидной при обработке больших объёмов информации. ИМХО "Scripting.Dictionary" очень даже надёжен и я принципиально не хочу от него отказываться.
Цитата:
иконки определяются используя функцию _FileGetIcon()
Я уже начал писать нечто подобное, вот только не знал как получить иконку для папки. Спасибо.
Цитата:
вызывается AutoSize на каждый добавляемый файл, хотя логичнее бдет вызвать один раз эту функцию по оканчанию добавления всех файлов.
... уже думал об этом, но потом решил что это не сильно отразиться на скорости добавления - возможно я и не прав...
Цитата:
-Чтобы можно было присваивать иконки айтемам, пришлось вместо вставки айтемов, создавать их встроенными средствами, т.к требуется ControlID.
Спасибо, буду разбираться.

Отправлено: 16:33, 07-06-2007 | #488


Пользователь


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

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


Creat0R
Цитата:
Полагаю тут надо копать в сторону DllCall, но я даже и не знаю какой “тип лопаты” выбрать
По поводу лопаты... Думаю, нужно копать в сторону файловых дескрипторов.
Скорее всего, программе удаётся это сделать за счёт подмены или переназначения блокирующего дескриптора, для своего собственного процесса.
К сожалению, больше ничем помочь не смогу...

Отправлено: 17:43, 07-06-2007 | #489


Аватара для gregaz

Пользователь


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

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


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. Как праильно осуществлять поиск ранее обсуждавшихся вопросов на форуме ( не на странице) ?

Извините что напрягаю.

Отправлено: 18:22, 07-06-2007 | #490



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [Архив - Часть 1.3] AutoIt скрипты

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Открывая 7z архив пишет не удаётся открыть как архив. Можно ли его восстановить? DreDo Хочу все знать 4 01-12-2009 18:54
[Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:. Vadikan AutoIt 1543 18-01-2009 10:46
[архив - Часть 2] AutoIt скрипты Vadikan AutoIt 985 21-01-2008 09:58
[Архив - Часть 1.2] AutoIt скрипты Dirk Diggler AutoIt 505 02-12-2006 11:00
[Архив - Часть 1.1] AutoIt скрипты EgOrus AutoIt 335 04-02-2006 16:58




 
Переход