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

Показать сообщение отдельно

Аватара для madmasles

Ветеран


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

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


saavaage,
Вот что у меня получилось с полным отображением строк. Строки делятся на части и вставляются в разные колонки одной строки:
читать дальше »
Код: Выделить весь код
#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, $iX
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, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT))
GUICtrlSetState(-1, $GUI_FOCUS)
$hListView = GUICtrlGetHandle($ListView)
GUICtrlSetTip(-1, "Выделите мышкой строку," & @CRLF & "чтобы получить подсказку.")
If $aToList <> 0 Then
    _GUICtrlListView_AddColumn($hListView, 'Список событий с ошибками', 50)
    _GUICtrlListView_AddColumn($hListView, '')
    For $i = 1 To UBound($aToList) - 1
        _GUICtrlListView_AddItem($hListView, $aToList[$i][0])
        _GUICtrlListView_AddSubItem($hListView, $i - 1, $aToList[$i][1], 1)
    Next
    _GUICtrlListView_SetColumnWidth($hListView, 0, $LVSCW_AUTOSIZE)
    _GUICtrlListView_SetColumnWidth($hListView, 1, $LVSCW_AUTOSIZE)
    _GUICtrlListView_SetItemSelected($hListView, 0)
EndIf

GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $hButton1
            GUICtrlSetState($hButton1, $GUI_DISABLE)
            GUICtrlSetData($hInput, '')
            $aErrorsNew = __ErrorLog()
            If $aErrorsNew <> 0 Then
                _GUICtrlListView_DeleteAllItems($hListView)
                For $i = 1 To UBound($aErrorsNew) - 1
                    _GUICtrlListView_AddItem($hListView, $aToList[$i][0])
                    _GUICtrlListView_AddSubItem($hListView, $i - 1, $aToList[$i][1], 1)
                Next
                _GUICtrlListView_SetColumnWidth($hListView, 0, $LVSCW_AUTOSIZE)
                _GUICtrlListView_SetColumnWidth($hListView, 1, $LVSCW_AUTOSIZE)
                _GUICtrlListView_SetItemSelected($hListView, 0)
                SoundPlay(@WindowsDir & '\Media\tada.wav');звук будет только, если точно обновились.
            EndIf
            GUICtrlSetState($hButton1, $GUI_ENABLE)
            GUICtrlSetState($ListView, $GUI_FOCUS)
    EndSwitch
WEnd

Func __ErrorLog()
    Local $sLog = '', $j = 0, $hError, $aErrorsTemp, $i, $sError, $sError_0, $sError_1, $sError_Temp
    Dim $aErrors[1][2]
    $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][2]
            $j += 1
            $sError = StringStripWS(StringStripCR($aErrorsTemp[$i]), 7)
            If StringLen($sError) > 260 Then
                $sError_0 = StringLeft($sError, 240)
                $sError_Temp = StringTrimLeft($sError, 240)
                $sError_Temp = StringLeft($sError_Temp, StringInStr($sError_Temp, ' '))
                $sError_0 &= $sError_Temp
                $sError_1 = StringTrimLeft($sError, StringLen($sError_0))
                $aErrors[$j][0] = $sError_0
                $aErrors[$j][1] = $sError_1
            Else
                $aErrors[$j][0] = $sError
                $aErrors[$j][1] = ''
            EndIf
        EndIf
    Next
    $aErrors[0][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)
    If Not $sLog Then $sLog = 'не удается найти текст сообщения с номером ' & $iNumberError & _
            ' в файле сообщений NETMSG.'
    GUICtrlSetData($hInput, 'Ошибка № ' & $iNumberError & '  -  ' & $sLog)
    GUICtrlSetState($hButton1, $GUI_ENABLE)
    GUICtrlSetState($hListView, $GUI_ENABLE)
    DllCall('user32.dll', 'long', 'SendMessage', 'hwnd', $hForm1, 'int', 0x0111, 'int', 0x7103, 'int', 0)
EndFunc   ;==>_ErrorHelp

Последний раз редактировалось madmasles, 21-08-2010 в 20:33. Причина: поправил код

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

Отправлено: 20:09, 21-08-2010 | #9