Что нового

Обработка событий с COMBO-элемента

Core2Duo76

Новичок
Сообщения
58
Репутация
1
Столкнулся с проблемой обработки событий из выпадающего списка (комбо). Суть в чем - использую комбо как поисковую строку, популярные запросы хранятся и передаются в элемент, в сам элемент можно ввести текст с клавиатуры. Если выбирать с клавиатуры, то после выбора в режиме OnEvent будет отрабатывать связанная процедура поиска и отрисовка его рeзультатов, но вот если ввести руками и нажать enter, то событие не наступает. Получается какая-то корявая строка поиска. Как заставить комбо по энтеру создавать событие!? Работаю в OnEvent
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Код:
#include <GUIConstantsEx.au3>
#include <WinAPI.au3>

$hGUI = GUICreate('Test Script', 300, 200)

$iCombo = GUICtrlCreateCombo('', 20, 40, 100, 50)
$iDummy_Combo = GUICtrlCreateDummy()

Global $aAccelKeys[1][2] = [['{ENTER}', $iDummy_Combo]]
GUISetAccelerators($aAccelKeys)

GUISetState(@SW_SHOW, $hGUI)

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $iCombo, $iDummy_Combo
			If _WinAPI_GetParent(ControlGetHandle($hGUI, '', ControlGetFocus($hGUI))) = GUICtrlGetHandle($iCombo) Then
				MsgBox(64, @ScriptName, 'OK', 0, $hGUI)
			EndIf
	EndSwitch
WEnd
 
A

Alofa

Гость
Еще вариант:
Код:
#include <GuiComboBoxEx.au3>
#include <GUIConstantsEx.au3>

Local $hGUI, $hButton, $hCombo, $hComboEdit
Opt('GUIOnEventMode', 1)
HotKeySet('{ENTER}', '_Enterlicked')

$hGUI = GUICreate('Раскрывающийся список', 220, 80)
$hCombo = _GUICtrlComboBoxEx_Create($hGUI, '', 10, 10, 200, 150)
$hButton = GUICtrlCreateButton('Ok', 50, 40, 120)
GUISetOnEvent($GUI_EVENT_CLOSE, '_CLOSEClicked')
GUICtrlSetOnEvent($hButton, '_Enterlicked')

GUISetState() ; показывает созданное окно

$hComboEdit = _GUICtrlComboBoxEx_GetEditControl($hCombo)

While Sleep(100)
WEnd

Func _Enterlicked()
	If WinActive($hGUI) Then
		If ControlGetHandle($hGUI, '', ControlGetFocus($hGUI)) = $hComboEdit Then
			MsgBox(0, '', 'Текст из $hCombo: ' & @LF & ControlGetText($hGUI, '', $hCombo))
			Return
		Else
			MsgBox(64, 'Информация:', 'Вы нажали кнопку "Ok".')
			Return
		EndIf
	EndIf
	HotKeySet('{ENTER}')
	Send('{ENTER}')
	HotKeySet('{ENTER}', '_Enterlicked')
EndFunc   ;==>_Enterlicked

Func _CLOSEClicked()
	Exit
EndFunc   ;==>_CLOSEClicked
 
Автор
C

Core2Duo76

Новичок
Сообщения
58
Репутация
1
а завязка enter с функцией не будет мешать остальному управлению элементами во время работы с окном? другие поля ввода же по ентеру перестанут принимать сообщения.

Попробовал - да, песенку в плеере не выбрать, выполняться функция начинает. Я хотел сделать просто кнопку "поиск", потом подумал, что по ентер будет удобнее. И вот я пишу сюда :smile:

Creator, Ваш способ, я так понимаю, тоже будет перехватывать ентер из тех полей, из которых не надо? у меня сейчас именно так и сделано, через аккселерации, но без пустышки. Есть еще функция на кнопке delete, так она не дает стирать текст из полей ввода :smile: замкнутый круг?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Core2Duo76 [?]
Ваш способ, я так понимаю, тоже будет перехватывать ентер из тех полей, из которых не надо?
А проверить не, никак?
Не будет.
 
Автор
C

Core2Duo76

Новичок
Сообщения
58
Репутация
1
Alofa , Это гениально!!! Переназначать горячку при нажатии на горячку!!! Хоть и выглядит как костыль, но я попробую оба варианта как доберусь до кода.


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

CreatoR, а если у меня 4 вкладки в GUI, а Dummy-то один что ли будет? Их ведь надо столько же, сколько combo, а у меня на каждой вкладке свой combo, иначе мои цели не реализовать.
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
CreatoR
Button не нажать, в Edit новую строку не сделать... всё в Dummy уходит.

Core2Duo76
Как вариант
Код:
...
While 1 ; главный цикл
  If _IsPressed("0D") And ControlGetFocus($hGUI) = "Edit1" Then
    ConsoleWrite(".")
    While _IsPressed("0D")
    WEnd
  EndIf
  Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
      Exit
...
 
Автор
C

Core2Duo76

Новичок
Сообщения
58
Репутация
1
Так у меня без massageLoop реализовано. Была процедура отловки нажатия ентер - процедура определяет активную вкладку - вызывает определенную для вкладки процедуру.
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
Core2Duo76
Так у меня без massageLoop реализовано
Но главный цикл у вас всё равно есть. Что там сейчас? Вечный Sleep? Вот и добавьте туда проверку нажатия клавиши.


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

Как обработать нажатие Enter в edit box'е?
[box]Начнем с того, что для обработки нажатия Enter необходимо, чтобы (в общем случае) окно редактирования ожидало этого нажатия (т.е. имело стиль ES_MULTILINE). В противном случае система выполнит трансляцию этого нажатия в нажатие кнопки родительского окна, имеющей в текущий момент стиль BS_DEFAULTPUSHBUTTON.[/box] Реализация идеи со скрытой кнопкой по умолчанию
Код:
Opt("GUIOnEventMode", 1)

$GUI = GUICreate("test")
GUISetOnEvent(-3, "Quit")
GUISetState()

GUICtrlCreateCombo("", 10, 10)
GUICtrlCreateCombo("", 10, 40)
$defBtn = GUICtrlCreateButton("", 0, 0, -1, -1, 0x0001) ; $BS_DEFPUSHBUTTON
GUICtrlSetState(-1, 32) ; $GUI_HIDE
GUICtrlSetOnEvent(-1, "OnEnter")
GUICtrlCreateEdit("edit", 10, 70, 100, 100)

While Sleep(1000)
WEnd

Func OnEnter()
  ConsoleWrite(ControlGetFocus($GUI) & @CRLF)
EndFunc

Func Quit()
  Exit
EndFunc
 
A

Alofa

Гость
Core2Duo76 сказал(а):
... Хоть и выглядит как костыль
Так и есть. Все это не правильно.

Удалил скрипт.
Смотри ниже Ответ #11

Спасибо CreatoR - за наводку. И спасибо InnI - вправил мне мозги.
Как же все порой оказывается элементарно.
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
Alofa
оказывается элементарно
Это вам только так кажется. Проблема вашей реализации такая же, как у CreatoR'а. Вам придётся в обработчике кнопки реализовывать дерево элементов, способных реагировать на ENTER. Для примера, добавьте GUICtrlCreateEdit() и попробуйте реализовать перевод строки.
 
Верх