Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 2
Ir a la página 1, 2  Siguiente
 
Formularios
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje 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.


PUBLIC SUB abre_Click()
  Form1.inicia("pepe") 'Esto funciona
  prueba(Form1)         'Esto no funciona
END

PRIVATE FUNCTION prueba(pantalla AS Form)
  pantalla.inicia("pepe")
END

 



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 
ljma - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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!
 



 
razaAztk - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuarioVer la galería personal del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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

PUBLIC SUB Form_Open()

mimodulo.inicia(ME)

 



Suerte
 



 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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:

PUBLIC SUB abrir(nombreform AS String, OPTIONAL aparam AS Variant , OPTIONAL bModal as Boolean) 'nombreform=nombre del formulario, aparam (array de parámetros )

  DIM f AS form
 
  f = NEW (nombreform)
  IF aparam THEN f.tag = aparam
     if bmodal then
          f.showmodal
     else
          f.Show
     endif
  ENDIF
  
END
 


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:

PRIVATE clave as variant

PUBLIC SUB Form_Open()

   if me.tag then
       clave=me.tag[0]
       me.Text=me.tag[1]
  endif

END
 


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:
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Formularios 
 
ljma escribió: [Ver mensaje]


PUBLIC SUB abre_Click()
  Form1.inicia("pepe") 'Esto funciona
  prueba(Form1)         'Esto no funciona
END

PRIVATE FUNCTION prueba(pantalla AS Form)
  pantalla.inicia("pepe")
END
 



Deberías cambiar el tipo del parámetro pantalla por Form1, así:

PUBLIC SUB abre_Click()
  prueba(Form1)
END

PRIVATE FUNCTION prueba(pantalla AS Form1)
  pantalla.inicia("pepe")
END
 

 




===================
Cómo programar con Gambas

Speed Books: informática libre.
 
fabianfv - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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:

PUBLIC SUB abrir(nombreform AS String, OPTIONAL aparam AS Variant , OPTIONAL bModal as Boolean)

 DIM f AS form

 f = NEW (nombreform)
 IF aparam THEN f.coco= aparam
    if bmodal then
         f.showmodal
    else
         f.Show
    endif
 ENDIF
 
END


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:


public pantalla as Form

PUBLIC SUB abre_Click()
 prueba(Form1)
END

PRIVATE FUNCTION prueba(pantalla AS pantalla)
 pantalla.inicia("pepe")
END
 




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 
ljma - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Formularios 
 
Lo que yo te he propuesto es exactamente lo que pides

IF aparam THEN f.coco= aparam
 


Es exactamente lo que yo hago cuando pongo

if aparam then f.Tag = aparam
 


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


PUBLIC SUB Form_Open()

  if me.tag then
      coco(me.tag[0])
 endif

END

public function coco(mivalor)

...
...

return

 


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
 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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 
ljma - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Formularios 
 
ljma escribió: [Ver mensaje]

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:

PUBLIC SUB suma(a AS Integer, b AS Integer) AS Integer
  RETURN a + b
END

...

suma(3, 5) 'equivale a 3 + 5

...

suma(7, 11) 'equivale a 7 + 11
 

 




===================
Cómo programar con Gambas

Speed Books: informática libre.
 
fabianfv - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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


 clase

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 
ljma - 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 Coleccion Formularios pikas Controles/Librerías/Componentes 10 Lunes, 25 Enero 2010, 23:39 Ver último mensaje
pikas
No hay nuevos mensajes Formularios MDI En Gambas anahaga General 3 Domingo, 30 May 2010, 21:20 Ver último mensaje
anahaga
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
 

Publicar nuevo tema  Responder al tema  Página 1 de 2
Ir a la página 1, 2  Siguiente

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