abrir form dentro de otro form

2,256 views
Skip to first unread message

Saúl Piña

unread,
Jan 9, 2015, 3:46:36 PM1/9/15
to publice...@googlegroups.com
Saludos, siempre que debo mostrar para consulta o para toma de decisiones (por ejemplo un messagebox)  recurro al objeto container y diseño sobre el container segun mis necesidades, pero a veces se purpone un objeto con otro y quisiera saber si en lugar de container puedo usar un form dentro de un form principal, lo que quiero es que no se cierre el formulario principal, (ya que cuando intente usar un form dentro de otro form, se cierra u oculta el formulario principal y se muestra el form2, y eso no es lo que yo necesito). Sino que se abra el formulario2, realiza la tarea y despues cerrar el formulario y todo esto sin que se cierre el form principal. 

Este es un ejemplo de como utilizo el objeto container.

Desde ya muy agradecido.


ZeRoberto

unread,
Jan 9, 2015, 4:04:48 PM1/9/15
to publicesvfoxpro
Usas FORMSET ? yo te recomendaría que uses forms sueltos

Saludos

Fidel Charny

unread,
Jan 9, 2015, 4:07:25 PM1/9/15
to publice...@googlegroups.com

Si tienes un form principal ShowWindow=2 y quieres abrir otro (no dentro, sino que parezca), el segundo form tiene que ser ShowWindow=1 (In top level form).
Si el form de nivel superior es pequeño, tal vez tengas que poner en el secundario Desktop=.T.  para que se vea. La penalización es que no puedes abrir fromularios modales desde ese secundario, porque es muy posible que no lo puedas acceder y se te clave la interfaz.
Si el form de nivel superior ocupa toda la pantalla, no necesitas Desktop=.t. y puedes abrir otros formularios modales o no desde el secundario también.

En el ejemplo de la imagen, el sistema tiene su _screen.visible=.t., el form con el paisaje cordobés es un ShowWindow=2 (con menú), y los otros tres (no es conjunto de formularios) son ShowWindow=1 y WindowType=0, implementados desde una clase que controla el movimiento de los tres para mantener siempre la cascada, cierre/hide/show unificado, etc.

Allan Raúl Acuña

unread,
Jan 9, 2015, 4:09:58 PM1/9/15
to publice...@googlegroups.com
Te sugiero como dice el amigo FORMS independientes,

Ahora si necesitas heredar objetos del FORM1 y controlarlos en el FORMS2 

Puedes hacerlo mediante:

DO FORM form2 WITH Thisform


y en el INIT del form2

PARAMETERS oThisform

Thisform.oThisform = oThisform

Listo con la propiedad Thisform.oThisform tendrás disponible cualquier objeto del form1

Saludos cordiales.

Lic. Allan Raúl Acuña
Analista Programador
msn= allan...@hotmail.com
skype= NicEasySoft
            +(505) 8 999 8950
Managua, Nicaragua
Centroamérica



Date: Fri, 9 Jan 2015 16:04:44 -0500
Subject: Re: [vfp] abrir form dentro de otro form
From: zero...@gmail.com
To: publice...@googlegroups.com

Saúl Piña

unread,
Jan 9, 2015, 4:33:00 PM1/9/15
to publice...@googlegroups.com
Gracias, eso tambien se me paso comentar, que debo heredar objetos y parametros de un form a otro, es decir,

Si necesito pasar la clave que se encuentra en el form padre al form hijo1 entonces debo parametrizar, pero tambien necesito devolver el resultado de form hijo1 y que se muestre en form padre. supongo que es tambien parameters, es correcto?

gracias.

Saúl Piña

unread,
Jan 9, 2015, 4:34:44 PM1/9/15
to publice...@googlegroups.com
Gracias Fidel, es justamente lo que necesito, y de una vez te comento que los formularios hijos son pequeños por tener desde 3 objetos a 10 objetos.  sería casi identicos como los container que se muestra en la imagen que adjunté.

