Что нового

[Элементы GUI] Combobox динамически получать текст выделенного (но еще не выбранного) элемента

Dm666

Осваивающий
Сообщения
221
Репутация
48
Господа, приветствую. Помогите разобраться.

Хочется динамически получать текст (индекс, хоть что-нибудь) выделенного (но еще не выбранного) элемента Combobox. Например:
Код:
#include <GUIConstantsEx.au3>

GUICreate("", 400, 296)
$idCombo = GUICtrlCreateCombo("", 2, 2, 396, 150)
GUICtrlSetData(-1, "1|2|3|4")
$lbl = GUICtrlCreateLabel("", 20, 200, 50, 50)
GUISetState()

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Чтобы, скажем, когда юзер раскрывает список и задумчиво водит курсором по пунктам бокса, текст выделенного в данный момент пункта отображался бы в $lbl.
Подозреваю что понадобится использование заклинаний черной магии типа DllStruct* которых я осилить так и не смог, сколько ни пытался :scratch:

Я бы воспользовался
Код:
_GUICtrlComboBoxEx_Create
, пример из справки для нее такой фокус проделывает. Но у меня довольно объемный скрипт со вкладками и, как мне кажется, _GUICtrlComboBoxEx_Create с ними не дружит, ибо требует указания $hWnd. Если указать там родительское окно - Combobox создается поверх всего наплевав на вкладки, что логично. Если указывать в hWnd созданный GUICtrlCreateTabItem - то бокс не создается вообще, что не понятно.

Поэтому хотелось бы обойтись штатными силами
Код:
GUICtrlCreateCombo
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Что-бы
Хочется динамически получать текст
это нужно включать режим "OnEvent" и ловить события . Например Ваш вариант:
Код:
#include <GUIConstantsEx.au3>
#include <GuiComboBox.au3>

Opt("GUIOnEventMode", 1)

GUICreate("", 400, 296)
$idCombo = GUICtrlCreateCombo("", 2, 2, 396, 150)
GUICtrlSetOnEvent(-1, "Events")
GUICtrlSetData(-1, "1|2|3|4")
$lbl = GUICtrlCreateLabel("", 20, 200, 50, 50)
GUISetOnEvent($GUI_EVENT_CLOSE, "Events")
GUISetOnEvent($GUI_EVENT_MOUSEMOVE, "Events")

GUISetState()


Func Events()

	Select
		Case @GUI_CtrlId = $GUI_EVENT_CLOSE
			Exit

		Case @GUI_CtrlId = $idCombo
			MsgBox(0, '', 'Выбран пункт ' & GUICtrlRead($idCombo))
		Case @GUI_CtrlId = $GUI_EVENT_MOUSEMOVE
			$iPos = _GUICtrlComboBox_GetCurSel($idCombo)
			If $iPos >= 0 Then
				GUICtrlSetData($lbl, GUICtrlRead($idCombo))
			Else
				GUICtrlSetData($lbl, '')
			EndIf


	EndSelect
EndFunc   ;==>Events

While 1
	Sleep(10)
WEnd

Или без режима "OnEvent" - постоянно проверять выделен ли пункт :
Код:
#include <GUIConstantsEx.au3>
#include <GuiComboBox.au3>


GUICreate("", 400, 296)
$idCombo = GUICtrlCreateCombo("", 2, 2, 396, 150)
GUICtrlSetData(-1, "1|2|3|4")
$lbl = GUICtrlCreateLabel("", 20, 200, 50, 50)
GUISetState()

Do

			$iPos = _GUICtrlComboBox_GetCurSel($idCombo)
			If $iPos >= 0 Then
				GUICtrlSetData($lbl, GUICtrlRead($idCombo))
			Else
				GUICtrlSetData($lbl, '')
			EndIf

Until GUIGetMsg() = $GUI_EVENT_CLOSE
 
Автор
Dm666

Dm666

Осваивающий
Сообщения
221
Репутация
48
Интересное решение. Может быть не самое экономичное в плане нагрузки на процессор, но таки работает! Спасибо!
 
Верх