Войти

Показать полную графическую версию : Несколько Вопросов немного не в тему от saavaage


saavaage
14-08-2010, 14:38
madmasles,
насчет 1-го замечания - проверил на разных условиях - все работает безупречно. Нет даже Сервер сценариев 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
madmasles,
насчет 1-го замечания - проверил на разных условиях - все работает безупречно. Нет даже Сервер сценариев 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
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
madmasles, это просто супер. Огромное спасибо.

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

madmasles
20-08-2010, 00:47
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
madmasles, Вот эта, указанная Вами, строка CSCRIPT %SYSTEMROOT%\system32\eventquery.vbs /fi "Type eq ERROR" /fo TABLE /NH выдает у меня только 20 строк »
дело в том, что она выводит только те ошибки, которые были в Вашей системе. Если убрать фильтр /fi "Type eq ERROR" (попытаться вывести все события), то скрипт не выдает все строки в окно. Можете проверить, запустив скрипт и потом cmd и сравнить.

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

4. Поменяйте » спасибо, сработало

madmasles
20-08-2010, 01:13
Если убрать фильтр /fi "Type eq ERROR" (попытаться вывести все события) »Я по Вашему заданию парсил полученный текст на слово ошибка.
Вы напишите конкретно, что Вам надо и что Вы хотите получить на выходе. Я же этого не знаю.

saavaage
20-08-2010, 01:51
Я по Вашему заданию парсил полученный текст на слово ошибка. »
Извините, виноват. Все работает нормально.

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

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

saavaage
20-08-2010, 02:33
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
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
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
madmasles, а мой вариант решения не посмотрите? Хочется знать правильно или нет сделал?

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

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

saavaage
21-08-2010, 00:41
madmasles,

А если функция __ErrorLog() не отработала и вернула 0, то Вы остаетесь с пустым окном. »
Не совсем понимаю, в каком случае она может не отработать? Извините, но я пока многое не понимаю. На мой взгляд, она должна отработать раз прописана к запуску...

у меня не отображается полная строка с описанием ошибки (обрывается на 300 с чем-то знаков) »
с чем это связано? ограничение Edit? Может тогда лучше использовать RichEdit?

madmasles
21-08-2010, 01:34
saavaage,
Строка в Listview у меня целиком не отображается.

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

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

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




© OSzone.net 2001-2012