23 de marzo de 2018

Obtener todos los objetos de un formulario

Una Clase para obtener todos los objetos de un formulario y retornarlos dentro de un objeto Collection (VFP8 en adelante) mejorando por tanto la manera de acceder a ellos por clave.

******** CODIGO DE EJEMPLO *******
_SCREEN.ADDOBJECT('txtFldA', 'TextBox')
_SCREEN.ADDOBJECT('txtFldB', 'TextBox')
_SCREEN.ADDOBJECT('txtFldC', 'TextBox')
_SCREEN.ADDOBJECT('txtFldD', 'TextBox')
LOCAL loCol AS Collection
loCol = CREATEOBJECT('collection')
? COBJECTS(loCol, _SCREEN)
? loCol(3).NAME
? loCol(3).VISIBLE
loCol('txtFldC').TOP   = 100
loCol('txtFldC').VALUE = 'Prueba'
loCol('txtFldC').VISIBLE = .T.
*!* Nota: Es conveniente que la vida de la coleccion sea la mas corta posible
*!*       con el fin de evitar errores de garbaje o de collecion de basura ya que
*!*       la coleccion guarda refrencias a muchos objetos cuya vida no se asegura
RELEASE loCol
RETURN
**********************************
*!* Devuelve todos los objetos contenidos en contenedor
*!* Sintaxis:   COBJECTS(toCol, toCnt)
*!* Retorno:    lnRetVal
*!* Argumentos: toCol especifica la coleccion de retorno con los objetos contenidos
*!*             debe declararse en el programa que invoca la funcion y pasarse 
*!*             por referencia toCnt especifica el objeto contenedor que se va a examinar
*!*
*!* Nota:       Como la funcion es recursiva para darle mas rapidez no hacemos 
*!*             comprobaciones sobre la validez de los parametros enviados
*!*             por lo que confiamos que toCol se haya declarado, pasado por 
*!*             referencia y que toCnt realmente sea un objeto contenedor
FUNCTION COBJECTS
  LPARAMETERS toCol AS Collection, toCnt AS OBJECT
  LOCAL loCtrl AS OBJECT, loPage AS OBJECT, loColu AS OBJECT, lcClass AS CHARACTER, ;
  lnKey AS INTEGER, lcKey AS CHARACTER, lnRetVal AS INTEGER

  FOR EACH loCtrl IN toCnt.CONTROLS
    *!* Valores
    lcClass = UPPER(loCtrl.BASECLASS)
    *!* Buscar una key valida
    FOR lnKey = 0 TO 32767
      lcKey = loCtrl.NAME + ALLTRIM(TRANSFORM(lnKey, @Z'))
      IF toCol.GetKey(lcKey) = 0
        EXIT
      ENDIF
    ENDFOR
    *!* Agregar control a la coleccion
    toCol.ADD(loCtrl, lcKey)
    *!* Recursivo
    DO CASE
      CASE  lcClass = 'PAGEFRAME'
        *!* Recorrer las paginas
        FOR EACH loPage IN loCtrl.PAGES
          COBJECTS(toCol, loPage)
        ENDFOR
      CASE lcClass = 'GRID'
        *!* Recorrer las columnas
        FOR EACH loColu IN loCtrl.COLUMNS
          COBJECTS(toCol, loColu)
        ENDFOR
      CASE lcClass = 'CONTROL'
        *!* El un objeto control no puede ser recorrido
        *!* aunque tenga la propiedad ControlCount
      CASE PEMSTATUS(loCtrl, 'ControlCount', 5)
        *!* Recorre objeto contenedor
        COBJECTS(toCol, loCtrl)
      CASE PEMSTATUS(loCtrl, 'ButtonCount', 5)
        *!* Recorre botones
        FOR EACH loCtrl IN loCtrl.BUTTONS
          *!* Buscar una key valida
          FOR lnKey = 0 TO 32767
            lcKey = loCtrl.NAME + ALLTRIM(TRANSFORM(lnKey, @Z'))
            IF toCol.GetKey(lcKey) = 0
              EXIT
            ENDIF
          ENDFOR
          *!* Agregar control a la coleccion
          toCol.ADD(loCtrl, lcKey)
        ENDFOR
    ENDCASE
  ENDFOR
  *!* Valor retorno
  lnRetVal = toCol.COUNT
  *!* Retorno
  RETURN lnRetVal
ENDFUNC
**********************************

Enjoy It...

Alexandre Hedreville

No hay comentarios. :

Publicar un comentario

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