Что нового

Режим OnEvent и приоритетность

Автор
V

VadimKHL

Новичок
Сообщения
155
Репутация
0
InnI сказал(а):
VadimKHL
очередность в данном случае не соблюдается
Естественно. Если вы сначала нажимаете "большую" кнопку (например, +4), затем меньшую (+2), после чего проверяете СНАЧАЛА на наличие 2... конечно, 2 там будет. Как бы вы кнопки не нажимали, очередь у вас всегда будет от "меньшей" к "большей". Что-то вы перемудрили.

Чем вам не нравится код из вашего сообщения #13 с добавлением AdlibRegister и GUICtrlSendMsg из моего сообщения #14 ?

Да, действительно проще. И очередность в данном случае соблюдается. Уже ближе к решению.
Но сразу появляются вопрос, как тогда скрыть "ненужную кнопку" и как сделать что бы туда фокус не прыгал?
 
Автор
V

VadimKHL

Новичок
Сообщения
155
Репутация
0
Что бы фокус не прыгал, сделал так:
Код:
AdlibRegister("BtnClick", 100)
Func BtnClick()
ControlCommand($WINGUI, "", "TMR4", "SendCommandID", "")
EndFunc


Но не знаю что нужно указать в последнем поле "ControlID".
Как определить?


Добавлено:
Сообщение автоматически объединено:

Извиняюсь, в поле CommandID:
ControlCommand($WINGUI, "", "TMR4", "SendCommandID", "????")

И вообще это правильное решение?
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
VadimKHL
Откройте справку по функции ControlCommand и попробуйте найти в таблице хоть что-нибудь, связанное с Button.
Не работает эта функция с кнопками. Разобрался. Работает на уровне уведомлений.

По-моему, решение проблемы мы нашли. А различные "рюшечки" в виде фокусов и скрытых кнопок - это вообще не отсюда.
 
Автор
V

VadimKHL

Новичок
Сообщения
155
Репутация
0
InnI сказал(а):
VadimKHL
Откройте справку по функции ControlCommand и попробуйте найти в таблице хоть что-нибудь, связанное с Button.
Не работает эта функция с кнопками.

По-моему, решение проблемы мы нашли. А различные "рюшечки" в виде фокусов и скрытых кнопок - это вообще не отсюда.

Готов поспорить. РАБОТАЕТ! :laugh: Оно как раз является решением моей проблемы.
:beer:
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>

Opt("GUIOnEventMode", 1) ; Включить режим отслеживания событий GUI.

Global $FLAGBUT = 0

; ====================================================================================================================
; Создаем визуальное окно и объекты в нем.
; ====================================================================================================================

; Создать визуальное окно.
$WINGUI = GUICreate("TEST", 470, 245, -1, -1, BitOr($WS_POPUP, $WS_BORDER))

; Информауионные строки.
$lbTMR1 = GUICtrlCreateLabel("TMR1:", 10, 10, 40, 15, $SS_LEFTNOWORDWRAP, $GUI_WS_EX_PARENTDRAG)
$lbTMR2 = GUICtrlCreateLabel("TMR2:", 10, 25, 40, 15, $SS_LEFTNOWORDWRAP, $GUI_WS_EX_PARENTDRAG)
$lbTMR3 = GUICtrlCreateLabel("TMR3:", 10, 40, 40, 15, $SS_LEFTNOWORDWRAP, $GUI_WS_EX_PARENTDRAG)
$lbTMR4 = GUICtrlCreateLabel("TMR4:", 10, 55, 40, 15, $SS_LEFTNOWORDWRAP, $GUI_WS_EX_PARENTDRAG)

