26 de marzo de 2017

Simular CkeckBoxes en un control ListBox

Para mostrar los CheckBoxes en un ListBox y enganchar todo el asunto hasta una tabla, se debe utilizar la propiedades Picture (entre otras cosas) del ListBox. En realidad no son CheckBoxes, son iconos. De hecho, los que estoy usando son más como luces (yo quería dar un ejemplo que se pueda ejecutar desde un PRG). Se puede usar cualquier imagen que desee ... encontrar un par de imágenes realmente buenas de casillas de verificación que están marcadas y desmarcadas y simplemente reemplazar las correspondientes propiedades del Formulario.

El ListBox tiene un Cursor como RowSource y uno de los campos "Checked" se utiliza para realizar un seguimiento de qué registros están marcados o desmarcados. Incluso podría dar un paso más y cambiar el campo marcado a numérico y tener una casilla de verificación MultiEstado con los valores 0, 1 y 2 y utilizar tres imágenes. (Copie y peque el siguiente código en un archivo PRG y ejecútelo desde VFP)

PUBLIC oForm
oForm = CREATEOBJECT("clsListCheckBox")
oForm.VISIBLE = .T.
READ EVENTS

DEFINE CLASS clsListCheckBox AS FORM

    TOP = 1
    LEFT = 0
    HEIGHT = 473
    WIDTH = 287
    DOCREATE = .T.
    CAPTION = "Listbox With Checkboxes"
    WINDOWSTATE = 0
    NAME = "clsListCheckBox"
    AlwaysOnTop = .T.
    CheckIcon = HOME() + "Graphics\Icons\Misc\MISC15.ICO"
    Uncheckicon = HOME() + "Graphics\Icons\Misc\MISC13.ICO"
    SHOWWINDOW = 2

    ADD OBJECT list1 AS LISTBOX WITH ;
        HEIGHT = 408, ;
        LEFT = 12, ;
        SORTED = .T., ;
        TOP = 48, ;
        WIDTH = 264, ;
        NAME = "List1", ;
        ROWSOURCETYPE = 2, ;
        ROWSOURCE = "ListCheck"
        
    PROCEDURE LOAD
        LOCAL nCount, nCount2, nWordLength, sItem, nUpper, nLower
        nUpper = 90 &&ASCII
        nLower = 65 &&ASCII
        CREATE CURSOR ListCheck (MyEntry c(35), Checked L)
        FOR nCount = 1 TO 250
            sItem = ""
            nWordLength = INT((35) * RAND( ) + 1)
            FOR nCount2 = 1 TO nWordLength
                sItem = sItem + CHR(INT((nUpper - nLower + 1) * RAND( ) + nLower))
            ENDFOR
            INSERT INTO ListCheck (MyEntry, Checked) VALUES(sItem, .F.)
        NEXT
    ENDPROC
        
    PROCEDURE Unload
        USE IN SELECT("ListCheck")
        CLEAR EVENTS
    ENDPROC

    PROCEDURE ListSetup
        THISFORM.LOCKSCREEN = .T.
        LOCAL nListCount
        nListCount = 1
        SELECT ListCheck
        SCAN ALL
            IF ListCheck.Checked
                THIS.list1.PICTURE(nListCount) = THISFORM.CheckIcon
            ELSE
                THIS.list1.PICTURE(nListCount) = THISFORM.Uncheckicon
            ENDIF
            nListCount = nListCount + 1
        ENDSCAN
        THISFORM.LOCKSCREEN = .F.
    ENDPROC

    PROCEDURE SetCheck
        LOCAL nListIndex
        nListIndex = THIS.list1.LISTINDEX
        IF nListIndex > 0
            GO nListIndex IN "ListCheck"
            IF ListCheck.Checked
                THIS.list1.PICTURE(nListIndex) = THISFORM.Uncheckicon
            ELSE
                THIS.list1.PICTURE(nListIndex) = THISFORM.CheckIcon
            ENDIF
            REPLACE ListCheck.Checked WITH !ListCheck.Checked
        ENDIF
    ENDPROC

    PROCEDURE list1.GOTFOCUS()
        IF DODEFAULT()
            THISFORM.ListSetup()
        ENDIF
    ENDPROC
    
    PROCEDURE list1.CLICK()
        IF LASTKEY() = 13
            THISFORM.SetCheck()
        ENDIF
    ENDPROC

    PROCEDURE list1.KEYPRESS(nKeyCode, nShiftAltCtrl)
        IF nKeyCode = 13 OR nKeyCode = 32
            THISFORM.SetCheck()
        ENDIF
    ENDPROC

ENDDEFINE

Craig Boyd

1 comentario :

  1. Buenos dias, al correr tu programa no muestra la checkbox, solo una columna, es un error o hay que definir la segunda columna. Corri el codigo y asi es como funciona, Saludos

    ResponderBorrar

Los comentarios son moderados, por lo que pueden demorar varias horas para su publicación.