Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   Несколько Вопросов немного не в тему от saavaage (http://forum.oszone.net/showthread.php?t=183492)

saavaage 14-08-2010 14:38 1473560

Несколько Вопросов немного не в тему от saavaage
 
madmasles,
насчет 1-го замечания - проверил на разных условиях - все работает безупречно. Нет даже
Цитата:

Цитата madmasles
Сервер сценариев Windows (Microsoft R) версия 5.7
c Корпорация Майкрософт (Microsoft Corp.), 1996-2001. Все права защищены. »

Еще раз - вельми дзякуй (спасибо большое)!
насчет 1-ой линии - уже понял, что нельзя. Жаль, но в этом случае - некритично.

Несколько Вопросов немного не в тему:
1. можно ли сделать так, чтобы при выделении кода ошибки, этот код передавался в переменную. Суть - хочу, используя команду "net helpmsg <код ошибки>", организовать в форме пониже основного окна вывод подсказки об этой ошибке. Образно: сформировался список ошибок -> выделил код одной из них -> в нижнем информационном окне вылезла подсказка.

2. если у меня на форме есть Tab с рядом вкладок, то можно ли на общую кнопку "обновить" повесить разные комманды в зависимости от активной вкладки. Суть: одна и таже кнопка на форме при нажатии в различных вкладках запускает конкретные команды только для конкретной активной вкладки;

3. не объясните разницу при работе с кнопками в применении конструкций:
а)
читать дальше »
Код:

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
          EXIT
        Case Button1
          Команда
    EndSwitch
WEnd



б)
читать дальше »
Код:

$1button = GUICtrlCreateButton("Start", 15, 15, 100)
GUICtrlSetOnEvent($1button, "_1Button")

Func _1Button()
ControlDisable($mainwindow,"",$1button)
ControlDisable($mainwindow,"",$2button)       
Run(@ComSpec & ' /c devcon enable PCI\VEN_168C&DEV_001A&SUBSYS_2052168C&REV_01\4&1A598D38&0&0899', '', @SW_HIDE)
sleep (1000)
MsgBox(0,"","Драйвер запущен!",0)
ControlEnable($mainwindow,"",$2button)
EndFunc



Суть вопроса- если форма содержит много кнопок на разных вкладках + общие кнопки, то как будет лучше действовать:
- использовать вариант "а" - для общих, а вариант "б" - для конопок на конкретной вкладке
- использовать вариант "а"
- использовать вариант "б"
- другое ( если можно, объясните)

saavaage 14-08-2010 14:38 1478440

madmasles,
насчет 1-го замечания - проверил на разных условиях - все работает безупречно. Нет даже
Цитата:

Цитата madmasles
Сервер сценариев Windows (Microsoft R) версия 5.7
c Корпорация Майкрософт (Microsoft Corp.), 1996-2001. Все права защищены. »

Еще раз - вельми дзякуй (спасибо большое)!
насчет 1-ой линии - уже понял, что нельзя. Жаль, но в этом случае - некритично.

Несколько Вопросов немного не в тему:
1. можно ли сделать так, чтобы при выделении кода ошибки, этот код передавался в переменную. Суть - хочу, используя команду "net helpmsg <код ошибки>", организовать в форме пониже основного окна вывод подсказки об этой ошибке. Образно: сформировался список ошибок -> выделил код одной из них -> в нижнем информационном окне вылезла подсказка.

2. если у меня на форме есть Tab с рядом вкладок, то можно ли на общую кнопку "обновить" повесить разные комманды в зависимости от активной вкладки. Суть: одна и таже кнопка на форме при нажатии в различных вкладках запускает конкретные команды только для конкретной активной вкладки;

3. не объясните разницу при работе с кнопками в применении конструкций:
а)
читать дальше »
Код:

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
          EXIT
        Case Button1
          Команда
    EndSwitch
WEnd



б)
читать дальше »
Код:

$1button = GUICtrlCreateButton("Start", 15, 15, 100)
GUICtrlSetOnEvent($1button, "_1Button")