Muchas gracias.

Fidel Charny

unread,
Jan 9, 2015, 4:44:54 PM1/9/15
to publice...@googlegroups.com
Allan
Sería mejor que la propiedad del secundario se llame o_lotro_Form o cualquier cosa distinta de Thisform.
Leer Thisform.oThisform un viernes es una cosa terrible!!!!

Fidel Charny

unread,
Jan 9, 2015, 4:48:17 PM1/9/15
to publice...@googlegroups.com
Odio los Formset. ODIO LOS FORMSET!!!
O sea.

Antonio.xt

unread,
Jan 9, 2015, 5:19:19 PM1/9/15
to publice...@googlegroups.com

Saul, no es lo mismo heredar y pasar, puedes pasar un objeto como parametro.
Si necesitas heredar alguna funcionalidad necesariamente tienes que basarte en un objeto, ya sea form, boton, u otro objeto.

Si necesitas pasar y recibir datos hacia y desde el mismo form, puedes crear una clase form (form2) e instanciarla desde el form principal (form1) pasandole parametros al 2 y regresando valores al 1.

Bueno, la idea es esa...

Antonio Meza

unread,
Jan 9, 2015, 5:54:35 PM1/9/15
to publice...@googlegroups.com
En mi caso no me gusta complicarme las cosas y para resolver eso lo que hago es que al formulario al que le tengo que enviar parámetros pues le pongo en:

Evento Init
Lparameter a,b,c etc

y antes de abrirlo declaro algunas variables, ejemplo desde el Form1

local x,y,z
x = 1
y = 2
z = 3
*Abro el formulario modal
do form Formulario2 with ValorA, ValorB, ValorC

Y en cualquier lugar del formulario2 modifico las variables X,y,z y al salirme pues ya tengo los datos que necesito, así de sencillito y carismático jeje

saludos

Fernando D. Bozzo

unread,
Jan 9, 2015, 6:03:45 PM1/9/15
to publice...@googlegroups.com
Hola Saúl:

Menudo lío tenés con la interfaz y el negocio. Creo que te puede dar algunas ideas este artículo, incluyendo lo de pasar el objeto de datos por parámetro:

VFP: La Interfaz, las reglas de negocio y los Datos - Cómo separarlos y por qué


Saludos.-

Carlos Miguel FARIAS

unread,
Jan 10, 2015, 9:47:12 AM1/10/15
to Grupo Fox
Cuando en un formulario, necesito una funcionalidad que no es permanente, (y que acá en general se sugiere usar un formulario separado, que no es mala idea), lo que hago/hacia, es:
a) crear un contenedor dentro del formulario que lo requiera (con el diseñador, para no pensar mucho)
b) dentro de ese contenedor coloco los controles que necesito que trabajen juntos, no necesito pasar parámetros porque no me salí del formulario llamador.
c) dicho contenedor inicialmente está oculto.
d) con un botón, textbox, etc. o sea algo que reaccione ante una acción del usuario, hago visible el contenedor.
e) el usuario actúa sobre los controles del contenedor, cuando termina, el contenedor se vuelve a ocultar.
De esa manera, no tengo que pasar nada de un formulario a otro.
Los controles del contenedor oculto están des-habilitados mientras el contenedor está oculto (pero no inaccesibles), por lo que puedo pre-cargarlos antes de mostrar el contenedor.
Si quiero que actúe como un formulario modal, agrego otro contenedor o control invisible (no oculto) que se activa al activar el contenedor adicional, de esa manera, los controles de debajo del contenedor principal quedan "intocables", sin necesidad de des-habilitarlos.
Estructura:
Formulario: (controles del formulario principal (a), control "invisible-transparente" que cubre todo el formulario (b), contenedor con funcionalidad extra (c))
b y c deben estar hidden al empezar la corrida del formulario. b debe estar por encima de a y c por encima (al frente) de b.
En a) debe haber algo (tecla, botón, control, etc.) que al pulsarse des-ocultan b y c., b al estar no oculto, tapa todo lo que tenga a) (controles del formulario en general), por lo que los hace "intocables", c, que está arriba de todo que accesible, el usuario opera sobre él y cuando termina la tarea específica, oculta b y c).
a queda otra vez accesible.
Se podría reemplazar b por un comando setall que disabled todos los controles en a, pero si estos controles estaban enabled o disabled por otros factores, deberá que disparar nuevamente los eventos correspondientes para recuperar los estado previos.
Saludos: Miguel, La Pampa (RA)

