|
Página 1 de 2
|
Autor |
Mensaje |
ljma
Programador
Registrado: Enero 2010
Mensajes: 106
Edad: 54 Ubicación:
|
Formularios
Hola,
Intento crear una clase genérica que sea capaz de abrir diferentes formularios desde una función, según interese, pero no veo el error. En el ejemplo se ve mejor lo que intento (es un ejemplo tonto): al pulsar "abre" se ejecuta la función "inicia" de Form1 pero la segunda línea de error porque no encuentra la función "inicia" en Form1.
Pasa lo mismo con variables públicas creadas en Form1 (ejemplo coco = variable pública de Form1 )
Form1.coco="lo que sea" 'funciona bien
PRIVATE FUNCTION prueba(pantalla AS Form)
pantalla.coco="lo que sea" 'Esto no funciona
END
Gracias anticipadas
Saludos
última edición por ljma el Miercoles, 23 Febrero 2011, 00:45; editado 1 vez
|
#1 Miercoles, 23 Febrero 2011, 00:43 |
|
|
razaAztk
aztk crux
Analista Programador
Registrado: Enero 2010
Mensajes: 340
Edad: 35 Ubicación: Tenochtitlan
|
Re: Formularios
............. no es que sepa mucho......... pero no entiendo muy bien que es lo que quieres hacer.
Para mostrar formularios existen los metodos Show y ShowModal.
Y para ejecutar código al iniciarse una ventana está el evento _Open().
Si quieres llamar una función de otro form, supongo tienes que declararla PUBLIC, e "invocarla" con Show()
DIM F AS NEW FAbout(ME.X + ME.W / 2, ME.Y + ME.H / 2)
F.Show()
F.FuncionXXX(args)
Saludos!
|
#2 Miercoles, 23 Febrero 2011, 05:39 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: Formularios
Coloca la función inicia en un módulo independiente, donde será accesible desde cualquier parte de la aplicación. Luego llámala desde donde quieras pasándole como referencia el formulario que llama o cualquier otro.
En el módulo:
PUBLIC SUB inicia(miform as Form)
miform.Text="Hola soy iniciado" 'le cambiamos el título, por ejemplo
..... bla
......bla
......bla
RETURN
Desde cualquier parte sería:
DIM f as new miformulario
mimodulo.inicia(f)
O símplemente
Suerte
|
#3 Miercoles, 23 Febrero 2011, 07:10 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: Formularios
Perdón, releyendo la pregunta creo que mi respuesta no es la correcta. Lo que tú quieres es esto:
En tu módulo:
Ahora supón que tienes un listbox con los registros de una tabla y quieres que con un click se te abra el formulario detalle con un título concreto en modo modal
PUBLIC SUB listBox1.Click()
dim aParam as variant[]
aParam.Add(listbox1.Text)
aParam.Add("Título del Formulario")
mimodulo.abrir("formudetalle",aParam,TRUE)
END
En el formulario en cuestión:
Puedes crear una clase independiente que alimente el tag con propiedades para evitar la sintaxis de me.tag[0] etc, que es muy fea y cosas así, pero en esencia funciona.
Suerte
=================== No podemos regresar
última edición por shordi el Miercoles, 23 Febrero 2011, 07:36; editado 5 veces
Editado por Invitado, Jueves, 01 Enero 1970, 01:00:
|
#4 Miercoles, 23 Febrero 2011, 07:29 |
|
|
fabianfv
Analista Programador
Registrado: Octobre 2009
Mensajes: 495
Edad: 50 Ubicación:
|
Re: Formularios
Deberías cambiar el tipo del parámetro pantalla por Form1, así:
=================== Cómo programar con Gambas
Speed Books: informática libre.
|
#5 Miercoles, 23 Febrero 2011, 08:34 |
|
|
ljma
Programador
Registrado: Enero 2010
Mensajes: 106
Edad: 54 Ubicación:
|
Re: Formularios
Hola,
Gracias a todos por vuestras respuestas.
shordi:
Correcto, eso es lo que quiero en parte. Ahora intenta cambiar "f.tag = aparam" por una variable pública (o una función pública), previamente declarada, en el formulario final, por ejemplo "coco"
lo que sería:
No funciona, o mejor dicho no me funciona.
fabianfv:
Tal y como tu lo has hecho funciona perfectamente y ya se ven los "añadidos" del Form. Problema: esa función solo vale para abrir el Form1; si queremos abrir el Form2 ya no podemos. El objetivo es crear una clase que pueda abrir diferentes formularios.
Aunque se que está mal lo pongo para intentar explicarme:
Si no se puede tendré que tirar del socorrido tag tal y como apunta shordi.
Gracias otra vez.
Saludos
última edición por ljma el Miercoles, 23 Febrero 2011, 14:19; editado 1 vez
|
#6 Miercoles, 23 Febrero 2011, 14:15 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: Formularios
Lo que yo te he propuesto es exactamente lo que pides
Es exactamente lo que yo hago cuando pongo
Es decir una propiedad pública, en este caso Tag es modificada desde el formularo inicial.
luego en el formulario final tratas ese valor como te de la gana
Esto es lo correcto, porque accedes al "interior" del objeto creado a traves del Tag, que para eso está. Si no te gusta, siempre puedes entrar en el menú Proyecto->propiedades->opciones y poner a SI aquello de que los controles y símbolos de los formularios sean públicos... aunque no siempre eso es deseable. De hecho creo que no te funciona lo que dices porque no tienes eso puesto a Sí ya que el criterio por defecto, muy sensato por cierto, es No.
Suerte.
=================== No podemos regresar
|
#7 Miercoles, 23 Febrero 2011, 17:39 |
|
|
ljma
Programador
Registrado: Enero 2010
Mensajes: 106
Edad: 54 Ubicación:
|
Re: Formularios
Hola shordi,
Mi versión de gambas es la 2.19 y te aseguro que no me funciona. ¿Lo has probado tu?
Las opciones que me aparecen en Proyecto->propiedades->opciones son:
símbolos en módulos son públicos por defecto
Los controles de Formularios son públicos
¿Te refieres a esto? Yo no pretendo que los controles sean públicos, y que los módulos sean públicos o privados por defecto no me afecta. Mi intención original era utilizar variables públicas y una función pública para inicializar la clase (que es un formulario) de una forma personalizada. El resto de variables, funciones, procedimientos y controles son privados (además de las propiedades públicas de todo formulario).
Muchas gracias por tu ayuda.
Saludos
última edición por ljma el Miercoles, 23 Febrero 2011, 23:41; editado 1 vez
|
#8 Miercoles, 23 Febrero 2011, 23:38 |
|
|
fabianfv
Analista Programador
Registrado: Octobre 2009
Mensajes: 495
Edad: 50 Ubicación:
|
Re: Formularios
fabianfv:
Tal y como tu lo has hecho funciona perfectamente y ya se ven los "añadidos" del Form. Problema: esa función solo vale para abrir el Form1; si queremos abrir el Form2 ya no podemos. El objetivo es crear una clase que pueda abrir diferentes formularios.
Esa función vale para abrir todos los Form1 que quieras crear, no tan sólo para un única instancia.
Pero vale, entiendo que quieres abrir diferentes formularios mediante esa función. Ahora bien, ¿cuál es realmente la necesidad que intentas cubrir? Me explico: si todo lo que la función hará es abrir formularios estarías haciendo algo que no tiene utilidad porque de todos modos necesitas especificar en el código el nombre del formulario en la llamada a la función.
Ejemplo:
'Esto no funciona, pero supongamos que sí lo hace
PUBLIC FUNCTION abrirFormulario(pantalla AS Form)
pantalla.inicia("pepe")
END
...
abrirFormulario(Form1) ' equivale a Form1.inicia("pepe")
...
abrirFormulario(Form2) ' equivale a Form2.inicia("pepe")
...
abrirFormulario(FormN) ' equivale a FormN.inicia("pepe")
Como ves, podrías reemplazar cada llamada a la función "abrirFormulario" por la llamada a la función inicia de cada tipo de formulario "FormX.inicia("pepe"), entonces no hay ninguna ganancia en escribir y usar esa función.
Es como si pensaras en hacer una función que suma dos números enteros:
=================== Cómo programar con Gambas
Speed Books: informática libre.
|
#9 Jueves, 24 Febrero 2011, 05:44 |
|
|
ljma
Programador
Registrado: Enero 2010
Mensajes: 106
Edad: 54 Ubicación:
|
Re: Formularios
Hola fabianfv,
Tienes razón en eso. La cupla es mía por intentar simplificar el problema y al final no se entiende.
Estoy haciendo una clase que me cree un formulario para manejar tablas de una forma muy simple.
PUBLIC SUB iva_Click()
DIM iva AS NEW tabla
iva.icono = Application.Path & "/img/tux_currito.png"
iva.titulo = "Lo que me da la gana"
iva.formulario_hijo = "Fiva"
iva.titulos_columnas = ["", "Cod.", "Tipo IVA", "Rec. equiv.", "Descripción"]
iva.ancho_columnas = [0, 90, 90, 90, 150]
iva.campos_columnas = ["id_iva", "codigo", "iva", "recargo", "descripcion"]
iva.query = 1
iva.visualiza()
END
El formulario hijo siempre es distinto (por ahora, porquue quiero hacer otra clase genérica que genere, si no está creado, el form a partir de un xml ) y se abre en modo alta, en modo edición, en modo lectura según el icono pulsado.
Espero haberme explicado un poco mejor.
Saludos
última edición por ljma el Jueves, 24 Febrero 2011, 09:13; editado 1 vez
|
#10 Jueves, 24 Febrero 2011, 09:12 |
|
|
|
Temas parecidos
Temas parecidos
|
Página 1 de 2
|
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
|
|
|
|
|