Func _1Button()
ControlDisable($mainwindow,"",$1button)
ControlDisable($mainwindow,"",$2button)       
Run(@ComSpec & ' /c devcon enable PCI\VEN_168C&DEV_001A&SUBSYS_2052168C&REV_01\4&1A598D38&0&0899', '', @SW_HIDE)
sleep (1000)
MsgBox(0,"","Драйвер запущен!",0)
ControlEnable($mainwindow,"",$2button)
EndFunc



Суть вопроса- если форма содержит много кнопок на разных вкладках + общие кнопки, то как будет лучше действовать:
- использовать вариант "а" - для общих, а вариант "б" - для конопок на конкретной вкладке
- использовать вариант "а"
- использовать вариант "б"
- другое ( если можно, объясните)

madmasles 14-08-2010 15:39 1478441

saavaage,
1. Имхо, тогда лучше вместо Edit использовать ListView, так как если юзер выделит не весь код ошибки, а только часть кода, то что это будет за подсказка. Я Вам пример с ListView приведу попозже. Только вопрос: кол-во строк с ошибками у меня всегда 20, это кол-во может меняться?
2. Мне кажется, что нельзя. Можно создать на одном месте столько кнопок, сколько у Вас Tab`ов и, при активации вкладки, делать соответствующую кнопку видимой, а остальные не видимыми (GUICtrlSetState()).
3. Почитайте про это Русская справка - Графический интерфейс(GUI) - Режим MessageLoop и Режим OnEvent Mode. (Лучше, конечно, в англ. справке почитать, но я, к сожалению, с англ. не дружу.:()

С ListView у меня так получилось:
читать дальше »
Код:

#include <Constants.au3>
#include <Encoding.au3>
#include <GUIConstantsEx.au3>
#include <GUIListview.au3>
#include <EditConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

Global $Form1, $Button1, $hDummyMenu, $hContextMenu, $hNewErrors_Item, $hInput, _
        $hListView, $aErrorsNew
Dim $aToList = __ErrorLog()

$Form1 = GUICreate("Form1", 620, 445, -1, -1)
GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
$Button1 = GUICtrlCreateButton("Обновить", 16, 120, 65, 57)
GUICtrlSetState(-1, $GUI_FOCUS)
$hDummyMenu = GUICtrlCreateDummy()
$hContextMenu = GUICtrlCreateContextMenu($hDummyMenu)
$hNewErrors_Item = GUICtrlCreateMenuItem("Обновить", $hContextMenu)
$hInput = GUICtrlCreateInput('', 95, 20, 400, 20, _
        BitOR($GUI_SS_DEFAULT_INPUT, $ES_LEFT, $ES_READONLY, $ES_WANTRETURN), _
        BitOR($WS_EX_CLIENTEDGE, $WS_EX_STATICEDGE))
$hListView = GUICtrlCreateListView('', 95, 50, 400, 320, -1, $LVS_EX_GRIDLINES)
GUICtrlSetTip(-1, "Выделите левой или правой кнопкой мышки" & @CRLF & _
        "строку, чтобы получить подсказку.")
If $aToList <> 0 Then
    _GUICtrlListView_AddColumn($hListView, $aToList[0], 370)
    For $i = 1 To UBound($aToList) - 1
        GUICtrlCreateListViewItem($aToList[$i], $hListView)
    Next
EndIf

GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button1, $hNewErrors_Item
            GUICtrlSetData($hInput, '')
            _GUICtrlListView_DeleteColumn($hListView, 0)
            _GUICtrlListView_DeleteAllItems($hListView)
            $aErrorsNew = __ErrorLog()
            If $aErrorsNew <> 0 Then
                _GUICtrlListView_AddColumn($hListView, $aErrorsNew[0], 370)
                _GUICtrlListView_BeginUpdate($hListView)
                For $i = 1 To UBound($aErrorsNew) - 1
                    _GUICtrlListView_AddItem($hListView, $aErrorsNew[$i])
                Next
                _GUICtrlListView_EndUpdate($hListView)
            EndIf
            GUICtrlSetState($Button1, $GUI_ENABLE)
            GUICtrlSetState($hNewErrors_Item, $GUI_ENABLE)
    EndSwitch
WEnd

Func __ErrorLog()
    GUICtrlSetState($Button1, $GUI_DISABLE)
    GUICtrlSetState($hNewErrors_Item, $GUI_DISABLE)
    Local $sLog = '', $j = 0, $hError, $aErrorsTemp, $i
    Dim $aErrors[1]
    $hError = Run('CSCRIPT.exe ' & @SystemDir & '\eventquery.vbs /fi "Type eq ERROR" /fo TABLE /NH', _
            '', @SW_HIDE, $STDOUT_CHILD)
    While 1
        $sLog &= StdoutRead($hError)
        If @error Then ExitLoop
        Sleep(10)
    WEnd
    If Not $sLog Then Return 0
    $aErrorsTemp = StringSplit(_Encoding_866To1251($sLog), @LF)
    If Not IsArray($aErrorsTemp) Then Return 0
    For $i = 1 To $aErrorsTemp[0]
        If StringInStr($aErrorsTemp[$i], "в журнале 'system'") Then
            $aErrors[0] = StringStripWS(StringStripCR($aErrorsTemp[$i]), 7)
            ExitLoop
        Else
            $aErrorsTemp[$i] = ''
        EndIf
    Next
    For $i = 1 To $aErrorsTemp[0]
        If StringInStr($aErrorsTemp[$i], "ошибка") Then
            ReDim $aErrors[UBound($aErrors) + 1]
            $j += 1
            $aErrors[$j] = StringStripWS(StringStripCR($aErrorsTemp[$i]), 7)
        EndIf
    Next
    If UBound($aErrors) < 2 Then Return 0
    Return $aErrors
EndFunc  ;==>__ErrorLog

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iCode, $tNMHDR, $hWndListView, $tInfo, $iIndex, $sLog = '', $hHelp

    $hWndListView = $hListView
    If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)
    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
        Case $hWndListView
            Switch $iCode
                Case $NM_CLICK
                    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
                    $iIndex = DllStructGetData($tInfo, "Index")
                    If $iIndex < 0 Then Return $GUI_RUNDEFMSG
                    $iNumberError = StringRegExpReplace(_GUICtrlListView_GetItemText($hListView, _
                            $iIndex), "(?s).*?ошибка (.*?)\s+?.*", '\1')
                    $hHelp = Run('net helpmsg ' & $iNumberError, '', @SW_HIDE, $STDOUT_CHILD)
                    While 1
                        $sLog &= StdoutRead($hHelp)
                        If @error Then ExitLoop
                        Sleep(10)
                    WEnd
                    $sLog = StringStripWS(StringStripCR(_Encoding_866To1251($sLog)), 7)
                    GUICtrlSetData($hInput, 'Ошибка № ' & $iNumberError & '  -  ' & $sLog)
                Case $NM_RCLICK
                    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
                    $iIndex = DllStructGetData($tInfo, "Index")
                    If $iIndex <> -1 Then
                        GUICtrlSetData($hInput, _GUICtrlListView_GetItemText($hListView, $iIndex))
                        $iIndex_Item = $iIndex
                        ShowMenu($hWnd, $hContextMenu, $hListView, 1)
                    EndIf
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc  ;==>WM_NOTIFY

Func ShowMenu($hWnd, $nContextID, $nContextControlID, $iMouse = 0)
    Local $hMenu = GUICtrlGetHandle($nContextID)
    Local $iCtrlPos = ControlGetPos($hWnd, "", $nContextControlID)
    Local $X = $iCtrlPos[0]
    Local $Y = $iCtrlPos[1] + $iCtrlPos[3]
    ClientToScreen($hWnd, $X, $Y)
    If $iMouse Then
        $X = MouseGetPos(0)
        $Y = MouseGetPos(1)
    EndIf
    DllCall("user32.dll", "int", "TrackPopupMenuEx", "hwnd", $hMenu, "int", 0, "int", $X, "int", $Y, "hwnd", $hWnd, "ptr", 0)
EndFunc  ;==>ShowMenu

Func ClientToScreen($hWnd, ByRef $X, ByRef $Y)
    Local $stPoint = DllStructCreate("int;int")
    DllStructSetData($stPoint, 1, $X)
    DllStructSetData($stPoint, 2, $Y)
    DllCall("user32.dll", "int", "ClientToScreen", "hwnd", $hWnd, "ptr", DllStructGetPtr($stPoint))
    $X = DllStructGetData($stPoint, 1)
    $Y = DllStructGetData($stPoint, 2)
    $stPoint = 0
EndFunc  ;==>ClientToScreen



PS
Был бы трезвым ни за что бы не получилось :)
Правой кнопкой мышки на Item`е можно обновить данные.

