Что нового

Установка/снятие флажков во всех чекбоксах на ListView?

AlexVong

Новичок
Сообщения
112
Репутация
1
Подскажите пожалуйста, как на форме создать чекбокс установка/снятие флажка в котором отражалось бы во всех чекбоксах на ListView? :scratch:

Код:
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <Array.au3>
#include <IE.au3>

Local $exStyles = BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_CHECKBOXES)

Global _
        $sLink = "http://base"

$sText = FileRead("1.txt") ;исходный код страницы

$aLink = StringRegExp($sText, "\/server\/documentview\/default\.aspx\?num=\d{3,}", 3) ;получаем список ссылок
$aLabel = StringRegExp($sText, '\s{2,}\d{1,}\.{1,}\d{1,}', 3)

;_ArrayDisplay($aLink) ; список ссылок
;_ArrayDisplay($aLabel) ; список значений полей

Dim $aInf[UBound($aLink)][3] ; новый массив для ф-ции   _GUICtrlListView_AddArray

For $i = 0 To UBound($aLink) - 1
    $aInf[$i][0] = $aLink[$i] ; копируем данные о ссылках в новый массив
Next

GUICreate("", 500, 400)

$hListView = GUICtrlCreateListView("", 2, 2, 394, 268)
_GUICtrlListView_SetExtendedListViewStyle($hListView, $exStyles) ; стиль ListView с чекбоксами

_GUICtrlListView_AddColumn($hListView, "Ссылки", 300) ; колонка "Ссылки"
_GUICtrlListView_AddArray($hListView, $aInf) ; всталяем массив данных

$hWorkOut = GUICtrlCreateButton("Показать выделенные", 340, 350, 140, 30)

GUISetState()

While 1
    Switch GUIGetMsg()
        Case -3
            Exit
        Case $hWorkOut
            $iCount = _GUICtrlListView_GetItemCount($hListView) ; общее количество элементов
            $oIE = _IECreate("") ; открываем браузер

            For $i = 0 To $iCount ; в цикле
                If _GUICtrlListView_GetItemChecked($hListView, $i) Then ; проверяем не отмечен ли элемент, если да, то
                    $aArr = _GUICtrlListView_GetItem($hListView, $i) ; берем информацию об элементе, где [3] ячейка - текст, т.е. ссылка

                    _Print($aArr[3]) ; функция для печати
                EndIf
            Next

            _IEQuit($oIE) ; закрываем браузер
    EndSwitch
WEnd

Func _Print($_sLink)
    _IENavigate($oIE, $sLink & $_sLink)  ; переходим по ссылке
    $oQuery = _IEGetObjById($oIE, "PrintFile")  ; получаем объект по ID
    _IEAction($oQuery, "click") ; кликаем на него
    _IELoadWait($oIE) ; ждем загрузки страницы в IE
    Sleep(100)
EndFunc
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Пример:

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

Global $iLV_ITEM_CHECKED		= False
Global $iLV_CHECKED_ITEM_INDEX 	= -1

$hGUI = GUICreate("ListView - Check All CheckBoxes Demo", 300, 250)

$iListView = GUICtrlCreateListView("Items", 20, 10, 260, 200, $LVS_NOCOLUMNHEADER)
_GUICtrlListView_SetExtendedListViewStyle($iListView, $LVS_EX_CHECKBOXES)

For $i = 1 To 5
	GUICtrlCreateListViewItem("Item " & $i, $iListView)
Next

_GUICtrlListView_SetColumnWidth($iListView, 0, -1)

$iCheclAll_CB = GUICtrlCreateCheckbox("Check all Items", 20, 220)

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

While 1
	$nMsg = GUIGetMsg()

	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $iCheclAll_CB
			$iState = 0
			
			If GUICtrlRead($iCheclAll_CB) = $GUI_CHECKED Then ;_AllItemsIsChecked($iListView, 1) Then
				$iState = 1
			EndIf
			
			_GUICtrlListView_SetItemChecked($iListView, -1, $iState)
	EndSwitch
	
	If $iLV_ITEM_CHECKED Then
		$iLV_ITEM_CHECKED = False
		
		If _GUICtrlListView_AllItemsChecked($iListView) Then
			GUICtrlSetState($iCheclAll_CB, $GUI_CHECKED)
		ElseIf _GUICtrlListView_AllItemsUnChecked($iListView) Then
			GUICtrlSetState($iCheclAll_CB, $GUI_UNCHECKED)
		EndIf
	EndIf
WEnd

