Имя пользователя:
Пароль:
 

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

Аватара для madmasles

Ветеран


Сообщения: 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`е можно обновить данные.

Отправлено: 15:39, 14-08-2010 | #3