saavaage 17-08-2010 10:49 1478442

madmasles, это просто супер. Огромное спасибо.

saavaage 19-08-2010 21:27 1478443

madmasles, начал "ковырять" скрипт и появились вопросы:
1. похоже выводятся события только из журнала SYSTEM. Из всех остальных журналов нет данных
2. выводится только ограниченное кол-во строк журнала. Я сделал запрос на все события из system и получил больше 1600 строк. Скрипт выдает только 27 строк
3. Строки в основном окне вывода не дают возможности просмотра всего текста события, только то, что влезло в границы окна. Можно ли каким-то образом это устранить
4. Окно вывода расшифровки-пояснения ошибки выводит текст в одну строку, ограниченную краями окна (не виден весь текст) . Можно ли сделать вывод в несколько строк и как задать ширину окна вывода (увеличиваю ширину input, но все равно выводит в 1 строку)

madmasles 20-08-2010 00:47 1478444

saavaage,
1. и 2. Вот эта, указанная Вами, строка CSCRIPT %SYSTEMROOT%\system32\eventquery.vbs /fi "Type eq ERROR" /fo TABLE /NH выдает у меня только 20 строк ошибок. Поменяйте ее на нужную Вам.
3. В ListView, если текст не влазит по длине, появляется горизонтальная полоса прокрутки (если по высоте, то вертикальная). Если Вас это не устраивает, сделайте окно и ListView шире.
4. Поменяйте
Код:

...$hInput = GUICtrlCreateInput('', 95, 20, 400, 20, _
        BitOR($GUI_SS_DEFAULT_INPUT, $ES_LEFT, $ES_READONLY, $ES_WANTRETURN), _
        BitOR($WS_EX_CLIENTEDGE, $WS_EX_STATICEDGE))...

на
Код:

$hInput = GUICtrlCreateEdit('', 95, 10, 400, 34, BitOR($ES_READONLY, $ES_MULTILINE))

saavaage 20-08-2010 00:55 1478445

madmasles,
Цитата:

Цитата madmasles
Вот эта, указанная Вами, строка CSCRIPT %SYSTEMROOT%\system32\eventquery.vbs /fi "Type eq ERROR" /fo TABLE /NH выдает у меня только 20 строк »

дело в том, что она выводит только те ошибки, которые были в Вашей системе. Если убрать фильтр /fi "Type eq ERROR" (попытаться вывести все события), то скрипт не выдает все строки в окно. Можете проверить, запустив скрипт и потом cmd и сравнить.

Цитата:

Цитата madmasles
В ListView, если текст не влазит по длине, появляется горизонтальная полоса прокрутки (если по высоте, то вертикальная). Если Вас это не устраивает, сделайте окно и ListView шире. »

понял, достаточно было дважды щелкнуть на границе столбца...

Цитата:

Цитата madmasles
4. Поменяйте »

спасибо, сработало

madmasles 20-08-2010 01:13 1478446

Цитата:

Цитата saavaage
Если убрать фильтр /fi "Type eq ERROR" (попытаться вывести все события) »

Я по Вашему заданию парсил полученный текст на слово ошибка.
Вы напишите конкретно, что Вам надо и что Вы хотите получить на выходе. Я же этого не знаю.

saavaage 20-08-2010 01:51 1477692

