|
Página 1 de 1
|
Autor |
Mensaje |
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
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:
Código del formulario principal:
¿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"
|
#1 Jueves, 10 May 2012, 12:50 |
|
|
jsbsan
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4175
Edad: 51 Ubicación: dos hermanas, sevilla
|
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...)
Descripción: |
|
Descargar |
Nombre del archivo: |
formulariosCopia-0.0.1.tar.gz |
Tamaño: |
4.88 KB |
Descargado: |
17 veces |
Descripción: |
|
Descargar |
Nombre del archivo: |
formulariosCopia-0.0.1.tar.gz |
Tamaño: |
4.88 KB |
Descargado: |
17 veces |
Descripción: |
|
Descargar |
Nombre del archivo: |
formulariosCopia-0.0.1.tar.gz |
Tamaño: |
4.88 KB |
Descargado: |
17 veces |
última edición por jsbsan el Jueves, 10 May 2012, 23:10; editado 4 veces
|
#2 Jueves, 10 May 2012, 22:48 |
|
|
jsbsan
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4175
Edad: 51 Ubicación: dos hermanas, sevilla
|
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
Enlace
Descripción: |
|
Descargar |
Nombre del archivo: |
formulariosCopia-0.0.2.tar.gz |
Tamaño: |
4.92 KB |
Descargado: |
19 veces |
Descripción: |
|
Descargar |
Nombre del archivo: |
formulariosCopia-0.0.2.tar.gz |
Tamaño: |
4.92 KB |
Descargado: |
19 veces |
Descripción: |
|
Descargar |
Nombre del archivo: |
formulariosCopia-0.0.2.tar.gz |
Tamaño: |
4.92 KB |
Descargado: |
19 veces |
última edición por jsbsan el Jueves, 10 May 2012, 23:17; editado 2 veces
|
#3 Jueves, 10 May 2012, 23:09 |
|
|
jguardon
Administrador
Registrado: Septiembre 2009
Mensajes: 2708
Edad: 57 Ubicación: Granada
|
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"
|
#4 Jueves, 10 May 2012, 23:18 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
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
|
#5 Jueves, 10 May 2012, 23:33 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
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.
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"
|
#6 Jueves, 10 May 2012, 23:57 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
Re: Practica Con Formularios
Esta es mas adecuada en Gambas3:
Así al fin funciona el cierre de todo formulario abierto.
Saludos.
=================== Gambas Básico
"No es un bug, es una característica no documentada"
|
#7 Viernes, 11 May 2012, 10:00 |
|
|
jguardon
Administrador
Registrado: Septiembre 2009
Mensajes: 2708
Edad: 57 Ubicación: Granada
|
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"
|
#8 Viernes, 11 May 2012, 10:17 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
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. )
Saludos.
=================== Gambas Básico
"No es un bug, es una característica no documentada"
|
#9 Domingo, 13 May 2012, 08:38 |
|
|
|
Temas parecidos
Temas parecidos
|
Página 1 de 1
|
Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado Usuarios registrados conectados: Ninguno
|
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
|
|
|
|
|