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.
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
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