$idTMR1 = GUICtrlCreateLabel("0", 55, 10, 65, 15, $SS_LEFTNOWORDWRAP, $GUI_WS_EX_PARENTDRAG)
$idTMR2 = GUICtrlCreateLabel("0", 55, 25, 65, 15, $SS_LEFTNOWORDWRAP, $GUI_WS_EX_PARENTDRAG)
$idTMR3 = GUICtrlCreateLabel("0", 55, 40, 65, 15, $SS_LEFTNOWORDWRAP, $GUI_WS_EX_PARENTDRAG)
$idTMR4 = GUICtrlCreateLabel("0", 55, 55, 65, 15, $SS_LEFTNOWORDWRAP, $GUI_WS_EX_PARENTDRAG)

; Кнопки.
GUICtrlCreateButton("TMR1", 260, 70, 100, 25)
GUICtrlSetOnEvent(-1, "_TMR1")
GUICtrlCreateButton("TMR2", 260, 95, 100, 25)
GUICtrlSetOnEvent(-1, "_TMR2")
GUICtrlCreateButton("TMR3", 260, 120, 100, 25)
GUICtrlSetOnEvent(-1, "_TMR3")
$BTHIDE = GUICtrlCreateButton("TMR4", 260, 145, 100, 25)
GUICtrlSetOnEvent(-1, "_TMR4")
GUICtrlSetState($BTHIDE, $GUI_HIDE)

; Системные события.
GUISetOnEvent($GUI_EVENT_CLOSE, "_CLOSEEvent")
GUISetState(@SW_SHOW, $WINGUI)

Global $TMRUPDATE = TimerInit()

While 1
   If TimerDiff($TMRUPDATE) > 100 Then
	  $TMRUPDATE = TimerInit()
	  ControlCommand($WINGUI, "", "TMR4", "SendCommandID", "")
   EndIf
WEnd

Func _TMR1()
   For $TMR1 = 1 To 5
	  GUICtrlSetData ($idTMR1, $TMR1)
	  sleep (500)
   Next
EndFunc

Func _TMR2()
   For $TMR2 = 1 To 5
	  GUICtrlSetData ($idTMR2, $TMR2)
	  sleep (500)
   Next
EndFunc

Func _TMR3()
   For $TMR3 = 1 To 5
	  GUICtrlSetData ($idTMR3, $TMR3)
	  sleep (500)
   Next
EndFunc

Func _TMR4()
   For $TMR4 = 1 To 5
	  GUICtrlSetData ($idTMR4, $TMR4)
	  sleep (500)
   Next
EndFunc

; ====================================================================================================================
; Функции системных событий.
; ====================================================================================================================
Func _CLOSEEvent()
    Exit
EndFunc
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
VadimKHL
РАБОТАЕТ!
Код:
ControlCommand($WINGUI, "", "TMR4", "SendCommandID", "")
Чудеса. Элемент в этом случае получает WM_GETTEXT. А AutoIt считает, что элемент "нажали". :scratch:
 
A

Alofa

Гость
OffTopic:
InnI сказал(а):
... Элемент в этом случае получает WM_GETTEXT...
Из справки: сказал(а):
"SendCommandID", Command IDЭмулирует сообщение WM_COMMAND. Обычно используется для элемента ToolbarWindow32. Используйте вкладку ToolBar утилиты Au3Info чтобы получить Command ID.
 
Автор
V

VadimKHL

Новичок
Сообщения
155
Репутация
0
InnI сказал(а):
VadimKHL
РАБОТАЕТ!
Код:
ControlCommand($WINGUI, "", "TMR4", "SendCommandID", "")
Чудеса. Элемент в этом случае получает WM_GETTEXT. А AutoIt считает, что элемент "нажали". :scratch:

Да. Причем кнопку можно даже не скрывать, в отличии от GUICtrlSendMsg или ControlClick, фокус (табуляция) на нее не прыгает.
Просто где то в "стэк" событий OnEvent добавляется в очередь (если она есть) событие о нажатии кнопки.

Я конечно хочу сделать так, что бы даже кнопку скрытую добавлять не нужно было, а сразу добавлять события в очередь,
но т.к. я очень мало знаю про скрипты автоит, остановлюсь на данном варианте.

Спасибо всем за помощь!

