Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 1
 
 
Practica Con Formularios
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Practica Con Formularios 
 
Hola Comunidad!.

Como tuve algún problema con un programa que hice (Troceador) .Cree este ejemplo para solucionarlo.
Consiste:

Un formulario principal
Un formulario para crear varias instancias de el. (No tiene código)

Mi problema era con un array de formularios y con los que se habían creados en el escritorio.
Si yo cerraba una de esas instancias, manualmente, no se borraban del array de formularios
Tenia que borrarlo también del array de formularios. Tuve que crearme un manejador de eventos
para ese grupo de formularios y ademas añadirles un tag a cada uno.

Imagen:

 formularios

Código del formulario principal:

Private aformularios As New Object[]

Public Sub _new()

End

Public Sub Form_Open()
Dim x As Integer
Dim miformulario As Form

 For x = 0 To 3
   miformulario = New FormCopia As "grupoformularios"
   miformulario.Tag = x
   miformulario.Caption = "Soy la copia " & x
   aformularios.Add(miformulario)
   miformulario.Show
 Next


End

Public Sub btnCerrar_Click()
  Dim miformulario As Object
    
  'Los elimino del array y desaparecen de la pantalla
  For Each miformulario In aformularios
      If miformulario Is Form Then miformulario.delete      
  Next
  Me.Close
  
End

Public Sub grupoformularios_Close()
  Select Case Last.tag    
    Case 0 To aformularios.Count - 1
      Last.Close
      aformularios.Remove(Last.tag)
  End Select
  
  Print "He cerrado el formulario " & Last.tag
  
End
 


¿Algún consejo para mejorar la idea ?.

Todo el código esta en formulario principal,¿ no debería haber alguno en las copia ?.
Cuando se cierra una de las copia, por ejemplo. En el Close.No me fue necesario
y me he quedado con la duda.

Creo que tenía que haber puesto esta pregunta en fragmentos de código.Pero como es
de conocimiento general.

Saludos.
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Practica Con Formularios 
 
Realmente no son copias, ya que FormCopia lo defines al inicio como un objeto :
Dim miformulario As Form
  miformulario = New FormCopia As "grupoformularios"
  miformulario.Tag = x
  miformulario.Caption = "Soy la copia " & x
  aformularios.Add(miformulario)
  miformulario.Show


Si pusieras:
Dim miformulario As Form
  miformulario = New FormCopia As "grupoformularios"
  miformulario=Fmain ' aqui realmente copia el formulario Fmain completo a miformlario
  miformulario.Caption = "Soy la copia " & x  ' modifica una propieadad en la copia
  aformularios.Add(miformulario) '<- esto no se para que sirve....¿?
  miformulario.Show 'este formulario si deberia de tener codigo
 


Te dejo un codigo de ejemplo...donde si consigo hacer copias de un formulario con codigo....




Este es parte del codigo del Fmain:
' gambas class file

Public Sub _new()

End

Public Sub Form_Open()
Dim prueba As New Object[5]
prueba[0] = New OriginalForm 'OriginalForm, es un formulario con varios botones y codigo
prueba[0].Caption = "Formulario 1 copiado" 'modifico una propiedad de la copia.
prueba[0].Show

prueba[1] = New OriginalForm
prueba[1] = OriginalForm ' <- esta linea sobra, hace que no funcione bien el ejemplo, ver mi siente respuesta
prueba[1].x = 240 'modifico una propiedad de la copia.
prueba[1].y = 300
prueba[1].Caption = "Formulario 2 copiado"
prueba[1].Show

End
 


Pero tengo un problema (que creo que puede ser un bug de gambas3.0), con mas de 2 formularios no funciona bien..
Si intento definir otro:
prueba[2] = New OriginalForm
prueba[2] = OriginalForm ' <- esta linea sobra, hace que no funcione bien el ejemplo, ver mi siente respuesta
prueba[2].x = 240
prueba[2].y = 300
prueba[2].Caption = "Formulario 2 copiado"
prueba[2].Show
 