Цитата:

Цитата madmasles
Я по Вашему заданию парсил полученный текст на слово ошибка. »

Извините, виноват. Все работает нормально.

PS Объясню ситуацию: У меня у самого ошибок не больше 10. Я решил проверить на парсинг на слово "информация", т.к. там список получается гораздо больше (меня беспокоил вопрос - все ли строки попадают в вывод). И, вообщем, накосячил, - убрал фильтр, но забыл в скрипте откорректировать парсинг (заменить "ошибка" на "информация"), и cmd-файл выдал, естественно, гораздо более длинный список.

Вопрос закрыт. Еще раз, спасибо.

saavaage 20-08-2010 02:33 1477698

madmasles, немного подсократил Ваш скрипт, т.к. мне не надо было, чтобы обновление происходило через контекстное меню (достаточно кнопки) + добавил корректировку ширины столбца. Получился такой код:

читать дальше »
Код:

#include <Constants.au3>
#include <Encoding.au3>
#include <GUIConstantsEx.au3>
#include <GUIListview.au3>
#include <EditConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

Global $Form1, $Button1, $hInput, $hListView, $aErrorsNew
Dim $aToList = __ErrorLog()

$Form1 = GUICreate("Form1", 620, 445, -1, -1)
GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
$Button1 = GUICtrlCreateButton("Обновить", 16, 120, 65, 57)
GUICtrlSetState(-1, $GUI_FOCUS)
$hInput = GUICtrlCreateEdit('', 95, 10, 400, 34, BitOR($ES_READONLY, $ES_MULTILINE))
$hListView = GUICtrlCreateListView('Список событий с ошибками', 95, 60, 400, 320, -1, $LVS_EX_GRIDLINES)
_GUICtrlListView_SetColumnWidth($hListView, 0, 2500)
GUICtrlSetTip(-1, "Выделите левой или правой кнопкой мышки" & @CRLF & "строку, чтобы получить подсказку.")
If $aToList <> 0 Then
    _GUICtrlListView_AddColumn($hListView, $aToList[0], 2500)
    For $i = 1 To UBound($aToList) - 1
        GUICtrlCreateListViewItem($aToList[$i], $hListView)
    Next
EndIf

GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button1
            GUICtrlSetData($hInput, '')
                  _GUICtrlListView_DeleteColumn($hListView, 0)
            _GUICtrlListView_DeleteAllItems($hListView)
                        $aErrorsNew = __ErrorLog()
            If $aErrorsNew <> 0 Then
                                _GUICtrlListView_AddColumn($hListView, $aErrorsNew[0], 2500)
                _GUICtrlListView_BeginUpdate($hListView)
                For $i = 1 To UBound($aErrorsNew) - 1
                    _GUICtrlListView_AddItem($hListView, $aErrorsNew[$i])
                Next
                _GUICtrlListView_EndUpdate($hListView)
                                EndIf
            GUICtrlSetState($Button1, $GUI_ENABLE)
        EndSwitch
WEnd

Func __ErrorLog()
    GUICtrlSetState($Button1, $GUI_DISABLE)
    Local $sLog = '', $j = 0, $hError, $aErrorsTemp, $i = 0
    Dim $aErrors[1]
    $hError = Run('CSCRIPT.exe ' & @SystemDir & '\eventquery.vbs /v /fi "Type eq ERROR" /fo TABLE /NH', '', @SW_HIDE, $STDOUT_CHILD)
    While 1
        $sLog &= StdoutRead($hError)
        If @error Then ExitLoop
        Sleep(100)
    WEnd
    If Not $sLog Then Return 0
    $aErrorsTemp = StringSplit(_Encoding_866To1251($sLog), @LF)
    If Not IsArray($aErrorsTemp) Then Return 0
    For $i = 1 To $aErrorsTemp[0]
        If StringInStr($aErrorsTemp[$i], "ошибка") Then
            ReDim $aErrors[UBound($aErrors) + 1]
            $j += 1
            $aErrors[$j] = StringStripWS(StringStripCR($aErrorsTemp[$i]), 7)
        EndIf
    Next
    If UBound($aErrors) < 2 Then Return 0
    Return $aErrors