P.S.: Ну если конечно вариант найдется более "интересный", прошу написать об этом.
Ну и конечно так и не понял, что нужно вписать в последнее поле функции ControlCommand, которое CommandID (которое сейчас пустое, но все работает).
Если кто знает, дайте знать.
 
A

Alofa

Гость
VadimKHL сказал(а):
... Ну если конечно вариант найдется более "интересный"...
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>

;~ Global $iOpt = Opt("GUIOnEventMode", 1) ; Включить режим отслеживания событий GUI.

Global $FLAGBUT = 0

; ====================================================================================================================
; Создаем визуальное окно и объекты в нем.
; ====================================================================================================================

; Создать визуальное окно.
$WINGUI = GUICreate("TEST", 470, 245, -1, -1, BitOr($WS_POPUP, $WS_BORDER))

; Информауионные строки.
$lbTMR1 = GUICtrlCreateLabel("TMR1:", 10, 10, 40, 15, $SS_LEFTNOWORDWRAP, $GUI_WS_EX_PARENTDRAG)
$lbTMR2 = GUICtrlCreateLabel("TMR2:", 10, 25, 40, 15, $SS_LEFTNOWORDWRAP, $GUI_WS_EX_PARENTDRAG)
$lbTMR3 = GUICtrlCreateLabel("TMR3:", 10, 40, 40, 15, $SS_LEFTNOWORDWRAP, $GUI_WS_EX_PARENTDRAG)
$lbTMR4 = GUICtrlCreateLabel("TMR4:", 10, 55, 40, 15, $SS_LEFTNOWORDWRAP, $GUI_WS_EX_PARENTDRAG)

$idTMR1 = GUICtrlCreateLabel("0", 55, 10, 65, 15, $SS_LEFTNOWORDWRAP, $GUI_WS_EX_PARENTDRAG)
$idTMR2 = GUICtrlCreateLabel("0", 55, 25, 65, 15, $SS_LEFTNOWORDWRAP, $GUI_WS_EX_PARENTDRAG)
$idTMR3 = GUICtrlCreateLabel("0", 55, 40, 65, 15, $SS_LEFTNOWORDWRAP, $GUI_WS_EX_PARENTDRAG)
$idTMR4 = GUICtrlCreateLabel("0", 55, 55, 65, 15, $SS_LEFTNOWORDWRAP, $GUI_WS_EX_PARENTDRAG)

; Кнопки.
GUICtrlCreateButton("TMR1", 260, 70, 100, 25)
GUICtrlSetOnEvent(-1, "_TMR1")
GUICtrlCreateButton("TMR2", 260, 95, 100, 25)
GUICtrlSetOnEvent(-1, "_TMR2")
GUICtrlCreateButton("TMR3", 260, 120, 100, 25)
GUICtrlSetOnEvent(-1, "_TMR3")
;~ $BTHIDE = GUICtrlCreateButton("TMR4", 260, 145, 100, 25)
;~ GUICtrlSetOnEvent(-1, "_TMR4")
;~ GUICtrlSetState($BTHIDE, $GUI_HIDE)

; Системные события.
GUISetOnEvent($GUI_EVENT_CLOSE, "_CLOSEEvent")
GUISetState(@SW_SHOW, $WINGUI)

Global $TMRUPDATE = TimerInit()

While 1
   If TimerDiff($TMRUPDATE) > 100 Then
      $TMRUPDATE = TimerInit()
;~       ControlCommand($WINGUI, "", "TMR4", "SendCommandID", "")
	Opt("GUIOnEventMode", 0)
	  _TMR4()
	Opt("GUIOnEventMode", 1)
   EndIf
WEnd
; ...
 
Автор
V

VadimKHL

Новичок
Сообщения
155
Репутация
0
Alofa сказал(а):
VadimKHL сказал(а):
... Ну если конечно вариант найдется более "интересный"...
Код:
While 1
   If TimerDiff($TMRUPDATE) > 100 Then
      $TMRUPDATE = TimerInit()