No salen 3 formularios... parece como si machacara el anterior.... creo que es un problema de gambas3.0 (version que he usado...)      

formulariosCopia-0.0.1.tar.gz
Descripción:  
Descargar
Nombre del archivo: formulariosCopia-0.0.1.tar.gz
Tamaño: 4.88 KB
Descargado: 17 veces
formulariosCopia-0.0.1.tar.gz
Descripción:  
Descargar
Nombre del archivo: formulariosCopia-0.0.1.tar.gz
Tamaño: 4.88 KB
Descargado: 17 veces
formulariosCopia-0.0.1.tar.gz
Descripción:  
Descargar
Nombre del archivo: formulariosCopia-0.0.1.tar.gz
Tamaño: 4.88 KB
Descargado: 17 veces

 




===================
Blog personal
Web: SoloGambas seleccion de articulos dedicados a Gambas
Visita el Curso de Gambas3 ¡¡¡Gratuito!!!
 
última edición por jsbsan el Jueves, 10 May 2012, 23:10; editado 4 veces 
jsbsan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Practica Con Formularios 
 
Me respondo a mi mismo, era un error de mi código:

Asi funciona bien:

' gambas class file

Public Sub _new()

End

Public Sub Form_Open()

    Dim prueba As New OriginalForm[3]

    prueba[0] = New OriginalForm
    prueba[0].Caption = "Formulario 1 copiado"

    prueba[0].Show

    prueba[1] = New OriginalForm

    prueba[1].x = 240
    prueba[1].y = 300
    prueba[1].Caption = "Formulario 2 copiado"

    prueba[1].Show

    prueba[2] = New OriginalForm

    prueba[2].x = 540
    prueba[2].y = 50
    prueba[2].Caption = "Formulario 3 copiado"

    prueba[2].Show

End
 


Asi, si se ven correctamente los 3 formularios (nota: esta hecho con gambas3.0)

Os dejo de nuevo el archivo de codigo fuente
capturadepantalla-110512-001314

  Enlace

formulariosCopia-0.0.2.tar.gz
Descripción:  
Descargar
Nombre del archivo: formulariosCopia-0.0.2.tar.gz
Tamaño: 4.92 KB
Descargado: 19 veces
formulariosCopia-0.0.2.tar.gz
Descripción:  
Descargar
Nombre del archivo: formulariosCopia-0.0.2.tar.gz
Tamaño: 4.92 KB
Descargado: 19 veces
formulariosCopia-0.0.2.tar.gz
Descripción:  
Descargar
Nombre del archivo: formulariosCopia-0.0.2.tar.gz
Tamaño: 4.92 KB
Descargado: 19 veces

 




===================
Blog personal
Web: SoloGambas seleccion de articulos dedicados a Gambas
Visita el Curso de Gambas3 ¡¡¡Gratuito!!!
 
última edición por jsbsan el Jueves, 10 May 2012, 23:17; editado 2 veces 
jsbsan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Practica Con Formularios 
 
Ninguno de los dos ejemplos hace una verdadera copia de un objeto, sino instancias de ese objeto (da igual si es un formulario, un array o lo que sea, un objeto al fin y al cabo). Nunca serán el mismo objeto, porque si lo fueran, las modificaciones hechas en uno afectarían igualmente a los demás.

En realidad, creo que en gambas no se puede hacer una copia real de un objeto, sino otro objeto que apunta hacia el objeto original... quizás Fabian nos pueda hacer alguna aclaración al respecto si lee esto.

Mientras, intentaré comprender mejor estos conceptos, más conocidos como Deep copy y Shallow copy.

Saludos
 




===================
Jesús Guardón

Por favor, usemos el corrector ortográfico antes de pulsar el botón "Enviar".

"uo ǝs ʇɐu pıɟıɔıן ɐdɹǝupǝɹ ɐ dɹoƃɹɐɯɐɹ, soןo ɥɐʎ bnǝ dɹodouǝɹsǝןo"
 
jguardon - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Practica Con Formularios 
 