EndFunc  ;==>__ErrorLog

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iCode, $tNMHDR, $hWndListView, $tInfo, $iIndex, $sLog = '', $hHelp

    $hWndListView = $hListView
    If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)
    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
        Case $hWndListView
            Switch $iCode
                Case $NM_CLICK
                    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
                    $iIndex = DllStructGetData($tInfo, "Index")
                    If $iIndex < 0 Then Return $GUI_RUNDEFMSG
                    $iNumberError = StringRegExpReplace(_GUICtrlListView_GetItemText($hListView, $iIndex), "(?s).*?ошибка (.*?)\s+?.*", '\1')
                    $hHelp = Run('net helpmsg ' & $iNumberError, '', @SW_HIDE, $STDOUT_CHILD)
                    While 1
                        $sLog &= StdoutRead($hHelp)
                        If @error Then ExitLoop
                        Sleep(10)
                    WEnd
                    $sLog = StringStripWS(StringStripCR(_Encoding_866To1251($sLog)), 7)
                    GUICtrlSetData($hInput, 'Ошибка № ' & $iNumberError & '  -  ' & $sLog)
                Case $NM_RCLICK
                    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
                    $iIndex = DllStructGetData($tInfo, "Index")
                    If $iIndex <> -1 Then
                        GUICtrlSetData($hInput, _GUICtrlListView_GetItemText($hListView, $iIndex))
                        $iIndex_Item = $iIndex
                                        EndIf
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc  ;==>WM_NOTIFY



Не посмотрите, все ли верно.

