Comunidad Gambas-es

Versión completa: ¿Como ejecuto propiedades de mis diferentes formularios?
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Páginas: 1 2
Hola

Voy a intentar explicar mi problema que para mi no es muy fácil explicarlo.

Tengo varios formulario digamos:

frmFormulario1
frmFormulario2
frmFormulario3

Y necesito detectar cual esta en un panel cada vez. Esto lo hago desde un frmFormularioX Yo hago esta pregunta al código:

If String.Left(Object.Class(FMain.pnlContenedor.Children[0]).Name, 3) = "frm" Then ' esto lo hago por que todos mis formulario empiezan por frm pero no es muy seguro, lo se.

Y despues hago:
GAMBAS
  1. Dim formulario As Form = FMain.pnlContenedor.Children[0] ' digamos que pasamos frmFormulario1
  2. formulario.Close ' lo correcto sería frmFormulario1.Close
  3. formulario.Reparent(FMain.pnlContenedor, 0, 0) ' y justo aquí dice siempre - objeto inválido en frmFormularioX -
  4. formulario.Raise



Como resuelvo lo del objeto inválido, me dan una guía.

Gracías.

Nota he visto que si uso:

Esto si funciona
GAMBAS
  1. frmFormulario1.Close
  2. frmFormulario1.Reparent(FMain.pnlContenedor, 0, 0)
  3. frmFormulario1.Raise



Esto no por que cierro el formulario y quiero reutilizarlo pero es imposible
GAMBAS
  1. formulario.Close
  2. formulario.Reparent(FMain.pnlContenedor, 0, 0)
  3. formulario.Raise



Dejo claro que es una ampliación de la explicación anterior.
Prueba ésto:

GAMBAS
  1. Public Sub BtnDetecta_Click()
  2.  
  3.     Dim o As Object
  4.     
  5.     For Each o In panel1.children
  6.         If o Is Form Then
  7.             Message("Ahora está el " & o.name)
  8.             Break
  9.         Endif
  10.     Next
  11.  


Gracias Shordi por atenderme Smile

Oye mi problema es este que es que no se realmente como describirlo, pero lo intento de nuevo.

1. Yo ejecuto la aplicación y me abre un FMain con un Panel que hace de contenedor de formularios.
2. Después ese Panel en su Children[0] sería siempre un formulario.
3. Desde FMain hago un Show de un formulario digamos frmFormularioX y este último es el que me causa el problema y el problema es que cuando voy a cerrar frmFormularioX pues justo antes quiero refrescar cualquier formulario que esta dentro del Panel contenedor de FMain y sinceramente no se como hacerlo sin llamar al formulario que este en ese momento.

Yo antes de cerrar frmFormularioX tengo FMain.pnlContenedor.Children[0] para conocer cual formulario existe en el panel contenedor de FMain pero, ¿como gestiono su refresco, con refresco quiero decir que necesito que cargue todo los datos que contiene el formulario en su interior?.

Espero que te halla explicado algo mejor ahora mi problema.

Gracias de verdad por ayudarme.
Prueba:

GAMBAS
  1. dim f as miformulario1
  2.  
  3. For each o in panel.children
  4.      o.delete()
  5. f=new miformulario1(panel)
  6. f.show



La clave es lo de New
No, me parece, que no lo pillas o yo no lo explico o soy yo el que no te pillo.

Yo en el frmFormularioX solo dispongo de FMain.pnlContenedor.Children[0] aunque esto pueda ser en cualquier instante frmFormulario1, frmFormulario2 o frmFormulario3, etc.

Como hago tu Dim f as miformulario1 sino se pasar FMain.pnlContenedor.Children[0] a tu miformulario1 para después hacer por ejemplo un miformulario1.Close o miformulario1.delete ya que necesito volverlo a usar después para hacer un Reparent y no tengo el formulario fisico. No se si te lo explico bien. Básicamente lo que necesito es que un formulario que esta encima de FMain gracias a un Show desde FMain destruya o refresque un formulario que esta dentro de un panel contenedor que esta ubicado dentro del formulario FMain para que los datos refresquen cualquier cambio.

Nota: Acabo subir una segunda aplicación demo para aclarar mejor
Ya entiendo. Tal como me lo planteas en la demo, desde el formulario x quieres reabrir el form1, lo que es facilito si solo tienes dos, pero una locura si tienes muchos.
Solución: no uses un panel como contenedor utiliza un control con gestor de pestañas, como tabstrip o tabpanel o, mejor todavía, workspace

Lo demás es complicarte la vida innecesariamente.

Te adjunto ejemplo
Saludos
O no lo veo o simplemente no me sirve tu propuesta, aunque como sabes te lo agradezco de verdad.

Es que lo que hace el FormX es cambiar la base de datos y esto afecta a los Form1, Form2, etc, siempre los afecta y deben ser refrescados sus datos que estos lo contienen.

