Автор Тема: Отловить выделение строки в ListView в режиме OnEvent.  (Прочитано 4937 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Shaman [?]

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

Русское сообщество AutoIt

Отловить выделение строки в ListView в режиме OnEvent.
« Отправлен: Август 16, 2010, 17:11:08 »

Оффлайн XpycT [?]

  • Скриптер
  • ****
  • Сообщений: 380
  • Репутация: 131
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Shaman
Вот пример скрипта
Код: AutoIt [Выделить]
#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 [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5349
  • Репутация: 2687
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Хороший способ, но это не будет реагировать на нажатие стрелок. Я бы все же рекомендовал использовать WM_NOTIFY.

Код: AutoIt [Выделить]
#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

« Последнее редактирование: Август 16, 2010, 20:58:24 от Yashied »


Думай, прежде чем говорить.

Оффлайн XpycT [?]

  • Скриптер
  • ****
  • Сообщений: 380
  • Репутация: 131
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Yashied
Правда этот способ будет работать если только создавать элементы в ListView через GUICtrlCreateListViewItem. Если элементы будут созданы через _GUICtrlListView_AddItem, то мой способ не работает (могу ошибаться).

Русское сообщество AutoIt

Re: Отловить выделение строки в ListView в режиме OnEvent.
« Ответ #3 Отправлен: Август 16, 2010, 20:22:22 »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5349
  • Репутация: 2687
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Если честно, то я так же не рекомендую создавать (без острой необходимости) элементы через GUICtrlCreateListViewItem(). По умолчанию, если добавлять, например, несколько тысяч элементов с помощью GUICtrlCreateListViewItem(), то можно и не дождаться...

Кстати, параметр _GUICtrlListView_GetItemParam() для них уже занят и его использовать нельзя.
« Последнее редактирование: Август 16, 2010, 20:48:40 от Yashied »

Оффлайн XpycT [?]

  • Скриптер
  • ****
  • Сообщений: 380
  • Репутация: 131
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
OffTopicYashied  [?]
Цитировать
не рекомендую создавать (без острой необходимости) элементы через GUICtrlCreateListViewItem()
Присоединяюсь к рекомендации (испытано на собсвенном опыте)


Русское сообщество AutoIt

Re: Отловить выделение строки в ListView в режиме OnEvent.
« Ответ #5 Отправлен: Август 16, 2010, 20:53:06 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
2 Ответов
2242 Просмотров
Последний ответ Апрель 02, 2011, 22:24:21
от tigerby
3 Ответов
2512 Просмотров
Последний ответ Сентябрь 18, 2011, 15:25:23
от CreatoR
9 Ответов
4847 Просмотров
Последний ответ Январь 05, 2012, 11:04:53
от BaRsupillamy
4 Ответов
2891 Просмотров
Последний ответ Февраль 04, 2012, 11:08:38
от StarEdik
4 Ответов
2772 Просмотров
Последний ответ Июнь 11, 2012, 19:07:56
от CreatoR
7 Ответов
4599 Просмотров
Последний ответ Сентябрь 23, 2012, 16:15:53
от AZJIO
1 Ответов
1235 Просмотров
Последний ответ Январь 17, 2014, 22:31:01
от InnI
3 Ответов
484 Просмотров
Последний ответ Сентябрь 12, 2016, 21:05:40
от Alofa
40 Ответов
2430 Просмотров
Последний ответ Январь 21, 2017, 17:08:30
от VadimKHL
10 Ответов
771 Просмотров
Последний ответ Январь 12, 2017, 14:53:19
от F9