Func _GUICtrlListView_AllItemsChecked($hLV, $iStartIndex = 0)
	For $i = $iStartIndex To _GUICtrlListView_GetItemCount($iListView)-1
		If _GUICtrlListView_GetItemChecked($hLV, $i) = 0 Then
			Return 0
		EndIf
	Next
	
	Return 1
EndFunc

Func _GUICtrlListView_AllItemsUnChecked($hLV, $iStartIndex = 0)
	For $i = $iStartIndex To _GUICtrlListView_GetItemCount($iListView)-1
		If _GUICtrlListView_GetItemChecked($hLV, $i) = 1 Then
			Return 0
		EndIf
	Next
	
	Return 1
EndFunc

Func WM_NOTIFY($hWndGUI, $MsgID, $wParam, $lParam)
	Local $stTagNMHDR = DllStructCreate($tagNMHDR, $lParam)
	If @error Then Return $GUI_RUNDEFMSG
	If $wParam <> $iListView Then Return $GUI_RUNDEFMSG
	
	Local $iCode = DllStructGetData($stTagNMHDR, "Code")
	
	Switch $iCode
		Case $NM_CLICK, $NM_DBLCLK
			Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
			Local $iIndex = DllStructGetData($tInfo, "Index")
			
			If $iIndex <> -1 Then
				$iLV_CHECKED_ITEM_INDEX = $iIndex
				
				Local $iX = DllStructGetData($tInfo, "X")
				Local $aIconRect = _GUICtrlListView_GetItemRect($iListView, $iIndex, 1)
				
				If $iX < $aIconRect[0] And $iX >= 5 And $iX < 21 Then
					$iLV_ITEM_CHECKED = True
				EndIf
			EndIf
	EndSwitch
	
	Return $GUI_RUNDEFMSG
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Мой вариант.
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GUIListView.au3>

Global $iCount = Random(50, 150, 1), $aItems[$iCount]

$hGUI = GUICreate('ListView - Check All CheckBoxes Demo', 300, 250)

$nListView = GUICtrlCreateListView('Items', 20, 10, 260, 200, $LVS_NOCOLUMNHEADER)
_GUICtrlListView_SetExtendedListViewStyle($nListView, $LVS_EX_CHECKBOXES)
$hListView = GUICtrlGetHandle($nListView)
For $i = 0 To $iCount - 1
	$aItems[$i] = GUICtrlCreateListViewItem('Item ' & $i + 1, $nListView)
	GUICtrlSetBkColor(-1, 0xDCDCDC)
	GUICtrlSetColor(-1, 0x0000FF)
	_GUICtrlListView_SetItemGroupID($nListView, $i, 0)
Next
$iCount = 0
_GUICtrlListView_SetColumnWidth($nListView, 0, -1)

$nCheckAll_CB = GUICtrlCreateCheckbox('Check all Items', 20, 220, 100, 18)
GUICtrlCreateLabel('Checked:', 130, 222, 50, 18)
$nCountCheck = GUICtrlCreateLabel($iCount, 185, 222, 15, 18)

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

While 1
	$nMsg = GUIGetMsg()

	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $nCheckAll_CB
			_GUICtrlListView_SetItemChecked($nListView, -1, BitAND(GUICtrlRead($nCheckAll_CB), $GUI_CHECKED))
	EndSwitch
WEnd


Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
	Local $hWndFrom, $iCode, $tNMHDR, $tInfo, $i_Index, $i_NewState

	$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
	$hWndFrom = HWnd(DllStructGetData($tNMHDR, 'hWndFrom'))
	$iCode = DllStructGetData($tNMHDR, 'Code')
	Switch $hWnd
		Case $hGUI
			Switch $hWndFrom
				Case $hListView
					Switch $iCode
						Case $LVN_ITEMCHANGED
							$tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
							$i_Index = DllStructGetData($tInfo, 'Index')
							If $i_Index < 0 Then Return $GUI_RUNDEFMSG
							$i_NewState = DllStructGetData($tInfo, 'NewState')
							Switch $i_NewState
								Case $LVM_FIRST
									GUICtrlSetBkColor($aItems[$i_Index], 0xDCDCDC)
									GUICtrlSetColor($aItems[$i_Index], 0x0000FF)
									$iCount -= 1
								Case $LVM_FIRST * 2
									GUICtrlSetBkColor($aItems[$i_Index], 0xFAFAD2)
									GUICtrlSetColor($aItems[$i_Index], 0xFF0000)
									$iCount += 1
							EndSwitch
							GUICtrlSetData($nCountCheck, $iCount)
					EndSwitch
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
 
Автор
A

AlexVong

Новичок
Сообщения
112
Репутация
1
Спасибо!!! Оба варианта подходят...
 
Верх