Автор Тема: [Элементы GUI] Как отловить событие на любое действие с ListView?  (Прочитано 785 раз)

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

Эта тема содержит сообщение, помеченное как лучший ответ. Кликните здесь для перехода к этому сообщению.

Оффлайн F9 [?]

  • Новичок
  • *
  • Сообщений: 67
  • Репутация: 0
    • Награды
  • Версия AutoIt: 3.3.14.0
Добрый день!

Возможно туплю, не нагуглил ответа на мой вопрос:
Мне нужно отловить любое действие с элементом ListView, например перемещение по нему, клик мышкой и т.п.

Для примера, простая форма, в которой хочу отлавливать онлайн перемещения по списку.
метод  _GUICtrlListView_GetItemTextString не работает. Нет даже пустого MsgBox, ощущение что Case не срабатывает...  :blink: :stars:
 Не пойму в чем подвох ?

Код: AutoIt [Выделить]
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
 #include <GuiListView.au3>
#include <ComboConstants.au3>



$Form1 = GUICreate('Form1', 500, 500, 192, 114)
$supplier_method = GUICtrlCreateListView("ID|Поставщик|Метод",50,90,255,257);,-1,$LVS_EX_FULLROWSELECT+$LVS_EX_GRIDLINES)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 20)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 130)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 2, 80)
for $sl = 1 to 10
        GUICtrlCreateListViewItem($sl & "|Supplier_"&$sl&"|MAIL",$supplier_method)
Next

Local $RadioMethod_Mail = GUICtrlCreateRadio("ПОЧТА", 350, 110, 120, 20)
Local $RadioMethod_FTP = GUICtrlCreateRadio("FTP", 350, 140, 120, 20)

$idComboBox = GUICtrlCreateCombo("",350,200,120,20,$CBS_DROPDOWNLIST)
GUICtrlSetData($idComboBox, "Aggrrrrrrrhhh|Item 2|Item 3", "Item 2")


GUISetState(@SW_SHOW)


While 1
    $msg = GUIGetMsg(1)
    Select

        Case $msg[0] = $GUI_EVENT_CLOSE
            Exit
        Case $msg[0] = $supplier_method
            MsgBox(0, '$supplier_method',"!!1111"); _GUICtrlListView_GetItemTextString ($supplier_method))
        Case $msg[0] = $RadioMethod_Mail And BitAND(GUICtrlRead($RadioMethod_Mail), $GUI_CHECKED) = $GUI_CHECKED
             MsgBox($MB_SYSTEMMODAL, 'Info:', 'MAIL')
        Case $msg[0] = $RadioMethod_FTP And BitAND(GUICtrlRead($RadioMethod_FTP), $GUI_CHECKED) = $GUI_CHECKED
             MsgBox($MB_SYSTEMMODAL, 'Info:', 'FTP')
        Case $msg[0] = $idComboBox
            $sComboRead = GUICtrlRead($idComboBox)
            MsgBox($MB_SYSTEMMODAL, "", $sComboRead, 0, $Form1)


    EndSelect
WEnd

 


Все остальные кейсы на элементы работают, ListView не работает...  :think:
« Последнее редактирование: Январь 12, 2017, 11:18:34 от F9 »

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


Онлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3109
  • Репутация: 822
    • Награды
  • Версия AutoIt: 3.3.14.0
F9
Цитировать
отловить любое действие с элементом ListView
Посмотрите пример в справке к функции
Код: AutoIt [Выделить]
За перемещение мыши над списком отвечает событие $LVN_HOTTRACK.

Оффлайн F9 [?]

  • Новичок
  • *
  • Сообщений: 67

  • Автор темы
  • Репутация: 0
    • Награды
  • Версия AutoIt: 3.3.14.0
F9
Цитировать
отловить любое действие с элементом ListView
Посмотрите пример в справке к функции
Код: AutoIt [Выделить]
За перемещение мыши над списком отвечает событие $LVN_HOTTRACK.

А перемещение по нему курсором или щелчками мышки или любым доступным способом, очевидно:

Код: AutoIt [Выделить]
Case $LVN_ITEMACTIVATE ; Sent by a list-view control when the user activates an item


То есть предлагаете использовать
Код: AutoIt [Выделить]
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
 


А как быть, если у меня уже имеется функция, предназнаенная для отлавливания двойного клика до другому ListView ???
Их можно совмещать ?

Код: AutoIt [Выделить]
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    $id = GUICtrlRead($Tab1) + 1
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView = Eval("ListView" &$id)
    If Not IsHWnd(Eval("ListView" &$id)) Then $hWndListView = GUICtrlGetHandle(Eval("ListView" &$id))

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")

    Switch $hWndFrom
        Case $hWndListView
            Switch $iCode
                Case $NM_CLICK
                    $iOne_Click_Event = True
                Case $NM_DBLCLK
                    $iDouble_Click_Event = True
            EndSwitch
    EndSwitch

    Return $GUI_RUNDEFMSG
EndFunc ;~ ******************************************
 


Онлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3109
  • Репутация: 822
    • Награды
  • Версия AutoIt: 3.3.14.0
F9
Цитировать
Их можно совмещать ?
Вот вы в своём коде используете
Код: AutoIt [Выделить]
Switch $hWndFrom

А какие данные перебирает этот Switch? Что находится в $hWndFrom?

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

Re: [Элементы GUI] Как отловить событие на любое действие с ListView?
« Ответ #3 Отправлен: Январь 12, 2017, 12:08:44 »