Julio:

jsbsan escribió: 


Si pusieras:
Dim miformulario As Form
  miformulario = New FormCopia As "grupoformularios"
  miformulario=Fmain ' aqui realmente copia el formulario Fmain completo a miformlario
  miformulario.Caption = "Soy la copia " & x  ' modifica una propieadad en la copia
  aformularios.Add(miformulario) '<- esto no se para que sirve....¿?
  miformulario.Show 'este formulario si deberia de tener codigo
 




Se añade a un array de formularios para poder manipularlos.La idea del programa
es presentar los formularios en el escritorio.Que se pueda cerrar manualmente y los que quedan
abiertos se cierran al dar al botón cerrar.A pesar del todo, no acaba de estar bien.
Hasta convertí el array en una colección. Y es que es raro, como si no le diera tiempo
a cerrarse.El error puede ocurrir o no.

Por ejemplo.Cierro dos formularios manualmente, el 0 y el 3 y luego le doy a cerrar
del formulario principal. Objeto invalido.Se debería haber eliminado el formulario 3
del array, pues si ves el contenido de aformulario  sigue existiendo.Son errores extraños.

jsbsan escribió: 

Te dejo un codigo de ejemplo...donde si consigo hacer copias de un formulario con codigo....


Gracias Julio.
Me explique mal, quise decir copia, por que son idénticos, pero son objetos diferentes.  

Jesús:

Estoy de acuerdo, si fuera una copia afectaría a los otros.

Saludos.
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
última edición por Shell el Jueves, 10 May 2012, 23:38; editado 2 veces 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Practica Con Formularios 
 
Olvidaba comentar.

Como lo que realmente quería era cerrar los formularios que quedasen abiertos después de cerrar
algunos manualmente (que tiene sus problemas).

Encontré en la comunidad la manera de cerrar todos los formularios abiertos.
Es un método que no parece ir en Gambas3 pero si en Gambas2.  


PUBLIC SUB CerrarTodo()

DIM ventana AS Window

FOR EACH ventana IN Windows
  IF ventana.Title <> Application.MainWindow.Title THEN ventana.Close
NEXT
  
END
 


La manera de como cerré anteriormente los formularios, debería haber funcionado.

Saludos.
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Practica Con Formularios 
 
Esta es mas adecuada en Gambas3:

Public Sub btnCerrar_Click()
  Dim ventana As Window
  
  For Each ventana In Windows
    If ventana.Title <> Application.Title Then ventana.Close
  Next
    
End
 


Así al fin funciona el cierre de todo formulario abierto.

Saludos.
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Practica Con Formularios 
 
No lo he probado, pero si a cada nueva instancia de formulario le asignamos un Parent, al cerrar el formulario principal deberían destruirse con él las demás "ventanas" o formularios. Por lo menos, así es en otros lenguajes como PyQt4.

Saludos
 




===================
Jesús Guardón

Por favor, usemos el corrector ortográfico antes de pulsar el botón "Enviar".

"uo ǝs ʇɐu pıɟıɔıן ɐdɹǝupǝɹ ɐ dɹoƃɹɐɯɐɹ, soןo ɥɐʎ bnǝ dɹodouǝɹsǝןo"
 
jguardon - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Practica Con Formularios 
 
Hola!.

Estuve probando Object.Attach y encontré resultados diferentes si es Gambas2 o Gambas3.

Puede que no lo haya hecho correctamente.
El programa es un poco bruto. Bruto por que cerrando un formulario instanciado, si cierro uno,
cierra todos.De alguna manera cumple su cometido.

Lo cierto es que, en Gambas2 con normalidad, si cierras el formulario principal, se cerraban todos los demas.
En Gambas3 ha cambiado, recuerda mas a VB.

' gambas class file
PRIVATE hformularios AS NEW Object[]

PUBLIC SUB _new()

END

