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.

No hay comentarios:

Publicar un comentario