Что нового

Невозможно послать несколько значений в одно и тоже Dummy

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
Вот простой пример:

Код:
GUICreate('MyGUI')
$Dummy = GUICtrlCreateDummy()
GUISetState()

GUICtrlSendToDummy($Dummy, 1)
GUICtrlSendToDummy($Dummy, 2)
GUICtrlSendToDummy($Dummy, 3)

While 1
	Switch GUIGetMsg()
		Case -3
			Exit
		Case $Dummy
			ConsoleWrite(GUICtrlRead($Dummy) & @CR)
	EndSwitch
WEnd


Казалось бы, в консоли мы должны увидеть следующее:

Код:
1
2
3
А нет, на деле получается так:

Код:
3
3
3
По ходу дела, разработчики реализовали возможность посылки значений в Dummy, так сказать, "на сдачу", совершенно не беспокоясь об очереди сообщений. Сообщения то приходить приходят, а вот посылаемые значения затирают друг друга (возможно все идет через один буфер). Я конечно не уверен, что это бага, но это несомненно нужно учитывать при написании кода, активно использующего Dummy. Вот возможный вариант решения этой "проблемы" (создание собственного буфера):

Код:
Global $Buff = ''

GUICreate('MyGUI')
$Dummy = GUICtrlCreateDummy()
GUISetState()

_SendToDummy($Dummy, 1)
_SendToDummy($Dummy, 2)
_SendToDummy($Dummy, 3)

While 1
	Switch GUIGetMsg()
		Case -3
			Exit
		Case $Dummy
			ConsoleWrite(_ReadFromDummy($Dummy) & @CR)
	EndSwitch
WEnd

Func _ReadFromDummy($iDummy)

	Local $Data = $Buff

	$Buff = StringTrimLeft($Buff, StringInStr($Buff, '|'))
	Return Number(StringLeft($Data, StringInStr($Data, '|') - 1))
EndFunc   ;==>_ReadFromDummy

Func _SendToDummy($iDummy, $iValue)
	$Buff &= $iValue & '|'
	GUICtrlSendToDummy($iDummy)
EndFunc   ;==>_SendToDummy
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403
Ну это явно не баг. Если взять в пример обычный Input, то он также помещает в себя последние данные, т.е GUICtrlSendToDummy($Dummy, 1) эквивалентно GUICtrlSetData($Input_Dummy, 3). Правда с одним отличием - в первом случае срабатывает событие элемента Dummy.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403
Yashied [?]
возможный вариант решения этой "проблемы"
Мне ещё интересно посмотреть на возможный вариант надобности такого обхода.
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
CreatoR сказал(а):
Мне ещё интересно посмотреть на возможный вариант надобности такого обхода.
:blink:

Да сколько угодно, например:

Код:
$hForm = GUICreate('MyGUI')
$Dummy = GUICtrlCreateDummy()
GUISetState(@SW_SHOWMINIMIZED)

HotKeySet('{F5}', '_HotKey')

While 1
	Switch GUIGetMsg()
		Case -3
			Exit
		Case $Dummy
			MsgBox(64, 'Info', 'Active window: ' & WinGetTitle(Ptr(GUICtrlRead($Dummy))), 1, $hForm)
	EndSwitch
WEnd

Func _HotKey()
	GUICtrlSendToDummy($Dummy, WinGetHandle('[ACTIVE]'))
EndFunc   ;==>_HotKey


Или, например, если ты обрабатываешь WM_NOTIFY для ListView. При двойном клике на элементе посылаешь номер этого элемента в Dummy. Если быстро щелкать и не успевать обрабатывать сообщения от Dummy (особенно актуально для Loop режима), то возникнет очередь из Dummy с потерей передаваемых значений.
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
CreatoR сказал(а):
Ну это явно не баг. Если взять в пример обычный Input...
Input, это стандартный элемент Windows, а Dummy, это фишка AutoIt (он даже хендла не имеет). И придуман был, как я полагаю, для отложенного выполнения кода. Первое, что приходит на ум - функции обработки WM-сообщений. Да и раз уж Dummy формирует очередь, то логично сохранять передаваемые значения. Кстати, можно даже строки передавать, но при этом могут возникнуть большие глюки. А об этом нигде ничего не сказано...
 
Верх