Оффлайн F9 [?]

  • Новичок
  • *
  • Сообщений: 67

  • Автор темы
  • Репутация: 0
    • Награды
  • Версия AutoIt: 3.3.14.0
F9
Цитировать
Их можно совмещать ?
Вот вы в своём коде используете
Код: AutoIt [Выделить]
Switch $hWndFrom

А какие данные перебирает этот Switch? Что находится в $hWndFrom?

$hWndFrom представлен только в Func WM_NOTIFY
Код выше. Взят из хелпа кстати



Добавлено: Январь 12, 2017, 12:36:38
Так... кое что выяснилось от исходной тестовой формы:

Код: AutoIt [Выделить]
Case $msg[0] = $supplier_method

получает управление при нажатии на заголовки ListView... А как заставить кейс работать при нажатии на содердимое ListView ?
« Последнее редактирование: Январь 12, 2017, 12:36:38 от F9, Причина: Объединение сообщений »

Онлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3109
  • Репутация: 822
    • Награды
  • Версия AutoIt: 3.3.14.0
F9
Цитировать
$hWndFrom представлен только в Func WM_NOTIFY
И что находится в этой переменной?
Код: AutoIt [Выделить]
ConsoleWrite("$hWndFrom = " & $hWndFrom & @CRLF)
ConsoleWrite("$hWndListView = " & $hWndListView & @CRLF)

http://www.vsokovikov.narod.ru/New_MSDN_API/Controls/msg_wm_notify.htm

Оффлайн F9 [?]

  • Новичок
  • *
  • Сообщений: 67

  • Автор темы
  • Репутация: 0
    • Награды
  • Версия AutoIt: 3.3.14.0
$hWndFrom = 0x004F0ADE
$hWndListView = 0x004F0ADE

Онлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3109
  • Репутация: 822
    • Награды
  • Версия AutoIt: 3.3.14.0
F9
Вы меня не поняли :)
Мне не интересно значение переменной. Я спрашиваю - вы знаете, что находится в $hWndFrom? Что означает её значение? Что вообще делает функция WM_NOTIFY вы понимаете?

Цитировать
при нажатии на содержимое ListView
(нажмите для показа/скрытия)

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

Re: [Элементы GUI] Как отловить событие на любое действие с ListView?
« Ответ #7 Отправлен: Январь 12, 2017, 12:59:02 »

Оффлайн F9 [?]

  • Новичок
  • *
  • Сообщений: 67

  • Автор темы
  • Репутация: 0
    • Награды
  • Версия AutoIt: 3.3.14.0
F9
Вы меня не поняли :)
Я спрашиваю - вы знаете, что находится в $hWndFrom? Что означает её значение? Что вообще делает функция WM_NOTIFY вы понимаете?
смысл работы WM_NOTIFY в общих чертах понятен.
Спасибо за подсказку...


А вот как бы реализовать
Код: AutoIt [Выделить]
         Case $LVitems[0] To $LVitems[9]

через
Case $msg[0] = ....
??
использую $msg[0] и  $msg[1] для отслеживания двух разных $GUI_EVENT_CLOSE для основного и дочернего окна


Кстати решение с
Код: AutoIt [Выделить]
Case $LVitems[0] To $LVitems[9]

работает только для щелчка мышки в определенную позицию ListView, перемещение курсором клавиатуры этот кейс не отлавливает ((
« Последнее редактирование: Январь 12, 2017, 13:41:37 от F9 »

Помечен как лучший ответ пользователем F9 Отправлен Январь 12, 2017, 14:52:44

Онлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3109
  • Репутация: 822
    • Награды
  • Версия AutoIt: 3.3.14.0
F9
Цитировать
в общих чертах
(нажмите для показа/скрытия)

Оффлайн F9 [?]

  • Новичок
  • *
  • Сообщений: 67

  • Автор темы
  • Репутация: 0
    • Награды
  • Версия AutoIt: 3.3.14.0
F9
Цитировать
в общих чертах
(нажмите для показа/скрытия)

Спасибо!
Дальше идею думаю смогу сам развить

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

Re: [Элементы GUI] Как отловить событие на любое действие с ListView?
« Ответ #10 Отправлен: Январь 12, 2017, 14:53:19 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
4 Ответов
5265 Просмотров
Последний ответ Июль 07, 2010, 14:18:34
от XpycT
4 Ответов
3642 Просмотров
Последний ответ Февраль 18, 2011, 19:19:18
от r35p3ct
2 Ответов
2242 Просмотров
Последний ответ Апрель 02, 2011, 22:24:21
от tigerby
3 Ответов
2514 Просмотров
Последний ответ Сентябрь 18, 2011, 15:25:23
от CreatoR
7 Ответов
3556 Просмотров
Последний ответ Март 20, 2012, 11:05:30
от erlik
10 Ответов
2952 Просмотров
Последний ответ Март 26, 2012, 06:20:00
от AZJIO
5 Ответов
2637 Просмотров
Последний ответ Июнь 14, 2013, 14:18:13
от Garrett
0 Ответов
1174 Просмотров
Последний ответ Июнь 14, 2013, 12:52:35
от madmasles
5 Ответов
1027 Просмотров
Последний ответ Январь 10, 2015, 23:15:28
от madmasles
4 Ответов
495 Просмотров
Последний ответ Август 23, 2016, 17:55:11
от Vovsla