Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Как узнать изменено ли значение checkbox (http://forum.oszone.net/showthread.php?t=153730)

malev 20-10-2009 11:32 1247701

Как узнать изменено ли значение checkbox
 
Как узнать менялось ли значение checkbox у строки из ListView, это не помогает - "If BitAND(GUICtrlRead($iCtrlID), $GUI_CHECKED) Then ..."

FlatX007 20-10-2009 12:04 1247735

Может я не правильно понял :)

Код:

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

Dim $sIndex[2] = ["Checkbox1", "Checkbox2"]

$nForm = GUICreate("", 196, 92)
$Checkbox1 = GUICtrlCreateCheckbox($sIndex[0], 8, 8, 97, 17)
$Checkbox2 = GUICtrlCreateCheckbox($sIndex[1], 8, 32, 97, 17)

GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

GUISetState(@SW_SHOW)

Do
Until
GUIGetMsg() = $GUI_EVENT_CLOSE

Func WM_COMMAND($hWndGUI, $MsgID, $WParam, $LParam)
    Local $iIDFrom = BitAND($wParam, 0xFFFF)
    Local $iCode = BitShift($wParam, 16)
    Dim $aRead[2] = [GUICtrlRead($iIDFrom), GUICtrlRead($iIDFrom, 1)]

    For $i = 0 To UBound($sIndex) - 1
        If $aRead[1] = $sIndex[$i] Then
            MsgBox(0, Default, "Изменено значение чекбокса - " & $aRead[1])
            ExitLoop
        EndIf
    Next
    Return
$GUI_RUNDEFMSG
EndFunc


Creat0R 20-10-2009 14:11 1247863

Цитата:

Цитата FlatX007
Может я не правильно понял »

Неа :) Автор же пишет про checkbox в ListView. И в случае с твоим примером не нужен WM_COMMAND, оно проверяется в цикле обычно.

Цитата:

Цитата malev
Как узнать менялось ли значение checkbox у строки из ListView »

Я как то тоже был озадачен этим вопросом, вот пример:

Код:

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <GuiListView.au3>
;

$hGUI = GUICreate("ListView Item Сhecked")

$hListView = GUICtrlCreateListView("Column 1|Column 2", 10, 10, 380, 360, -1, $LVS_EX_CHECKBOXES + $WS_EX_DLGMODALFRAME)

_GUICtrlListView_RegisterSortCallBack($hListView)

For $i = 1 To 10
    GUICtrlCreateListViewItem("Item " & $i & "|SubItem " & $i, $hListView)
Next

$Status_Label = GUICtrlCreateLabel("", 10, 385, 380, 15, $SS_SUNKEN)

GUISetState()
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func ItemChecked_Proc($iItem, $bState, $iID)
    GUICtrlSetData($Status_Label, "<" & $iItem & "> is checked = " & $bState & ", CtrlID = " & $iID)
EndFunc

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView
    $hWndListView
= $hListView
    If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)

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

    Switch $hWndFrom
        Case $hWndListView
            Switch $iCode
                Case $LVN_COLUMNCLICK ; A column was clicked
                    Local $tInfo = DllStructCreate($tagNMLISTVIEW, $lParam)

                    ; Kick off the sort callback
                    _GUICtrlListView_SortItems($hWndFrom, DllStructGetData($tInfo, "SubItem"))
                Case $NM_CLICK, $NM_DBLCLK, $NM_RCLICK
                    Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
                    Local $iIndex = DllStructGetData($tInfo, "Index")

                    If $iIndex <> -1 Then
                        Local $iX = DllStructGetData($tInfo, "X")
                        Local $iPart = 1
                        If _GUICtrlListView_GetView($hListView) = 1 Then $iPart = 2 ;for large icons view

                        Local $aIconRect = _GUICtrlListView_GetItemRect($hListView, $iIndex, $iPart)

                        If $iX < $aIconRect[0] And $iX >= 5 Then
                            $iOld_Sel_Index = _GUICtrlListView_GetSelectedIndices($hListView)
                            _GUICtrlListView_SetItemSelected($hListView, $iIndex)

                            $iID = GUICtrlRead($iIDFrom)

                            ControlListView($hWnd, "", $iIDFrom, "SelectClear")
                            If $iOld_Sel_Index <> "" Then _GUICtrlListView_SetItemSelected($hListView, Number($iOld_Sel_Index))

                            ItemChecked_Proc(_GUICtrlListView_GetItemText($hListView, $iIndex), _
                                (_GUICtrlListView_GetItemChecked($hListView, $iIndex) = 0), $iID)
                            Return 0
                        EndIf
                    EndIf
            EndSwitch
    EndSwitch

    Return $GUI_RUNDEFMSG
EndFunc


malev 20-10-2009 16:06 1247953

Вот это код, действительно работает, еще бы как узнать ControlID чекнутого элемента, индекс не подойдет так как я сортирую список

Creat0R 21-10-2009 06:51 1248407

Цитата:

Цитата malev
индекс не подойдет так как я сортирую список »

Ну а зачем ID для сортировки? Я поправил свой пример, он теперь включает и сортировку :)

Цитата:

Цитата malev
как узнать ControlID чекнутого элемента »

И это добавил в свой пример.

malev 21-10-2009 13:40 1248707

Конечно ID не нужен для сортировки просто мне нужно записать check строки в файл, а при сортировке все индекса меняются кто был первым может стать последним поэтому и идентифицирую запись по ID. Можно конечно еще поле добавить порядковый номер...Считаю тему решенной. Спасибо.


Время: 03:59.

Время: 03:59.
© OSzone.net 2001-