Evento al tildar checkbox

Pregunta Sin Miedo no te cortes cualquier cosa para empezar - Autoit se comienza facilmente.Para Ordenes o Comandos sueltos. Ver nota como preguntar.
Responder
avechuche
Hacker del Foro
Mensajes: 188
Registrado: 13 Ago 2009, 09:53

Evento al tildar checkbox

Mensaje por avechuche »

Código: Seleccionar todo

Func _WM_NOTIFY($hWndGUI, $MsgID, $iwParam, $ilParam)

	$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
	$idFrom = DllStructGetData($tNMHDR, "IDFrom")
	$iCode = DllStructGetData($tNMHDR, "Code")

	Switch $iCode
		Case $NM_CLICK
			$tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
			Local $iIndex = DllStructGetData($tInfo, "Index")
			Switch $idFrom
				Case $hListViewBuscar
					If _GUICtrlListView_GetItemChecked($hListViewBuscar, $iIndex) Then MsgBox(0, "", "")
			EndSwitch
	EndSwitch

	Return $GUI_RUNDEFMSG

EndFunc   ;==>_WM_NOTIFY
Bueno gente vengo con un problema, quisiera que cada vez que tildo el checkbox de un item en un listview, necesito que se ejecute cierto código, esto es lo que hice, pero no lo logro, funciona, pero no bien.
Lo que veo que hace es que cuando hago click en el checkbox para tildarlo, el evento _GUICtrlListView_GetItemChecked lo ejecuta antes de que el checkbox se habilite, no se como explicarlo.
Si hago click en un checkbox (que no esta tildado) para activarlo, el evento no lo hace. Ahora si vuelvo a hacer clic en un checkbox para desactivarlo, el evento si lo ejecuta porque cuando comprueba _GUICtrlListView_GetItemChecked es verdad, el item estaba activado.


Si usan

Código: Seleccionar todo

If Not _GUICtrlListView_GetItemChecked($hListViewBuscar, $iIndex) Then MsgBox(0, "", "")
Despues de activar un checkbox, veran como el msgbox aparece antes de que el "tilde" del checkbox aparezca.


EDITO

Bueno ya encontre la forma, es con $LVN_ITEMCHANGED :). Esto por ahora ayuda, pero captura todo los cambios del item, si lo focuseo, si se le va el foco, etc etc, sirve, pero lo que me gustaria es que se active solo si checkeo el item, no si lo seleciono, focuseo, etc,etc, es un cargo de memoria de gusto.

Aprovechando la pregunta, lo que quiero hacer es que si hay algun item activo, se active el boton "Eliminar", si no hay ninguno que se bloquee. Eso es facil, el problema viene en el momento de decirle dentro de "_WM_NOTIFY" que tiene que bloquear X boton, tengo que declarar como Global la variable del boton para desactivarlo dentro de _WM_NOTIFY o puedo devolver un valor para que al funcion del GUI, bloquee el boton?
Avatar de Usuario
Dany
Profesional del Autoit
Mensajes: 651
Registrado: 28 Mar 2012, 22:49

Re: Evento al tildar checkbox

Mensaje por Dany »

Te refieres a algo asi?

Código: Seleccionar todo

#include <GUIConstantsEx.au3>
#include <GUIListView.au3>
#include <WindowsConstants.au3>

Opt('MustDeclareVars', 1)

Global $State, $Button, $ListView, $hListView

GUICreate('MyGUI', 280, 391)
$ListView = GUICtrlCreateListView('', 10, 10, 260, 344, BitOR($LVS_DEFAULT, $LVS_NOCOLUMNHEADER), $WS_EX_CLIENTEDGE)
$hListView = GUICtrlGetHandle(-1)
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_CHECKBOXES, $LVS_EX_DOUBLEBUFFER, $LVS_EX_INFOTIP))
_GUICtrlListView_InsertColumn($hListView, 0, '', 234)
$Button = GUICtrlCreateButton('OK', 105, 361, 70, 23)
GUICtrlSetState(-1, $GUI_DISABLE)
For $i = 1 To 5
	_GUICtrlListView_AddItem($hListView, 'Item' & $i)
Next


GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')

GUISetState()

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)

	Local $tNMITEMACTIVATE = DllStructCreate($tagNMITEMACTIVATE, $lParam)
	Local $hWndFrom = DllStructGetData($tNMITEMACTIVATE, 'hWndFrom')
	Local $Index = DllStructGetData($tNMITEMACTIVATE, 'Index')
	Local $Code = DllStructGetData($tNMITEMACTIVATE, 'Code')
	Local Static $Count = 0
	Local Static $bState=False
	Switch $hWndFrom
		Case $hListView
			Switch $Code
				Case $LVN_ITEMCHANGING
					$State = _GUICtrlListView_GetItemChecked($hListView, $Index)
				Case $LVN_ITEMCHANGED
					If $State <> _GUICtrlListView_GetItemChecked($hListView, $Index) Then
						If Not $State Then
							$Count += 1
						Else
							$Count -= 1
						EndIf
						If $Count > 0 Then
							if $bState=False then GUICtrlSetState($Button, $GUI_ENABLE)
							$bState=True
						Else
							if $bState=true then GUICtrlSetState($Button, $GUI_DISABLE)
							$bState=False
						EndIf
					EndIf
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
Saludos
  • ............................................Imagen
    ......................................Imagen
Responder