PDA

Показать полную графическую версию : [Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:.


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 [14] 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78

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, но безуспешно. :(

NikLok
17-03-2008, 12:25
Помогите разобраться с 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
Если будет ругаться на необьявленные переменные - раскомментируй закоментированные строчки.

NikLok
17-03-2008, 15:05
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
Всё это описано в справке, не ленись туда заглядывать ;)

NikLok
17-03-2008, 16:37
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")

Creat0R
17-03-2008, 17:22
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).

NikLok
17-03-2008, 17:38
Creat0R, Maza Faka, Вот еще забыл спросить а строки:GUICtrlSendMsg(-1, 0x101E, 0, 150)
GUICtrlSendMsg(-1, 0x101E, 1, 125)
Для чего нужны? И как узнать то когда нужно посылать сообщ а когда нет! И какие именно!??

Creat0R
17-03-2008, 18:01
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", в справке не нашёл.
имо, плохая идея использовать значения вместо констант »
Знаю и сам никогда так не делаю, просто поторопился ;)

NikLok
17-03-2008, 18:14
Вообще я немного в шоке. Дело в том что ранее написал цикл вида:
; 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 »
А почему ты используешь именно их а не аналог?

Creat0R
17-03-2008, 20:18
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 ;).

NikLok
17-03-2008, 22:19
Creat0R, В последних версиях есть функция интеграции в SciTE »
Поставил все последнее - где искать / как пользоваться?

Creat0R
17-03-2008, 22:29
NikLok,
где искать / как пользоваться?
«Меню - Интегрировать программу в SciTE».
Пользоваться очень просто. В SciTE'е должен появиться (после перезапуска SciTE) пункт «Разукрасить код для форума» (в меню Tools). По его вызову будет запущена программка с кодом файла, останется только нажать “Выполнить”, дождаться обработки, и копировать результат :)

NikLok
18-03-2008, 00:08
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 марта что-то поменяли?

И судя по коду все таки разукрасить только выделенный блок в редакторе нельзя!? Только целиком текст?!

Creat0R
18-03-2008, 00:37
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)

Creat0R
18-03-2008, 03:06
HORRIBLE,
нужно найти вот такую строку
....
в этой строке меняется только 1&0.699065704971872


$result = StringRegExp($ReadFile, '(?i)(<TD bgcolor=A5A5A5 align=center><A HREF="/main.pl?edit=.*">Обмундирование</A></TD>)', 3)

NORIO
18-03-2008, 03:54
Как зажать спейс на несколько милисекунд?

(Что то ненашёл в мануале.)

Creat0R
18-03-2008, 04:21
NORIO,
Как зажать спейс на несколько милисекунд?
Не думаю что можно зажать беспрерывно, но можно нажимать на него довольно интенсивно:


$iTimerInit = TimerInit()

While TimerDiff($iTimerInit) < 3000
Send("{SPACE}")
WEnd

3 секунды будет посылать нажатия Space один за другим. У меня посылаются 226 пробелов за это время :)




© OSzone.net 2001-2012