lunes, 20 de agosto de 2018

Mostrar un Formulario de VFP en Windev y Viceversa

Mostrar un formulario de VFP dentro de una ventana de Windev y viceversa

Seguramente a alguno de ustedes les ha pasado por la mente poder embeber un formulario de Fox en Windev o viceversa, pues aquí les tengo la solución. Se trata de jugar con un par de DLLS que nos ofrece Windows.
La primera función que utilizaremos es la WinExec() de ”kernel32.dll” que nos servirá para lanzar un EXE cualquiera.

Ejemplo:
*-- Declarar la función de la DLL
DECLARE INTEGER WinExec IN kernel32 STRING lpCmdLine, INTEGER nCmdShow

=WinExec(“c:\path\to\my\exe\file.exe”, 1)

La siguiente función que nos servirá para lograr este proceso es FindWindow() de ”user32.dl”
Ejemplo:
*-- Declarar la función de la DLL
DECLARE INTEGER FindWindow IN user32 STRING lpClassName, STRING lpWindowName
nHwnd = FindWindow(NULL, "Titulo exacto de mi ventana")
?nHwnd
Una de las cosas que no me gusta de ésta función es que tienes que especificarle el caption o título exacto de la pantalla que quieres buscar. Pero lo bueno es que funciona perfectamente así que puedo acostumbrarme a vivir con eso.
Finalmente nos queda usar la función SetParent() de ”user32” que nos permitirá cambiar el parent de la aplicación por nuestro formulario.
Ejemplo:

*-- Declarar la función de la DLL
DECLARE INTEGER SetParent IN user32 INTEGER hWndChild, INTEGER hWndNewParent
SetParent(nHwnd,THISFORM.HWND)

El código final sería el siguiente:

*-- Declaración de las funciones.
DECLARE INTEGER WinExec            IN kernel32 STRING  lpCmdLine,           INTEGER nCmdShow
DECLARE INTEGER FindWindow         IN user32   STRING      lpClassName,      STRING       lpWindowName
DECLARE INTEGER SetParent          IN user32   INTEGER hWndChild,            INTEGER hWndNewParent

*-- Ejecutamos el EXE
= WinExec("C:\My Projects\CopiarArchivos\Exe\FileTransferer.exe", 1)
INKEY(0.1)                                     && Esperamos solo un momento que cargue el exe.
nHwnd = FindWindow(NULL, "Main")   && Recuerden que tienen que especificar el titulo exacto de la pantalla.
SetParent(nHwnd,THISFORM.HWND)           && Forzamos que la pantalla se ancle a nuestro formulario.

Ahora hagamos lo mismo desde Windev

En Windev es el proceso es similar, es decir, primero levantamos el EXE y luego obtenemos su handle haciendo uso de la misma función y finalmente mostramos el formulario de VFP en nuestra ventana.

Ejemplo:
// Ejecutamos el EXE
ExeRun("C:\DESARROLLO\Utilidades\VFPWINDEV\proj1.exe")
Wait(50,waitRedraw) // Igualmente esperamos a que cargue el EXE.
nHwnd is int = API("user32.dll","FindWindowA",Null,"Form1") //Obtenemos su Handle a traves de su Titulo exacto.
IF nHwnd > 0 THEN
       API("user32","SetParent",nHwnd,Handle(WIN_VFPWINDEV)) // Forzamos a que se ancle a nuestra ventana.
END


Conclusión:
A muchos de nosotros seguramente nos ha tocado explorar nuevas herramientas de desarrollo para ir complementando con Fox y así darle un respiro al lenguaje ya que la idea es crear un entorno o ecosistema en el cual ambos lenguajes puedan intercambiar información y ayudarse mutuamente. Esa necesidad es la que nos motiva a investigar para hacer posible tal intercambio, una de ellas es la necesidad de poder anclar pantallas de otros lenguajes en nuestra aplicación hecha en VFP o incluso en viceversa por la facilidad que nos ofrece VFP por ejemplo para abrir tablas DBF que aún estemos ocupando, una ventaja es que podemos crearnos una aplicación en FOX que abra y muestre información de las DBF’s desde Windev, ahí tienen su Browse desde Windev :-P

Pienso que la idea de buscar otra herramienta de desarrollo no es para remplazar a la primera a VFP sino más bien para poder darle un respiro con cosas que son relativamente más fáciles en dicha herramienta que en el mismo FOX, tal caso puede ser el manejo de los formatos JSON por citar alguno. En FOX se puede hacer con librerías de terceros, pero en Windev ya viene de forma nativa con las funciones JsonToVariant y VariantToJson, es más rápido y en los negocios mientras más rápido termines más rápido cobras.

NOTA: ésta metodología no solo aplica para pantallas hechas entre las herramientas citadas sino que aplica también para cualquier EXE válido.

miércoles, 1 de agosto de 2018

Conectarse a una tabla libre DBF usando el proveedor OLE DB

Siendo un programador de Visual FoxPro9, aún sigo usando las tablas DBF, es una costumbre de años y que no se me va a quitar de la noche a la mañana. Las tablas DBF son el método más fácil en que nosotros podemos almacenar y recuperar información en un formulario.

Es por eso que aún usando Windev, siempre vamos a necesitar acceder a una tablita DBF bien sea para importar, exportar, leer o escribir información.

Aquí les dejo un ejemplo de cómo acceder a una DBF usando el proveedor OLE DB que viene con Visual FoxPro.

*NOTA: necesitas instalar el provedor OLE DB en las máquinas de tus clientes, así que te dejo el link de descarga.

 

// -- Conectarse a una tabla libre DBF usando el proveedor OLEDB de VisualFoxPro
ctVFPConn is Connection
ctVFPConn..Source = "C:\my\path\to\usuarios.dbf"
ctVFPConn..Access = hORead
ctVFPConn..Provider = "VFPOLEDB.1"

IF NOT HOpenConnection(ctVFPConn) THEN
       Error(HErrorInfo())
       RETURN
END

// En éste punto ya estamos "conectados" a la tabla.
// ahora vamos a realizar alguna consulta
dsCurUsuarios is Data Source // Esto vendria siendo como un cursor.

IF NOT HExecuteSQLQuery(dsCurUsuarios,ctVFPConn,hQueryWithoutCorrection,"SELECT * FROM usuarios") THEN
       Error(HErrorInfo())
       RETURN
END
// Recorrer el data source (cursor)
HReadFirst(dsCurUsuarios) // GO TOP
WHILE HOut(dsCurUsuarios) = False  
       Info(dsCurUsuarios.email) // MESSAGEBOX(curUsuarios.email)
       HReadNext(dsCurUsuarios) // SKIP 1 IN curUsuarios
END
Info(HNbRec(dsCurUsuarios)) // MESSAGEBOX(RECCOUNT('curUsuarios'))
HClose(dsCurUsuarios)

Una traducción de éste código al VFP sería:

USE "C:\my\path\to\usuarios.dbf" ALIAS curUsuarios
SCAN
      MESSAGEBOX(curUsuarios.email)
ENDSCAN
MESSAGEBOX(RECCOUNT('curUsuarios'))
USE IN curUsuarios