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