Y siempre el FormX debe ser una ventana encima de FMain por que es un formulario muy largo en su vertical, aunque esto lo resuelve un scrooll y listo.

No se, no se. Si tienes tiempo y ganas mira el formulario último que subí.

Mil gracias.
Hola gambafeliz.

No me funciona el Reparent  o no se como funciona, incluso lo coloque en un botón, no hace nada y genera el mensaje de consola:

(demo1:10259): Gdk-CRITICAL **: 09:51:26.479: gdk_window_raise: assertion 'GDK_IS_WINDOW (window)' failed

En el FMain desactive las lineas del Reparent y coloque estas debajo:

GAMBAS
  1. Public Sub Form_Open()
  2.  
  3.    Dim s As Form[] = [Form1, Form2, Form3]
  4.    Dim f As Form = s[Rand(0, 2)]
  5.    '****
  6.    'f.Reparent(Panel1, 0, 0)
  7.    'f.Raise
  8.    '****
  9.    '
  10.   Select Case f.Name
  11.     Case Form1.Name
  12.       f = New Form1(Panel1)
  13.     Case Form2.Name
  14.       f = New Form2(Panel1)
  15.     Case Form3.Name
  16.       f = New Form3(Panel1)
  17.    '



Si te funciona también puedes crear una Sub que recibe como parametro el Name del formulario para usarlo con el Select Case.

Saludos.
Efectivamente, no lo entiendo. Un formulario es una instancia de una clase. Que se pueda usar como clase estática, es decir que yo pueda "hablar" de form1 y mostrarlo, cerrarlo o "reparentarlo", es una cosa que no cambia en nada que seguimos hablando de una instancia de una clase. Pero no entiendo a qué llamas "refrescar". Es una contradicción cerrar un formulario (lo que destruye la instancia) y querer "reparentarlo" después... Además de que sigo sin entender el fin de todo eso. Si pones un ejemplo funcional o, al menos algún pantallazo de lo que quieres hacer, tal vez se entienda pero creo que hay algo equivocado en tu la lógica de lo que quieres hacer.

Saludos.
*********
Shordí
*********
Perdón acabo de llegar de mis quehaceres.

Empiezo por Shordi, ok.

Como te he dicho el último ejemplo que he puesto es funciona. Cuando estas en el FormX al cerrarlo debería crear un código para ejecutar el evento Form1_2_3...etc_Open() de los formularios que están reparentados en el Panel1 de FMain. Y este Open() cambiará un Label1 en su propiedad Text pero no estoy seguro si has visto este último ejemplo.

Por otra parte si quiero confesarte que no tengo muy claro del todo el concepto mostrarlo, cerrarlo o reparentarlo en sí, bajo los concepto de Gambas, ten en cuenta que estoy aprendiendo mas o menos con la formula de ensayo y error ya que no existe un curso tipo Microsoft Visual Basic, pero si te digo que no lo digo con ningún tono de queja, ni de nada, es solo lo que es un comentario sin ninguna mala intensión.

Entiendo los concepto pero no siempre están claro para mi. Cosas de novatos.

Mi objetivo son dos.

Que se dispare el evento _Open() de los formulario reparentados y por otra parte crear un código genérico para detectar estos formulario desde FormX así como hacer el reparent con objeto Form genérico que dispare el evento _Open()

***********
omoreno
***********

Te respondo, después del rapapolvo que me ha dado mi amigo y maestro Shordi.

Primero muchas gracias por tu esfuerzo e interés. Gracias.

Esta formula que has utilizado ya la hice en el pasado yo. Si te fijas en tu código no es genérico es fijo y predecible no es un código impredecible y no esta creado para recibir cualquier formulario sea cual sea así como debe ser mantenido según los formulario que tengamos. No me vale, lo siento.

Para que lo tengas mas claro me refiero a tu Select Case, no es genérico. Pero por favor, quiero que sepas nuevamente que te lo agradezco enormemente tu buen interés.

Con respecto a tu error no se, no tengo tanta experiencia como para indicarte por que pasa, pero el ejemplo que he subido en mi IDE de Gambas es totalmente funcional incluso el reparent.

*******************
a ambos
******************

Gracias de corazón si queréis seguir con mi problema os lo agradecería enormemente. Es posible que no sea posible ayudarme y lo entiendo.

Y por último la conversación con omoreno creo que me ha abierto una idea y es disparar los eventos de los reparent directamente llamando a los eventos de FMain y tan solo seria sabiendo con una variable global quien esta dentro del Panel1 de FMain y sabiendo esto, puedo llamar su evento correspondiente. Aunque se irian flecos como recordar la posición de las cosas como Gridview, y algunas cosas, pero es posible seguir tirando de alguna lógica. Lo ideal es resolverlo. (nota esta última idea no va a funcionar tampoco he detectado que no funciona, Sad)
Páginas: 1 2