Ветеран
Сообщения: 812
Благодарности: 353
|
Профиль
|
Отправить PM
| Цитировать
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`е можно обновить данные.
|