;~       ControlCommand($WINGUI, "", "TMR4", "SendCommandID", "")
	  _TMR4()
   EndIf
WEnd

Мда... Alofa, амбициозность неистребима.
Нажмите любую кнопку, когда функция TMR4 выполняется.
Потом сравните мой исходной пример.
Я думаю разницу Вы найдете.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Alofa
Я тоже умею читать справку ;) и знаю, что делает WM_COMMAND. Меня смутило сообщение WM_GETTEXT, которое отлавливает SpyXX. Но, похоже, данное сообщение отправляет сам AutoIt, когда работаем с элементами его же окна. Потому что, если отправить WM_COMMAND "снаружи" (из другого приложения), то никакие WM-сообщения элементу не поступают.

VadimKHL
что нужно вписать в последнее поле функции ControlCommand, которое CommandID
Ничего не нужно. В этом сообщении передаётся дескриптор элемента и этого достаточно.

хочу сделать так, что бы даже кнопку скрытую добавлять не нужно было
Режим OnEvent рассчитан на элементы GUI, поэтому всё равно его (элемент) нужно добавлять. Но можно добавить "пустой" элемент - Dummy
Код:
...
;$BTHIDE = GUICtrlCreateButton("TMR4", 260, 145, 100, 25)
$BTHIDE = GUICtrlCreateDummy()
GUICtrlSetOnEvent(-1, "_TMR4")
;GUICtrlSetState($BTHIDE, $GUI_HIDE)
...
      ;ControlCommand($WINGUI, "", "TMR4", "SendCommandID", "")
      GUICtrlSendToDummy($BTHIDE)
...
 
A

Alofa

Гость
VadimKHL сказал(а):
... Мда... Alofa, амбициозность неистребима...
Причем тут амбиции, это еще один вариант.
Вы спросили совета - вам его их дали. Самый главный из них мне кажется этот:
InnI сказал(а):
... в этом режиме функция AdlibRegister не может прервать функцию-обработчик события. А в режиме MessageLoop всё наоборот.
Вы же уперлись в этот OnEvent и пытаетесь подойти к решению проблемы с задней стороны.

P.s: К стати, там подправил.
 
Автор
V

VadimKHL

Новичок
Сообщения
155
Репутация
0
InnI сказал(а):
Alofa
Я тоже умею читать справку ;) и знаю, что делает WM_COMMAND. Меня смутило сообщение WM_GETTEXT, которое отлавливает SpyXX. Но, похоже, данное сообщение отправляет сам AutoIt, когда работаем с элементами его же окна. Потому что, если отправить WM_COMMAND "снаружи" (из другого приложения), то никакие WM-сообщения элементу не поступают.

VadimKHL
что нужно вписать в последнее поле функции ControlCommand, которое CommandID
Ничего не нужно. В этом сообщении передаётся дескриптор элемента и этого достаточно.

хочу сделать так, что бы даже кнопку скрытую добавлять не нужно было
Режим OnEvent рассчитан на элементы GUI, поэтому всё равно его (элемент) нужно добавлять. Но можно добавить "пустой" элемент - Dummy
Код:
...
;$BTHIDE = GUICtrlCreateButton("TMR4", 260, 145, 100, 25)
$BTHIDE = GUICtrlCreateDummy()
GUICtrlSetOnEvent(-1, "_TMR4")
;GUICtrlSetState($BTHIDE, $GUI_HIDE)
...
      ;ControlCommand($WINGUI, "", "TMR4", "SendCommandID", "")
      GUICtrlSendToDummy($BTHIDE)
...

Действительно работает. Интересно, почему такой вариант в начале темы не предложили :smile: Я бы две недели не рвал волосы на голове.
Но вопрос, если надо событий с разными временами, допустим одно событие каждые 10 секунд, другое 100 мс.
Как тогда различать "ПУСТЫШЕК"?

И очень интересно, мой найденный вариант с ControlCommand, это просто баг и случайность или имеет место жить?
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Автор
V

VadimKHL