mapner

unread,
Jan 10, 2015, 11:03:05 AM1/10/15
to publice...@googlegroups.com
He visto varios programas (sobre todo en VB) que utilizan el método de pseudo formularios auxiliares como contenedores "sueltos y ocultos" dentro del formulario original, al requerirlo lo hacen visible y luego de usarlo lo invisibilizan nuevamente. El problema que le encuentro a este método, es que sobrecarga de recursos al formulario original solo para un uso eventual y el diseño se embarulla de elementos extras. El simple método de usar otro formulario modal independiente donde o se comparta la sesión de datos o se pueden intercambiar parámetros o propiedades de ambos quiza es lo mejor por la simplicidad de diseño que implica y por la baja dependencia entre diferentes elementos y esto último es fundamental para que los sistemas sean mantenibles, la baja dependencia.

Saludos

Fernando D. Bozzo

unread,
Jan 11, 2015, 7:36:38 AM1/11/15
to publice...@googlegroups.com
Hola Saúl:

Te dejo un código que permite usar un form dentro de otro. Para poder hacer esto, el form interno debe estar basado en una clase Form y estar en una librería VCX, en mi caso "frm_scroll_creditos" es una clase form en la librería "lib_acercade.vcx".

Esto debe ir en el INIT de tu form, y tenés que tener creada la propiedad "oForm".

PROCEDURE INIT
   loForm = NEWOBJECT("frm_scroll_creditos", "lib_acercade.vcx")
   THISFORM.oform = loForm
   loForm.MOVE(THISFORM.Line1.Left, THISFORM.Line1.Top + 6, THISFORM.Line1.Width, THISFORM.Height - THISFORM.Line1.Top - 20)
   loForm.BackColor = RGB(255,255,255)
   SHOW WINDOW (loForm.NAME) IN WINDOW (THISFORM.NAME)
   ACTIVATE WINDOW (loForm.NAME)
ENDPROC


Saludos.-

Saúl Piña

unread,
Jan 12, 2015, 10:52:34 AM1/12/15
to publice...@googlegroups.com
Gracias por sus comentarios,

Fernando:
Estoy leyendo tu articulo, que me parece muy interesante para dejar a un lado malas costumbres de programacion, además probaré el form de clase que me comentas, gracias.

Miguel:
Casi exactamente hago lo mismo que tu, si revisas la imagen (que está en modo diseño, es decir, se ve claramente los contenedores a utilizar en ese form) pero que al momento de ejecutar el form, se encuentran "ocultos" con enabled=.f. y con visible=.f.  pero cuando los necesito, ha veces, no siempre, se interponen con los objetos del formulario principal y mi duda es si dejarlo tal cual, o recurrir a formularios eventuales. ??

Gracias.

Carlos Miguel FARIAS

unread,
Jan 10, 2015, 8:03:40 PM1/10/15
to Grupo Fox
Es parecido a usar un pageframe, que sería otra opción. Además, si es otro formulario, hay que pensar en el acceso a datos (area de tablas) que son independientes (salvo que uses el área común).
Además, ese contenedor, puede estar definido aparte y se incluye el objeto, por lo que no es "tann complicado".
En fin tiene un menu de opciones. que elija lo que le cocine mejor
Reply all
Reply to author
Forward
0 new messages