Показать полную графическую версию : [Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:.
Maza Faka
17-03-2008, 10:21
Creat0R
Помоги пожалуйста:
$string = "Location: http://game.chirkom.uz/download/game/warcraft3/i_hate_this_key.zip [following]" & @CRLF & _
"Checking..."
$result = StringRegExp($string, "http.*/(.*)\s", 1)
MsgBox(0, "", $result[0])
Пытаюсь получить подстроку i_hate_this_key.zip, но безуспешно. :(
Помогите разобраться с ListView. Хочу поймать выбор пункта в нем (желат по двойному клику) и не поумй как. Постоянно генерируется сообщение не давая даже сделать выбор.
Я так понимаю неправильна строка - Case $msg = $treeNets
Вот код.#include <GuiConstants.au3>
#include <GuiListView.au3>
$hGUI = GuiCreate("Nets", 1020, 620)
$AcceptButton = GUICtrlCreateButton("Ok", 880, 5, 60, 25)
$a = _NetAdapterGetProp()
$treeNets = GUICtrlCreateListView("IP Adress |Name nets",590,120,400,400,$LVS_SINGLESEL)
_GUICtrlListViewSetColumnWidth ($treeNets, 0, 130)
_GUICtrlListViewSetColumnWidth ($treeNets, 1, 470)
Dim $hTreeNets[30]
$n = UBound($a,2)
For $i=0 To UBound($a,2)+1 Step 1
$hTreeNets[$i]=GUICtrlCreateListViewItem($a[$i][1] & "|" & StringTrimLeft ($a[$i][0],11),$treeNets)
Next
; GUI MESSAGE LOOP
GuiSetState()
While 1
$msg = GUIGetMsg()
Switch $msg
Case $msg = $treeNets
;$adapters=GUICtrlGetState($treeNets)
MsgBox(4096,"Info selected net", "List")
;GUICtrlGetState($treeNets))
Case $AcceptButton
ExitLoop
EndSwitch
WEnd
Func _NetAdapterGetProp($sHostName = "localhost")
Local $objItem, $objWMIService = ObjGet( "winmgmts:\\"& $sHostName &"\root\CIMV2")
Local $sQuery = 'SELECT Index, Caption, MACAddress, IPAddress FROM Win32_NetworkAdapterConfiguration Where IPEnabled = True'
Local $colItems = $objWMIService.ExecQuery($sQuery, "WQL", 0x30)
If IsObj($colItems) Then
Local $aRes[1][3], $i=0
For $colItem In $colItems
ReDim $aRes[$i+1][3]
$aRes[$i][0] = $colItem.Caption
$aRes[$i][1] = $colItem.IPAddress(0)
$aRes[$i][2] = $colItem.MACAddress
$i+=1
Next
Return $aRes
EndIf
Return SetError(1)
EndFunc ;==> _NetAdapterGetProp
Exit
Maza Faka
17-03-2008, 13:34
NikLok
Не считая ошибок с массивом и ошибок, которых я не заметил- не нашёл...
While 1
$msg = GUIGetMsg()
Switch $msg
Case $msg = $treeNets
;$adapters=GUICtrlGetState($treeNets)
MsgBox(4096,"Info selected net", "List")
Здесь ошибка указания значения, правильно будет так:
While 1
$msg = GUIGetMsg()
Switch $msg
Case $treeNets
;$adapters=GUICtrlGetState($treeNets)
MsgBox(4096,"Info selected net", "List")
Как я понял ты используешь старую версию AutoIt-а, попробуй этот код:
#include <GuiConstants.au3>
#include <GuiListView.au3>
;Global Const $WM_NOTIFY = 0x004E
;Global Const $tagNMHDR = "hwnd hWndFrom;int IDFrom;int Code"
;Global Const $NM_DBLCLK = -3
$hGui = GUICreate("Test GUI", 300, 200)
$hListView = GUICtrlCreateListView("Items|SubItems", 10, 10, 280, 180)
GUICtrlSendMsg(-1, 0x101E, 0, 150)
GUICtrlSendMsg(-1, 0x101E, 1, 125)
$Item1 = GUICtrlCreateListViewItem("Item1|SubItem1", $hListView)
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUISetState()
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
Func WM_NOTIFY($hWnd, $Msg, $wParam, $lParam)
Local $tNMHDR, $IdFrom, $iCode
$tNMHDR = DllStructCreate($tagNMHDR, $lParam)
$IdFrom = DllStructGetData($tNMHDR, "IdFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $IdFrom
Case $hListView
Switch $iCode
Case $NM_DBLCLK
ConsoleWrite("Double click" & @LF)
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc
Если будет ругаться на необьявленные переменные - раскомментируй закоментированные строчки.
Maza Faka,
Case $msg = $treeNets »
Да это глупая очепятка! Ночью надо отдыхать а не код гнать!
Как я понял ты используешь старую версию AutoIt-а, »
Уже выровнял! А по какому признаку заключение - по отсутсвию подчеркивания в _GUICtrlListView_SetColumnWidth ?
Если будет ругаться на необьявленные переменные - раскомментируй закоментированные строчки. »
Все прекрасно работает, только вот не понял как понять какой из N итемов выбран!
Maza Faka
17-03-2008, 16:00
Да это глупая очепятка! Ночью надо отдыхать а не код гнать! »
Бывает :)
А по какому признаку заключение - по отсутсвию подчеркивания в _GUICtrlListView_SetColumnWidth ? »
Ага ;)
не понял как понять какой из N итемов выбран! »
#include <GuiConstants.au3>
#include <GuiListView.au3>
;Global Const $WM_NOTIFY = 0x004E
;Global Const $tagNMHDR = "hwnd hWndFrom;int IDFrom;int Code"
;Global Const $NM_DBLCLK = -3
;Global Const $tagNMLISTVIEW = "hwnd hWndFrom;int IDFrom;int Code;int Item;int SubItem;int NewState;int OldState;int Changed;" & _
;"int ActionX;int ActionY;int Param"
$hGui = GUICreate("Test GUI", 300, 200)
$hListView = GUICtrlCreateListView("Items|SubItems", 10, 10, 280, 180)
GUICtrlSendMsg(-1, 0x101E, 0, 150)
GUICtrlSendMsg(-1, 0x101E, 1, 125)
$Item1 = GUICtrlCreateListViewItem("Item1|SubItem1", $hListView)
$Item2 = GUICtrlCreateListViewItem("Item2|SubItem2", $hListView)
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUISetState()
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
Func WM_NOTIFY($hWnd, $Msg, $wParam, $lParam)
Local $tNMHDR, $IdFrom, $iCode, $tInfo, $iItem
$tNMHDR = DllStructCreate($tagNMHDR, $lParam)
$IdFrom = DllStructGetData($tNMHDR, "IdFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $IdFrom
Case $hListView
Switch $iCode
Case $NM_DBLCLK
$tInfo = DllStructCreate($tagNMLISTVIEW, $lParam)
$iItem = DllStructGetData($tInfo, "Item")
If $iItem <> -1 Then ConsoleWrite("Double click on " & $iItem & " item" & @LF)
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc
Всё это описано в справке, не ленись туда заглядывать ;)
Maza Faka, Всё это описано в справке, не ленись туда заглядывать »
Да у меня, пока не накоплена критическая масса знаний, барьер вхождения в тему. То есть в руководство смотрю а мысли то ли ошибочные то ли отсутствуют.
Извини исчо вопрос:
$iItem = DllStructGetData($tInfo, "Item")
Смотрел описание GUICtrlCreateListView а так же GuiCtrlCreateListView и уж само собой DllStructGetData.
Так там нигде не описано что такое "Item". Ну интуитивно понятно название.
Теперь же мне нужно значение значение этого итема. А они у нас не в массиве а $Item1 $Item2 ......
Как теперь выбрать нужный? И кстати каково его мнемоническое название?!
Чуствую что нужно использовать _GUICtrlListView_GetItem но как его увязать в функции ....
Тем более что не могу понять а эти строки зачем?
$tNMHDR = DllStructCreate($tagNMHDR, $lParam)
$IdFrom = DllStructGetData($tNMHDR, "IdFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Maza Faka, Пытаюсь получить подстроку i_hate_this_key.zip
Замени \s на реальный пробел, \s подбирает не только пробел ;)
Кстати http:// можно не указывать:
$string = "Location: http://game.chirkom.uz/download/game/warcraft3/i_hate_this_key.zip [following]" & @CRLF & "Checking..."
$result = StringRegExpReplace($string, "(?s)^.*/(.*) .*$", "\1")
MsgBox(0, "", $result)
NikLok, нигде не описано что такое "Item"
Это параметр в структуре, ему присваивается значение при создании структуры на событии двойного нажатия по айтему. Есть также в этой структуре ещё параметры:
$tagNMLISTVIEW = "hwnd hWndFrom;int IDFrom;int Code;int Item;int SubItem;int NewState;int OldState;int Changed;int ActionX;int ActionY;int Param"
К примеру «OldState» возвращает состояние элемента до нажатия на него. ActionX/Y вернёт координаты места нажатия по элементу.
Теперь же мне нужно значение значение этого итема
ConsoleWrite("Double click on [" & _GUICtrlListView_GetItemText($IdFrom, $iItem) & "] item" & @LF)
не могу понять а эти строки зачем?
$tNMHDR переменная содержит созданную структуру для получения идентификаторов событий и элементов.
$IdFrom идентификатор элемента который вызвал событие (эквивалентно $hListView).
$iCode код события (при двойном клике в списке он ровняется $NM_DBLCLK).
Creat0R, Maza Faka, Вот еще забыл спросить а строки:GUICtrlSendMsg(-1, 0x101E, 0, 150)
GUICtrlSendMsg(-1, 0x101E, 1, 125)
Для чего нужны? И как узнать то когда нужно посылать сообщ а когда нет! И какие именно!??
NikLok, Для чего нужны? И как узнать то когда нужно посылать сообщ а когда нет!
Эти строки для определения ширены колонок. Maza Faka, имо, плохая идея использовать значения вместо констант ;) - при большом объеме кода можно долго сидеть пытаясь понять что же за такое магическое значение :)
Если использовать GUICtrlSendMsg($hListView, $LVM_SETCOLUMNWIDTH, 0, -1) то колонка (первая, это определяет 0 в третьем параметре) выровняется по максимуму (чтобы были видны все символы в айтемах).
Maza Faka
17-03-2008, 18:04
а строки:
GUICtrlSendMsg(-1, 0x101E, 0, 150)
GUICtrlSendMsg(-1, 0x101E, 1, 125)
Для чего нужны? »
Это для указания ширины колонок, аналог функции _GUICtrlListView_SetColumnWidth :)
И как узнать то когда нужно посылать сообщ а когда нет! И какие именно!?? »
Ты имеешь в виду сообщения Windows? Для элемента ListView это WM_NOTIFY. Для например элемента Button это WM_COMMAND.
Замени \s на реальный пробел, \s подбирает не только пробел »
Вот спасибо, а то замучился совсем :) Кстати, что означает параметр замены "\1", в справке не нашёл.
имо, плохая идея использовать значения вместо констант »
Знаю и сам никогда так не делаю, просто поторопился ;)
Вообще я немного в шоке. Дело в том что ранее написал цикл вида:
; GUI MESSAGE LOOP
GuiSetState()
While 1
$msg = GUIGetMsg()
Switch $msg
Case $treeNets
;$adapters=GUICtrlGetState($treeNets)
MsgBox(4096,"Info selected net",GUICtrlGetState($treeNets))
Case $ClearDrvPathButton
_ClearAllDrv()
Case $AllDrvPathButton
_MarkAllDrv()
Case $CheckDrvPathButton
_CheckDrvPath()
Case $GUI_EVENT_CLOSE, $CancelButton
ExitLoop
Case $AcceptButton
$CfgFile = "new_winnt.sif"
_SaveCfg()
ExitLoop
EndSwitch
WEnd
а теперь надо переходить на технологию
GUIRegisterMsg($WM_NOTIFY,"WM_NOTIFY")
Или их можно смело сочетать в одном фляконе.
Creat0R,
Мне кажется ваш скрипт раскрашивания исх. текста достоин места шапке!
Не помешала бы функция получения в буфере текста выделенного в SciTE. А то лень записывать в файл кусок а потом обрабатывать!!! Или она есть и я не заметил!
Плоховата инструкция по установке! Только шаманством чего получилось.
Maza Faka, Это для указания ширины колонок, аналог функции _GUICtrlListView_SetColumnWidth »
А почему ты используешь именно их а не аналог?
Maza Faka,
что означает параметр замены "\1"
Это первое совпадение в группе, \2 второе и т.д...
$Var = "My Test and only myne"
$Result = StringRegExpReplace($Var, "(?i)(My) .* (on.* my.*)", "\1ne, and \2")
MsgBox(0, "", $Result)
Заметь, служебные группы не учитываются.
в справке не нашёл
Оно есть для StringRegExpReplace (http://www.autoitscript.com/autoit3/docs/functions/StringRegExpReplace.htm):
test - The string to check
pattern - The regular expression to compare. See StringRegExp for pattern definition characters.
replace - The text to replace the regular expression matching text with. To insert matched group text, \0 - \9 (or $0 - $9) can be used as back-references.
count - [optional] The number of times to execute the replacement in the string. The default is 0. Use 0 for global replacement.
NikLok
Не помешала бы функция получения в буфере текста выделенного в SciTE
В последних версиях (http://creator-lab.ucoz.ru/load/4-1-0-18) есть функция интеграции в SciTE ;).
Creat0R, В последних версиях есть функция интеграции в SciTE »
Поставил все последнее - где искать / как пользоваться?
NikLok,
где искать / как пользоваться?
«Меню - Интегрировать программу в SciTE».
Пользоваться очень просто. В SciTE'е должен появиться (после перезапуска SciTE) пункт «Разукрасить код для форума» (в меню Tools). По его вызову будет запущена программка с кодом файла, останется только нажать “Выполнить”, дождаться обработки, и копировать результат :)
Creat0R, оДНАКО несмотря на успешную интеграцию в 1.75 и внесение строк #Au3ToPost Item
command.shortcut.0.$(file.patterns.au3)=Ctrl+K
command.0.$(file.patterns.au3)="$(SciteDefaultHome)\Au3ToPost.exe" "$(FilePath)"
command.name.0.$(file.patterns.au3)=Разукрасить код для форума
command.save.before.0.$(file.patterns.au3)=1
в au3.properties - тем не менее команда не появилась ! Может они в версии от 16 марта что-то поменяли?
И судя по коду все таки разукрасить только выделенный блок в редакторе нельзя!? Только целиком текст?!
NikLok,
Может они в версии от 16 марта что-то поменяли?
Возможно, я не тестировал на этой версии, только на 1.74 (Jun 18 2007).
судя по коду все таки разукрасить только выделенный блок в редакторе нельзя!? Только целиком текст?!
Это не предусмотрено, хотя по идее, перед вызовом можно просто скопировать выделенное (ctrl + c), и вызвав функцию переключить на режим ручного ввода кода, и вставть (ctrl + v).
HORRIBLE
18-03-2008, 01:22
Помогите пожалуйсто, нужно найти вот такую строку:
<TD bgcolor=A5A5A5 align=center><A HREF="/main.pl?edit=1&0.699065704971872">Обмундирование</A></TD>
в этой строке меняется только 1&0.699065704971872 ,а все остально остается, самое простое у меня получилось, а вот как полностью строчку найти у меня не получается(
Это мои попытки:
$result = StringRegExp($ReadFile, "(?i)(<TD bgcolor=A5A5A5 align=center><A HREF=>Обмундирование</A></TD>)", 3)
HORRIBLE,
нужно найти вот такую строку
....
в этой строке меняется только 1&0.699065704971872
$result = StringRegExp($ReadFile, '(?i)(<TD bgcolor=A5A5A5 align=center><A HREF="/main.pl?edit=.*">Обмундирование</A></TD>)', 3)
Как зажать спейс на несколько милисекунд?
(Что то ненашёл в мануале.)
NORIO,
Как зажать спейс на несколько милисекунд?
Не думаю что можно зажать беспрерывно, но можно нажимать на него довольно интенсивно:
$iTimerInit = TimerInit()
While TimerDiff($iTimerInit) < 3000
Send("{SPACE}")
WEnd
3 секунды будет посылать нажатия Space один за другим. У меня посылаются 226 пробелов за это время :)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.