Новичок
Сообщения
155
Репутация
0
InnI сказал(а):
VadimKHL
Как тогда различать "ПУСТЫШЕК"?
Как и любых других элементов - по идентификатору.

или имеет место жить?
Для кнопки допустимо, т.к. она не меняет своё состояние, в отличие, например, от CheckBox.

Большое спасибо за помощь. Без Ваших наводок я думаю не справился.
Но зато я своей тупостью/упортостью нашел новое использование ControlCommand, о котором не знали даже "ГУРУ".
(сам себя не похвалишь, ...)

У меня мозг заточен под 8 бит, ассемблер, для МК PIC, и все прерывания должны быть под моим контролем :smile:


Добавлено:
Сообщение автоматически объединено:

Alofa сказал(а):
VadimKHL сказал(а):
... Мда... Alofa, амбициозность неистребима...
Причем тут амбиции, это еще один вариант.
Вы спросили совета - вам его их дали. Самый главный из них мне кажется этот:
InnI сказал(а):
... в этом режиме функция AdlibRegister не может прервать функцию-обработчик события. А в режиме MessageLoop всё наоборот.
Вы же уперлись в этот OnEvent и пытаетесь подойти к решению проблемы с задней стороны.

P.s: К стати, там подправил.

Подправили. Не работает. Если нажать кнопку когда выключен OnEvent клик пользователя остается не обработанным.
Плохо подправили :smile:

Почему я уперся в Event?
Да потому что кнопок сейчас 15, а завтра захочу добавить еще 10. Потом еще 10.
Да и еще привык работать с прерываниями, только конечно на микроконтроллерах. Я мыслю логикой МК, и зная, а точнее делаю так, что бы он соблюдал свои протоколы передачи данных (время, задержки, контрольные суммы и т.д.), успевая делать остальные свои работы кроме переферии.
Вроде пока получается..., с Вашей помощью, форумчани.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
OffTopic:
VadimKHL
о котором не знали
Знали, только применяли "с другой стороны": получали, а не отправляли :smile:
Пустой последний параметр отправляет кнопке 0, что для неё значит $BN_CLICKED (меня нажали), о чём она и сообщала своему окну. Всё просто.
 
A

Alofa

Гость
OffTopic:
InnI
InnI сказал(а):
... Меня смутило сообщение WM_GETTEXT, которое отлавливает SpyXX.



P.s: Spy++ - прикольная штука оказалась, много чего видит. И чего это я ей раньше не пользовался? :smile:

VadimKHL
VadimKHL сказал(а):
... Не работает. Если нажать кнопку когда выключен OnEvent клик пользователя остается не обработанным.
Все становится в очередь для выполнения после завершения _TMR4(). В вашем скрипте точно так же.
 
Автор
V

VadimKHL

Новичок
Сообщения
155
Репутация
0
InnI сказал(а):
OffTopic:
VadimKHL
о котором не знали
Знали, только применяли "с другой стороны": получали, а не отправляли :smile:
Пустой последний параметр отправляет кнопке 0, что для неё значит $BN_CLICKED (меня нажали), о чём она и сообщала своему окну. Всё просто.

Спасибо. $BN_CLICKED


Добавлено:
Сообщение автоматически объединено:

У меня прям слов нет, я сечас напишу поэзию


Добавлено:
Сообщение автоматически объединено:

но поэзии нет нет


Добавлено:
Сообщение автоматически объединено:

Можно к новеньким как то нормально относиться?
 
A

Alofa

Гость
OffTopic:
VadimKHL
VadimKHL сказал(а):
... Можно к новеньким как то нормально относиться?
Я так понимаю это в мою сторону.
Прошу прощения если чем вас оскорбил или обидел, честно - не хотел. Тыкните меня в это пост носом.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Alofa
OffTopic:
Spy++ - прикольная штука оказалась, много чего видит
Вы правы по поводу сообщений. Это я, балбес, отслеживал сообщения кнопки, а не окна :-[
Теперь всё увидел :beer:
 
Верх