PS Обнаружил косяк - при нажатии на кнопку "Обновить" более 1-ого раза, начинается, в укороченном варианте - вставление новых данных с последней строки +1, в старом варианте (пост http://forum.oszone.net/post-1473605-15.html )- "размножение" строк с ошибками (добавление новых данных с последней строки +1 без очистки старых данных).

saavaage 20-08-2010 21:59 1478287

madmasles, кажется я нашел в чем была проблема:

дело в том, что, похоже функция _GUICtrlListView_AddItem($hListView, $aErrorsNew[$i]) добавляет строки к последней в списке. Таким образом, если заменить код:
читать дальше »
Код:

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button1
            GUICtrlSetData($hInput, '')
                  _GUICtrlListView_DeleteColumn($hListView, 0)
            _GUICtrlListView_DeleteAllItems($hListView)
                        $aErrorsNew = __ErrorLog()
            If $aErrorsNew <> 0 Then
                                _GUICtrlListView_AddColumn($hListView, $aErrorsNew[0], 2500)
                _GUICtrlListView_BeginUpdate($hListView)
                For $i = 1 To UBound($aErrorsNew) - 1
                    _GUICtrlListView_AddItem($hListView, $aErrorsNew[$i])
                Next
                _GUICtrlListView_EndUpdate($hListView)
                                EndIf
            GUICtrlSetState($Button1, $GUI_ENABLE)
        EndSwitch
WEnd



на

читать дальше »
Код:

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button1
            GUICtrlSetData($hInput, '')
                  _GUICtrlListView_DeleteColumn($hListView, 0)
            _GUICtrlListView_DeleteAllItems($hListView)
                        $aErrorsNew = __ErrorLog()
            If $aErrorsNew <> 0 Then
                                _GUICtrlListView_AddColumn($hListView, $aErrorsNew[0], 2500)
                _GUICtrlListView_BeginUpdate($hListView)
                For $i = 1 To UBound($aErrorsNew) - 1
                    GUICtrlCreateListViewItem($aErrorsNew[$i], $hListView)
                Next
                _GUICtrlListView_EndUpdate($hListView)
                                EndIf
            GUICtrlSetState($Button1, $GUI_ENABLE)
        EndSwitch
WEnd



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

+ еще один вопрос:
насколько, в этом случае, нужны следующие строки:

_GUICtrlListView_DeleteColumn($hListView, 0)
_GUICtrlListView_AddColumn($hListView, $aErrorsNew[0], 2500)

madmasles 20-08-2010 22:47 1478325

saavaage,
Я свой и Ваш код поправил давно. Не выкладывал, так как у меня не отображается полная строка с описанием ошибки (обрывается на 300 с чем-то знаков). Искал как убрать это ограничение, вроде в Гугле ссылку нашел на официальный форум, а он висит.
С размножением строк и некоторыми другими косяками разобрался. Как я понял, все функции из GUIListview.au3 работают с Handle Listview, а родные функции работают с ID. При создании ($ListView = GUICtrlCreateListView()) $ListView это ID, а нужен был Handle.
Предварительно:
читать дальше »
Код:

#include <Constants.au3>
#include <Encoding.au3>
#include <GUIConstantsEx.au3>
#include <GUIListview.au3>
#include <EditConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

Opt('MustDeclareVars', 1)

Global $hForm1, $hButton1, $hInput, $ListView, $hListView, $aErrorsNew, $nMsg
Dim $aToList = __ErrorLog()

$hForm1 = GUICreate("Form1", 620, 445, -1, -1)
GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
$hButton1 = GUICtrlCreateButton("Обновить", 16, 120, 65, 57)
$hInput = GUICtrlCreateEdit('', 95, 10, 400, 34, BitOR($ES_READONLY, $ES_MULTILINE))
$ListView = GUICtrlCreateListView('Список событий с ошибками', 95, 60, 400, 320, -1, $LVS_EX_GRIDLINES)
GUICtrlSetState(-1, $GUI_FOCUS)
$hListView = GUICtrlGetHandle($ListView)
_GUICtrlListView_SetColumnWidth($hListView, 0, 2000)
GUICtrlSetTip(-1, "Выделите мышкой строку," & @CRLF & "чтобы получить подсказку.")
If $aToList <> 0 Then
    _GUICtrlListView_AddColumn($hListView, '')
    For $i = 1 To UBound($aToList) - 1
        _GUICtrlListView_AddItem($hListView, $aToList[$i])
    Next
    _GUICtrlListView_SetItemSelected($hListView, 0)
EndIf

GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $hButton1
            GUICtrlSetData($hInput, '')
            $aErrorsNew = __ErrorLog()
            If $aErrorsNew <> 0 Then
                _GUICtrlListView_DeleteAllItems($hListView)
                For $i = 1 To UBound($aErrorsNew) - 1
                    _GUICtrlListView_AddItem($hListView, $aErrorsNew[$i])
                Next
                _GUICtrlListView_SetItemSelected($hListView, 0)
            EndIf
            GUICtrlSetState($hButton1, $GUI_ENABLE)
            GUICtrlSetState($ListView, $GUI_FOCUS)
    EndSwitch
WEnd

Func __ErrorLog()
    GUICtrlSetState($hButton1, $GUI_DISABLE)
    Local $sLog = '', $j = 0, $hError, $aErrorsTemp, $i
    Dim $aErrors[1]
    $hError = Run('CSCRIPT.exe ' & @SystemDir & '\eventquery.vbs /v /fi "Type eq ERROR" /fo TABLE /NH', '', @SW_HIDE, $STDOUT_CHILD)
    While 1
        $sLog &= StdoutRead($hError)
        If @error Then ExitLoop
        Sleep(10)
    WEnd
    If Not $sLog Then Return 0
    $aErrorsTemp = StringSplit(_Encoding_866To1251($sLog), @LF)
    If Not IsArray($aErrorsTemp) Then Return 0
    For $i = 1 To $aErrorsTemp[0]
        If StringInStr($aErrorsTemp[$i], "ошибка") Then
            ReDim $aErrors[UBound($aErrors) + 1]
            $j += 1
            $aErrors[$j] = StringStripWS(StringStripCR($aErrorsTemp[$i]), 7)
        EndIf
    Next
    $aErrors[0] = UBound($aErrors) - 1
    If UBound($aErrors) < 2 Then Return 0
    Return $aErrors
EndFunc  ;==>__ErrorLog

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    Local $tNMITEMACTIVATE = DllStructCreate($tagNMITEMACTIVATE, $lParam)
    Local $hFrom = DllStructGetData($tNMITEMACTIVATE, 'hWndFrom')
    Local $Index = DllStructGetData($tNMITEMACTIVATE, 'Index')
    Local $ID = DllStructGetData($tNMITEMACTIVATE, 'Code')

    Switch $hFrom
        Case $hListView
            Switch $ID
                Case $LVN_ITEMCHANGED
                    If (BitAND(DllStructGetData($tNMITEMACTIVATE, 'Changed'), $LVIF_STATE)) And _
                            (BitAND(DllStructGetData($tNMITEMACTIVATE, 'NewState'), $LVIS_SELECTED)) _
                            And (Not BitAND(DllStructGetData($tNMITEMACTIVATE, 'OldState'), $LVIS_FOCUSED)) Then
                        _ErrorHelp($Index)
                    EndIf
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc  ;==>WM_NOTIFY

Func _ErrorHelp($Index)
    Local $iNumberError, $hHelp, $sLog = ''
    GUICtrlSetState($hButton1, $GUI_DISABLE)
    GUICtrlSetState($hListView, $GUI_DISABLE)
    $iNumberError = StringRegExpReplace(_GUICtrlListView_GetItemText($hListView, $Index), "(?s).*?ошибка (.*?)\s+?.*", '\1')
    $hHelp = Run('net helpmsg ' & $iNumberError, '', @SW_HIDE, $STDOUT_CHILD)
    While 1
        $sLog &= StdoutRead($hHelp)
        If @error Then ExitLoop
        Sleep(10)
    WEnd
    $sLog = StringStripWS(StringStripCR(_Encoding_866To1251($sLog)), 7)
    GUICtrlSetData($hInput, 'Ошибка № ' & $iNumberError & '  -  ' & $sLog)
    GUICtrlSetState($hButton1, $GUI_ENABLE)
    GUICtrlSetState($hListView, $GUI_ENABLE)
EndFunc  ;==>_ErrorHelp


saavaage 20-08-2010 22:56 1478338

madmasles, а мой вариант решения не посмотрите? Хочется знать правильно или нет сделал?

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

madmasles 21-08-2010 00:34 1478388

Цитата:

Цитата saavaage
жму на кнопку - список очищается и заполняется снова »

А если функция __ErrorLog() не отработала и вернула 0, то Вы остаетесь с пустым окном. Можно добавить паузу между удалением всех строк и созданием новых или, например прогрессбар запустить и убрать его только после обновления, или звуковой сигнал подать, или какое-то другое сообщение сделать об успехе (ошибке) обновления, имхо.

saavaage 21-08-2010 00:41 1478390

madmasles,

Цитата:

Цитата madmasles
А если функция __ErrorLog() не отработала и вернула 0, то Вы остаетесь с пустым окном. »

Не совсем понимаю, в каком случае она может не отработать? Извините, но я пока многое не понимаю. На мой взгляд, она должна отработать раз прописана к запуску...

Цитата:

Цитата madmasles
у меня не отображается полная строка с описанием ошибки (обрывается на 300 с чем-то знаков) »

с чем это связано? ограничение Edit? Может тогда лучше использовать RichEdit?

madmasles 21-08-2010 01:34 1478413

saavaage,
Строка в Listview у меня целиком не отображается.

saavaage 21-08-2010 01:41 1478417

madmasles, точно, я только сейчас заметил. Не уверен, но может сделать через создание еще одного столбца + разбиение строки по 300 букв на части и разнесение их по разным столбцам?

Creat0R 21-08-2010 06:29 1478448

Эта тема была отделена от другой, и она закрыта. Если хотите продолжать развивать и решать тему, придумайте вменяемое название и не лезьте в чужие темы с оффтопом! :closed-to

Мне пришлось попотеть чтобы эту тему “выцарапать” сюда.


Время: 01:54.

Время: 01:54.
© OSzone.net 2001-