archivo de texto con las propiedades de los controles

52 views
Skip to first unread message

Elides Paredes

unread,
Feb 8, 2026, 11:16:24 AM (13 days ago) Feb 8
to Comunidad de Visual Foxpro en Español
Saludos amigos.
Hace tiempo logre hacer un algoritmo para  un botón que me permitía crear un archivo de texto con el nombre de los controles y las propiedades de esos controles, las que yo quería para organizarlos.
Hoy se me ocurrió pedirle a Gemini I.A. que lo mejorara y éste fue el resultado, es tan genial que quise compartirlo en la comunidad porque me ayuda muchísimo.
Espero les sea útil también. 
Saludos a todos

Elides Paredes
Barquisimeto venezuela

esté es el código, cualquier sugerencia es bienvenida.

* Btn_Copiar_controles - Organizado por Paginas
* ----------------------------------------------
LOCAL lcRuta, lcArchivo, loWSH, lcComando, lnI, lnP, loObj, loCont

lcRuta = "C:\Aqui\RTF\"
lcArchivo = lcRuta + "Posicion_Controles_Paginas.rtf"

* 1. Asegurar ruta de destino
IF !DIRECTORY(lcRuta)
    MD (lcRuta)
ENDIF

* 2. Preparar cursor de datos (añadimos campo nPagina)
CREATE CURSOR cControles ;
    ( nPagina N(2), ;
      nombre C(50), ;
      clase C(30), ;
      posicion_left N(10), ;
      posicion_top N(10), ;
      ancho N(10), ;
      alto N(10) )

* 3. Barrido de controles del Formulario
FOR lnI = 1 TO THISFORM.ControlCount
    loObj = THISFORM.Controls(lnI)
   
    * Controles que estan fuera del PageFrame (Pagina 0)
    INSERT INTO cControles (nPagina, nombre, clase, posicion_left, posicion_top, ancho, alto) ;
    VALUES (0, loObj.Name, loObj.BaseClass, ;
            IIF(PEMSTATUS(loObj, "Left", 5), loObj.Left, 0), ;
            IIF(PEMSTATUS(loObj, "Top", 5), loObj.Top, 0), ;
            IIF(PEMSTATUS(loObj, "Width", 5), loObj.Width, 0), ;
            IIF(PEMSTATUS(loObj, "Height", 5), loObj.Height, 0))

    * 4. Si es un PageFrame, extraer por paginas
    IF UPPER(loObj.BaseClass) == "PAGEFRAME"
        FOR lnP = 1 TO loObj.PageCount
            FOR EACH loCont IN loObj.Pages(lnP).Controls
                INSERT INTO cControles (nPagina, nombre, clase, posicion_left, posicion_top, ancho, alto) ;
                VALUES (lnP, loCont.Name, loCont.BaseClass, ;
                        IIF(PEMSTATUS(loCont, "Left", 5), loCont.Left, 0), ;
                        IIF(PEMSTATUS(loCont, "Top", 5), loCont.Top, 0), ;
                        IIF(PEMSTATUS(loCont, "Width", 5), loCont.Width, 0), ;
                        IIF(PEMSTATUS(loCont, "Height", 5), loCont.Height, 0))
            ENDFOR
        ENDFOR
    ENDIF
ENDFOR

* 5. Ordenar por Pagina, luego por Top (para que sigan el orden visual de arriba a abajo)
SELECT cControles
INDEX ON STR(nPagina,2) + STR(posicion_top,5) TAG orden_pag
SET ORDER TO orden_pag
GO TOP

* 6. Generar el reporte con encabezados por pagina
SET SAFETY OFF
SET TEXTMERGE ON
SET TEXTMERGE TO (lcArchivo) NOSHOW

\LISTADO DE POSICIONES POR PAGINA
\Formulario: <<THISFORM.Caption>>
\Fecha:      <<DATETIME()>>
\
\Nota: Pagina 0 son controles directos en el Formulario.
\

LOCAL lnPagActual
lnPagActual = -1

SCAN
    * Si cambiamos de pagina, ponemos un encabezado nuevo
    IF cControles.nPagina <> lnPagActual
        lnPagActual = cControles.nPagina
        \
        \=======================================================================
        \ CONTROLES EN PAGINA: <<ALLTRIM(STR(lnPagActual))>>
        \=======================================================================
        \NOMBRE                    CLASE           ALTO   ANCHO   TOP    LEFT
        \-----------------------------------------------------------------------
    ENDIF

    \<<PADR(ALLTRIM(cControles.nombre), 25)>> <<PADR(ALLTRIM(cControles.clase), 15)>> <<STR(cControles.alto, 6)>> <<STR(cControles.ancho, 6)>> <<STR(cControles.posicion_top, 6)>> <<STR(cControles.posicion_left, 6)>>
ENDSCAN

\
\-----------------------------------------------------------------------
\Fin del reporte

SET TEXTMERGE TO
SET TEXTMERGE OFF

* 7. Ejecutar WordPad
IF FILE(lcArchivo)
    loWSH = CREATEOBJECT("WScript.Shell")
    lcComando = 'WordPad.exe "' + lcArchivo + '"'
    loWSH.Run(lcComando, 3, .F.)
ENDIF

Reply all
Reply to author
Forward
0 new messages