Что нового

Получить состояние чекбокса в списке с $LVS_EX_CHECKBOXES

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Доброго времени суток. Пробую получить состояние выбора списка с чекбоксами. Сразу скажу, что в приведенном примере куча незакоментированных попыток в моем Case $ListView1. Так же пробовал менять $ListView1 на некоторые другие переменные из скрипта, но без результата. К сожалению в справке так и не нашел способ как прочитать состояние чекбокса, если он вставлен в список с помощью сочетания стилей.
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <RGBHumanConstants.au3>
#include <WinAPI.au3>
#include <Array.au3>
#include <GUIConstants.au3>

#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>

Global $aChek[0]
$hGui = GUICreate("Окно с чекбоксами", 400, 400) ; Создаёт окно в центре экрана
Global $ListView1 = GUICtrlCreateListView("Выбрать все", 10, 10, 200, 200, BitOR($LVS_REPORT, $LVS_SHOWSELALWAYS), BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_FLATSB))
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 178)
Global $Box = _GUICtrlListView_SetExtendedListViewStyle($ListView1, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_CHECKBOXES))


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

While 1
    $Msg = GUIGetMsg()
   Switch $Msg
      Case $GUI_EVENT_CLOSE
         ExitLoop
      Case $ListView1
         ConsoleWrite('нажато *выбрать все* тоесть первая строка без чекбокса' & @CR)
         $iMenuState = GUICtrlRead($ListView1) ; возвращает состояние пункта меню
         $sMenuText = GUICtrlRead($ListView1, 1) ; возвращает текст пункта меню
         ConsoleWrite($iMenuState & '|' & $iMenuState & @CR)
         _ArrayDisplay($Box)
         _IsChecked($chek)
         $Select = ControlCommand($hGui, $aChek,"GetCurrentSelection", "")
         ConsoleWrite($Select & @CR)
   EndSwitch
WEnd

Func _AddLVItems()
    $aText = StringSplit(StringStripWS(StringReplace(FileRead(@ScriptDir & '\test.txt'), @CR, ' '), 4), ' ')

    For $n = 1 To $aText[0]

Global        $chek = _GUICtrlListView_AddItem($ListView1, $aText[$n])
        _ArrayAdd($aChek, $aText[$n])
    Next

EndFunc ;==>_AddLVItems

;проверка чекбокса обычного
 Func _IsChecked($idControlID)
    Return BitAND(GUICtrlRead($idControlID), $GUI_CHECKED) = $GUI_CHECKED
 EndFunc   ;==>_IsChecked
Так же не понятно, можно ли первой строке "Выбрать все" добавить свой чекбокс. Если можно, то как.
Сообщение автоматически объединено:

Что-то я не подумал заглянуть в описание функций с ListView, поэтому наверно и не могу получить нужные мне значения. Но слегка продвинулся. Сделал так:
Код:
While 1
    $Msg = GUIGetMsg()

   Switch $Msg
      Case $GUI_EVENT_CLOSE
         ExitLoop
      Case $ListView1
         ConsoleWrite($hWnd & @CR)
         ConsoleWrite('нажато *выбрать все* тоесть первая строка без чекбокса' & @CR)
         ConsoleWrite(_GUICtrlListView_GetItemChecked($ListView1, 1) & @CR)
   EndSwitch
WEnd

Так реагирует на самый первый пункт, и он естественно False, потому что нет чекбокса возле него. На остальные не реагирует.
 
Последнее редактирование:

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Ты ведь получаешь состояние определенного чекбокса. В цикле проверь весь лист.
 
Автор
D

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Ты ведь получаешь состояние определенного чекбокса. В цикле проверь весь лист.
С этим более менее разобрался. Получается два способа проверить состояние чекбокса. Сделал так:
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <RGBHumanConstants.au3>
#include <WinAPI.au3>
#include <Array.au3>
#include <GUIConstants.au3>

#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>

$hGui = GUICreate("Окно с чекбоксами", 400, 400) ; Создаёт окно в центре экрана

Global $ListView1 = GUICtrlCreateListView("Выбрать все|", 10, 10, 200, 300)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 178)
_GUICtrlListView_SetExtendedListViewStyle($ListView1, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_CHECKBOXES))


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

While 1
    $Msg = GUIGetMsg()

   Switch $Msg
      Case $GUI_EVENT_CLOSE
         ExitLoop
      Case $ListView1
         ConsoleWrite('нажато *выбрать все* тоесть шапка' & @CR)
; Первый способ получить состояние чекбоксов
      For $i = 0 To UBound($aText)-2  ; не пойму, почему тут -2, а не -1
         Local $Item = _GUICtrlListView_GetItemChecked($ListView1, $i)
         ConsoleWrite('$Item' & $i & ' = ' & $Item & @CR)
;       _GUICtrlListView_SetItem($ListView1, 'True', $i)   ; Так меняет не состояние чекбокса, а сам пункт на 'True'
      Next
; Второй способ получить состояние чекбоксов
      For $i = 0 To UBound($aText)-2 ; не пойму, почему тут -2, а не -1
;         _GUICtrlListView_SetItem($ListView1, '2', $i)  ; Так меняет не состояние чекбокса, а сам пункт на '2'
         Local $aItem = _GUICtrlListView_GetItem($ListView1, $i)
          ConsoleWrite('пункт ' &  $aItem[3] & ' установлен в ' & $aItem[2] & @CR)
;         _ArrayDisplay($aItem, '$aItem')
      Next

   EndSwitch
WEnd

Func _AddLVItems()
  Global  $aText = StringSplit(StringStripWS(StringReplace(FileRead(@ScriptDir & '\test.txt'), @CR, ' '), 4), ' ')

    For $n = 1 To $aText[0]

Global        $chek = _GUICtrlListView_AddItem($ListView1, $aText[$n]);, $iIm)

;        _ArrayAdd($aChek, $aText[$n])
;         _ArrayAdd($aChek, $chek)
    Next
;_ArrayDisplay($aText, '$aText') ; по идее показывает сколько строк (на 1 меньше) будет в списке, но по факту меньше на 2
;ConsoleWrite(UBound($aText) & @CR)
EndFunc ;==>_AddLVItems
Так же не понятно, можно ли первой строке "Выбрать все" добавить свой чекбокс
С этим стало понятно. Пункт "Выбрать всё" - всего навсего шапка колонки. Тут дополнительный чекбокс не нужен.
Остается не понятно:
1) Почему при переборе массива нужно уменьшать число индексов на 2, а не на 1, как обычно. Пометил эти вопросы в скрипте.
2) Что за массив $aItem получаю по каждому пункту списка. Понятно, что позиция Row 2 - это состояние чекбокса, Row 3 - текст пункта. А вот все остальные что значат? Пока методом втыка ничего не понял.
3) Можно ли будет организовать сортировку по нажатию на шапку/название колонки? И как?
4) И возможно нужно все же выделить в отдельную тему, хотя в шапке темы и озвучил, но не могу понять, как установить/снять все галочки в чекбоксах. В своем примере закоментил пару вариантов, которые пробовал и озвучил результаты.
Сообщение автоматически объединено:

И возможно нужно все же выделить в отдельную тему, хотя в шапке темы и озвучил, но не могу понять, как установить/снять все галочки в чекбоксах
Оказалось все проще. Жаль, что в русской справке не нашел. Нужно использовать
Код:
_GUICtrlListView_SetItemChecked($ListView1, "номер пункта")
 
Последнее редактирование:
Верх