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

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » Несколько Вопросов немного не в тему от saavaage

Закрытая тема
Настройки темы
Несколько Вопросов немного не в тему от saavaage

Ветеран


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


Конфигурация

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


Изменения
Автор: saavaage
Дата: 14-08-2010
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


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

Отправлено: 14:38, 14-08-2010

 

Ветеран


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

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


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)

Последний раз редактировалось saavaage, 20-08-2010 в 22:14.


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



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Аватара для madmasles

Ветеран


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

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


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
Это сообщение посчитали полезным следующие участники:

Отправлено: 22:47, 20-08-2010 | #12


Ветеран


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

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


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

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

-------
мы рождены, чтоб сказку сделать былью


Отправлено: 22:56, 20-08-2010 | #13


Аватара для madmasles

Ветеран


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

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


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

Отправлено: 00:34, 21-08-2010 | #14


Ветеран


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

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


madmasles,

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

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

-------
мы рождены, чтоб сказку сделать былью


Отправлено: 00:41, 21-08-2010 | #15


Аватара для madmasles

Ветеран


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

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


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

Отправлено: 01:34, 21-08-2010 | #16


Ветеран


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

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


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

-------
мы рождены, чтоб сказку сделать былью


Последний раз редактировалось saavaage, 21-08-2010 в 01:58.


Отправлено: 01:41, 21-08-2010 | #17


Аватара для Creat0R

Must AutoIt


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

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


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

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

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community

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

Отправлено: 06:29, 21-08-2010 | #18



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » Несколько Вопросов немного не в тему от saavaage

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - Windows Vista - решил немного переделать тему Aero. Возник вопрос. Malfatto Оформление Windows 11/ 10 / 8 / 7 / Vista 12 27-10-2008 00:07
Несколько вопросов по ОС Master WEB Общий по Linux 33 02-08-2007 23:23
Vista Build 5308. Как устанавливать Windows Aero(и немного вопросов)? MaxCmd Microsoft Windows Vista 3 08-08-2006 19:38
Несколько вопросов barbos Общий по Linux 8 16-12-2004 20:40
Несколько вопросов об ... Sharkky Программирование и базы данных 4 08-10-2003 13:01




 
Переход