Что нового

Отловить выделение строки в ListView в режиме OnEvent.

Shaman

Знающий
Сообщения
33
Репутация
5
Нужно отловить событие, когда пользователь выделил строку в ListView в режиме OnEvent.
GUICtrlSetOnEvent($LIST, "MY_FUNC) не отлавливает, не пойму почему.
Переписывать все в режим MessageLoop не хочется :(
 

XpycT

Скриптер
Сообщения
380
Репутация
132
Shaman
Вот пример скрипта
Код:
#Region Includes
#include <GuiListView.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#EndRegion Includes
#NoTrayIcon
Opt("GUIOnEventMode", 1)

#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 633, 454, 291, 115)
GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")

$ListView1 = GUICtrlCreateListView("Column", 85, 85, 250, 200)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 50)

For $i = 1 To 10
	GUICtrlCreateListViewItem("Item " & $i, $ListView1)
	GUICtrlSetOnEvent(-1, "ListView1Click")
Next
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
	Sleep(100)
WEnd

Func ListView1Click()
	Local $hListView1 = GUICtrlGetHandle($ListView1)

	Local $iSelItemIndex = _GUICtrlListView_GetSelectedIndices($hListView1)
	Local $sSelItemText = _GUICtrlListView_GetItemText($hListView1, $iSelItemIndex)

	MsgBox(0, "", "Selected Item Index : " & $iSelItemIndex & @CRLF & "Selected Item Text : " & $sSelItemText)
EndFunc

Func Form1Close()
	Exit
EndFunc
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
Хороший способ, но это не будет реагировать на нажатие стрелок. Я бы все же рекомендовал использовать WM_NOTIFY.

Код:
#Include <GUIConstantsEx.au3>
#Include <GUIListView.au3>
#Include <ListViewConstants.au3>
#Include <WindowsConstants.au3>

Opt('GUIOnEventMode', 1)

$Form1 = GUICreate('Form1', 633, 454, 291, 115)
GUISetOnEvent($GUI_EVENT_CLOSE, 'Form1Close')

$ListView1 = GUICtrlCreateListView('Column', 85, 85, 250, 200)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 50)
$hListView1 = GUICtrlGetHandle(-1)

For $i = 1 To 10
    GUICtrlCreateListViewItem('Item ' & $i, $ListView1)
Next

GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
GUISetState(@SW_SHOW)

While 1
    Sleep(100)
WEnd

Func Form1Close()
    Exit
EndFunc

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 $hListView1
			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
						ConsoleWrite('Select: Item' & ($Index + 1) & @CR)
					EndIf
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
 

XpycT

Скриптер
Сообщения
380
Репутация
132
Yashied
Правда этот способ будет работать если только создавать элементы в ListView через GUICtrlCreateListViewItem. Если элементы будут созданы через _GUICtrlListView_AddItem, то мой способ не работает (могу ошибаться).
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
Если честно, то я так же не рекомендую создавать (без острой необходимости) элементы через GUICtrlCreateListViewItem(). По умолчанию, если добавлять, например, несколько тысяч элементов с помощью GUICtrlCreateListViewItem(), то можно и не дождаться...

Кстати, параметр _GUICtrlListView_GetItemParam() для них уже занят и его использовать нельзя.
 

XpycT

Скриптер
Сообщения
380
Репутация
132
OffTopic:
Yashied [?]
не рекомендую создавать (без острой необходимости) элементы через GUICtrlCreateListViewItem()
Присоединяюсь к рекомендации (испытано на собсвенном опыте)
 
Верх