PUBLIC SUB Form_Open()
  DIM i AS Integer
  DIM formulario AS Object
  DIM alturatotal AS Integer
  
  ME.Center
  
  formulario = NEW FormInstancia
  formulario.show
  hformularios.Add(formulario)
  
  formulario = NEW FormInstancia
  formulario.show
  hformularios.Add(formulario)
  formulario.top = formulario.height + 52
  alturatotal = formulario.top + 26
  
  FOR i = 0 TO 2
    formulario = NEW FormInstancia
    formulario.show
    hformularios.Add(formulario)
    formulario.top = alturatotal + formulario.height
    alturatotal = formulario.top + 26  
  NEXT
    
  FOR i = 0 TO hformularios.Count - 1    
      hformularios[i].caption = "Formulario " & i    
      Object.Attach(hformularios[i], ME, "GrupoForms")
  NEXT

END


PUBLIC SUB GrupoForms_Close()  
  ME.Close  'Se van a cerrar todos los formularios...ooops!.
END
 


Se supone que los formularios instanciados, están atados al evento Close del principal.

Probar este código en Gambas2 y Gambas3.
En Gambas3 lo que hace es, cierra un formulario instanciado y cierra el principal.
Recuerda mas a la matriz de controles que solo afecta al seleccionado.

P.d: Cuando queremos saber el alto del formulario, no obtenemos realmente con Height, todo su tamaño.
No contamos con la barra de titulo.

Por ejemplo: (Que es solo un ejemplo. )
PRIVATE CONST ialtoplanta AS Integer = 26
PRIVATE CONST ianchoplanta AS Integer = 203
PRIVATE CONST ialtomuro AS Integer = 100
PRIVATE CONST ianchomuro AS Integer = 203

PUBLIC SUB Form_Open()
DIM etiqueta AS Label
DIM itotalaltura AS Integer
DIM x AS Integer

  etiqueta = NEW Label(ME)
  etiqueta = planta(etiqueta)
  etiqueta.Top = 0

  etiqueta = NEW Label(ME)
  etiqueta = muro(etiqueta)
  etiqueta.Top = etiqueta.Top + ialtoplanta
  itotalaltura = etiqueta.Top

'Comenzamos el bucle  
FOR x = 1 TO 3
  etiqueta = NEW Label(ME)
  etiqueta = planta(etiqueta)
  etiqueta.Top = itotalaltura + ialtomuro
  itotalaltura = etiqueta.Top
  
  etiqueta = NEW Label(ME)
  etiqueta = muro(etiqueta)
  etiqueta.Top = itotalaltura + ialtoplanta
  itotalaltura = etiqueta.Top  
NEXT

END

FUNCTION planta(etiqueta AS Label) AS Label
  WITH etiqueta  
    etiqueta.Height = ialtoplanta
    etiqueta.Width = ianchoplanta
    etiqueta.Border = Border.Plain
    etiqueta.Alignment = Align.Center
    etiqueta.Caption = "Planta"
  END WITH
  RETURN etiqueta  
END

FUNCTION muro(etiqueta AS Label) AS Label
  WITH etiqueta  
    etiqueta.Height = ialtomuro
    etiqueta.Width = ianchomuro
    etiqueta.Border = Border.Plain
    etiqueta.Alignment = Align.Center
    etiqueta.Caption = "Muro"
  END WITH
  RETURN etiqueta  
END
 



Saludos.
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Formularios ljma Aplicaciones/Fragmentos de Código 11 Jueves, 24 Febrero 2011, 23:43 Ver último mensaje
ljma
No hay nuevos mensajes Formularios LalaLalines General 4 Lunes, 24 Septiembre 2012, 22:07 Ver último mensaje
david
No hay nuevos mensajes Formularios Muchos Formularios Ideas De D... codificador General 5 Viernes, 07 Junio 2013, 07:22 Ver último mensaje
codificador
No hay nuevos mensajes Diseñar Formularios Shell General 6 Viernes, 21 Junio 2013, 23:51 Ver último mensaje
Shell
 

Publicar nuevo tema  Responder al tema  Página 1 de 1
 

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario



  

 

cron