|
Página 1 de 2
|
Función O Procedimiento Static, Tipo Static
Autor |
Mensaje |
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
Función O Procedimiento Static, Tipo Static
Hola Comunidad.
Viendo los ejemplos que trae gambas. Compruebo que programas como Terminal o Explorer no comienzan con:
Public Sub Form_Open()
En cambio usa:
STATIC PUBLIC SUB Main()
Me imagino el motivo.Si creáramos una nueva instancia del mismo formulario,este haría lo mismo y sucedería un error.
Es como si crease solo un formulario y fuera un valor fijo.
Ahora bien. Pregunto.Si añade STATIC así, ¿no se esta haciendo que las variables u objetos dentro de ese procedimiento
sean todas publicas ?.
A ver. Os pongo un ejemplo "casi" de Visual Basic.
Supongamos que tenemos tal que esto:
PUBLIC SUB Form_Open()
Comprobar
Comprobar
END
STATIC PUBLIC SUB Comprobar()
Dim articulo as String
'La siguiente variable solo se inicializa la primera vez
'que se llama a este procedimiento
'La primera vez que se inicializa este procedimiento.
'La siguiente linea muestra una variable vacía.
'Pero en las demás muestra su contenido
PRINT "Contenido de la variable Articulo: " & articulo
articulo = "mesa"
END
Pues no funciona como debiera.De acuerdo, la primera vez esta vacía, pero
la segunda vez que se llama debería contener articulo el valor "mesa", pues no
es así. La variable vuelve a inicializarse.
Es que visto de una manera, el ejemplo no tendría sentido si añado la variable como publica o privada al principio.
Saludos.
=================== Gambas Básico
"No es un bug, es una característica no documentada"
última edición por Shell el Miercoles, 08 Febrero 2012, 01:13; editado 1 vez
|
#1 Miercoles, 08 Febrero 2012, 01:10 |
|
|
fabianfv
Analista Programador
Registrado: Octobre 2009
Mensajes: 495
Edad: 50 Ubicación:
|
Re: Función O Procedimiento Static, Tipo Static
Hola Comunidad.
Viendo los ejemplos que trae gambas. Compruebo que programas como Terminal o Explorer no comienzan con:
Public Sub Form_Open()
En cambio usa:
STATIC PUBLIC SUB Main()
Me imagino el motivo. Si creáramos una nueva instancia del mismo formulario, este haría lo mismo y sucedería un error.
Es como si crease solo un formulario y fuera un valor fijo.
No Shell, lo que hace Static es que ese método pertenezca a la clase en lugar de pertenecer a un objeto (instancia) de esa clase. Es decir que todos los objetos de esa clase compartirán el mismo método Main. Esto sirve como punto de partida para el programa, es decir, es necesario para que la clase se pueda establecer como "clase de inicio".
Ahora bien, esto es un requisito de implementación de gambas, no proviene del paradigma de programación orientada a objetos.
Hola Comunidad.
Ahora bien. Pregunto.Si añade STATIC así, ¿no se esta haciendo que las variables u objetos dentro de ese procedimiento
sean todas publicas ?.
No. Lo que hace es que la variable o método sea común a todos los objetos de esa clase que se vayan a crear.
Hola Comunidad.
A ver. Os pongo un ejemplo "casi" de Visual Basic.
Supongamos que tenemos tal que esto:
PUBLIC SUB Form_Open()
Comprobar
Comprobar
END
STATIC PUBLIC SUB Comprobar()
Dim articulo as String
'La siguiente variable solo se inicializa la primera vez
'que se llama a este procedimiento
'La primera vez que se inicializa este procedimiento.
'La siguiente linea muestra una variable vacía.
'Pero en las demás muestra su contenido
PRINT "Contenido de la variable Articulo: " & articulo
articulo = "mesa"
END
Pues no funciona como debiera.De acuerdo, la primera vez esta vacía, pero
la segunda vez que se llama debería contener articulo el valor "mesa", pues no
es así. La variable vuelve a inicializarse.
Es que visto de una manera, el ejemplo no tendría sentido si añado la variable como publica o privada al principio.
Pero el problema es que la variable articulo es una variable local, pertenece exclusivamente al método Comprobar, ese es un ámbito de existencia, fuera de él esa variable no existe.
Así que sucede siempre lo mismo:
1) Llamas a Comprobar, se crea la variable articulo, se muestra su contenido (cadena vacía), se le asigna la cadena "mesa" y luego termina el método Comprobar por lo que la variable articulo se destruye.
Luego, en la segunda llamada sucede exactamente lo mismo que en 1).
Saludos.
=================== Cómo programar con Gambas
Speed Books: informática libre.
|
#2 Miercoles, 08 Febrero 2012, 15:11 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
Re: Función O Procedimiento Static, Tipo Static
Hola Fabian.
Citar:
No Shell, lo que hace Static es que ese método pertenezca a la clase en lugar de pertenecer a un objeto (instancia) de esa clase.
Es decir que todos los objetos de esa clase compartirán el mismo método Main.
Esto sirve como punto de partida para el programa, es decir, es necesario para que la clase se pueda establecer como "clase de inicio".
Pues si que es curioso como lo hace.
Al hacer New FConsole salta al constructor y luego vuelve al inicio.
Citar:
Pero el problema es que la variable articulo es una variable local, pertenece exclusivamente al método Comprobar, ese es un ámbito de existencia, fuera de él esa variable no existe.
Así que sucede siempre lo mismo:
1) Llamas a Comprobar, se crea la variable articulo, se muestra su contenido (cadena vacía), se le asigna la cadena "mesa" y luego termina el método Comprobar por lo que la variable articulo se destruye.
Luego, en la segunda llamada sucede exactamente lo mismo que en 1).
Vi que era local, solo que con Static imagine que la cambiaba.
Lo cierto es que en VB funciona de otra manera.
Y la ventana de inmediato mostraba esto:
Quizás errónea la manera en como lo hace.
Saludos.
=================== Gambas Básico
"No es un bug, es una característica no documentada"
|
#3 Jueves, 09 Febrero 2012, 00:47 |
|
|
fabianfv
Analista Programador
Registrado: Octobre 2009
Mensajes: 495
Edad: 50 Ubicación:
|
Re: Función O Procedimiento Static, Tipo Static
Pues si que es curioso como lo hace.
Al hacer New FConsole salta al constructor y luego vuelve al inicio.
Humm. ¿Ese código pertence a la clase del formulario FConsole?
Que salte al constructor es lo que debe ser, pero no interpreto que significa exactamente que "vuelve al inicio", si me lo aclaras podré responderte con precisión.
Vi que era local, solo que con Static imagine que la cambiaba.
Lo cierto es que en VB funciona de otra manera.
Y la ventana de inmediato mostraba esto:
Quizás errónea la manera en como lo hace.
La cuestión es que la palabra clave Static en VB6 tiene otro significado. Si mal no recuerdo, hace que la variable local sea persistente al finalizar la rutina donde fue declarada o visto de otro modo, te permite declarar una variable de un ámbito más amplio (de clase o de módulo) dentro de un sub.
En VB6 Static aplicada a un sub lo que hace es que todas sus variables locales sean persistentes.
Saludos.
=================== Cómo programar con Gambas
Speed Books: informática libre.
|
#4 Jueves, 09 Febrero 2012, 15:05 |
|
|
gara_pm
Usuario
Registrado: Octobre 2011
Mensajes: 29
Edad: 38 Ubicación:
|
Re: Función O Procedimiento Static, Tipo Static
Fabian por ejemplo si aplicara static a ese método en alguna clase estaria creando una clase singleton.
|
#5 Viernes, 10 Febrero 2012, 02:38 |
|
|
fabianfv
Analista Programador
Registrado: Octobre 2009
Mensajes: 495
Edad: 50 Ubicación:
|
Re: Función O Procedimiento Static, Tipo Static
Fabian por ejemplo si aplicara static a ese método en alguna clase estaria creando una clase singleton.
Nop. Si haces eso en gambas estarías creando un método de clase y si lo haces con una variable estarías creando una variable de clase, es decir, elementos que son compartidos por todas las instancias de esa clase.
Tanto métodos como variables de clase generalmente se acceden mediante el nombre de la clase (siempre que sean públicos por supuesto). Los métodos de clase no pueden contener referencias a ningún otro elemento (método, variable, propiedad) que pertenezca a una instancia de esa clase.
Es decir, los métodos de clase sólo tienen acceso a elementos de la clase, no de las instancias. En cambio, los métodos de instancia (los que en su declaración no fueron precedidos con STATIC, pueden acceder a tanto a elementos de instancia como de clase.
En la terminología de Gambas:
Static (estático) = Clase
Aunsencia de Static (dinámico) = Instancia
Para implementar el patrón singleton tienes que usar:
al principio de la clase, para asegurar que se crea automáticamente una instancia de esa clase la primera vez que se referencia uno de sus elementos.
Además, tienes que controlar en el constructor que no se vayan a crear instancias adicionales (usando la clase Object).
Al implementar el patrón Singleton con CREATE STATIC hay que considerar que ese objeto se transforma en un objeto Global, es decir, que es visible y accesible desde cualquier otro objeto, clase o módulo, y que no es necesario que los objetos que lo usen contengan una variable de referencia a ese objeto. Además, es más difícil controlar el momento en que se crea el objeto, porque ello sucede automáticamente al acceder por primera vez a uno de sus atributos, propiedades o métodos.
Para evitar el uso de CREATE STATIC hay que anular el constructor y crear un método que devuelva siempre la única instancia. Pero por ahora este camino no es viable (parece haber algún bug).
Saludos.
=================== Cómo programar con Gambas
Speed Books: informática libre.
última edición por fabianfv el Viernes, 10 Febrero 2012, 03:23; editado 1 vez
|
#6 Viernes, 10 Febrero 2012, 03:23 |
|
|
gara_pm
Usuario
Registrado: Octobre 2011
Mensajes: 29
Edad: 38 Ubicación:
|
Re: Función O Procedimiento Static, Tipo Static
Gracias por la información, Fabian.
|
#7 Viernes, 10 Febrero 2012, 04:58 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
Re: Función O Procedimiento Static, Tipo Static
Hola Fabian.
Shell escribió:
Al hacer New FConsole salta al constructor y luego vuelve al inicio.
"fabianfv escribió:
Humm. ¿Ese código pertence a la clase del formulario FConsole?
Que salte al constructor es lo que debe ser, pero no interpreto que significa exactamente que "vuelve al inicio", si me lo aclaras podré responderte con precisión.
Si, pertenece al formulario FConsole.
Si continuas el programa paso a paso.Una vez que hace esto:
hForm = NEW FConsole
Ejecuta el constructor y vuelve a donde se había quedado, la siguiente instrucción después de llamar al constructor desde el procedimiento de inicio.
Mostrando el formulario con el foco en la caja de texto.
Yo lo hice de otra manera, quería tener varias instancias de la clase formulario donde se introducían los comandos.
Me valió solo para hacer comandos simples y sin tuberías "|". Cuestión de mejorarlo, aprendiendo del ejemplo de gambas.
Formulario principal:
Y el formulario plantilla.
Con el tipo de fuente por defecto tuve problemas en el textarea, no salia como en una consola.
El tipo adecuado de letra adecuada era monospace.La presentación de los textos en columnas fue perfecta.
Saludos.
=================== Gambas Básico
"No es un bug, es una característica no documentada"
|
#8 Viernes, 10 Febrero 2012, 09:54 |
|
|
fabianfv
Analista Programador
Registrado: Octobre 2009
Mensajes: 495
Edad: 50 Ubicación:
|
Re: Función O Procedimiento Static, Tipo Static
Si, pertenece al formulario FConsole.
Si continuas el programa paso a paso.Una vez que hace esto:
hForm = NEW FConsole
Ejecuta el constructor y vuelve a donde se había quedado, la siguiente instrucción después de llamar al constructor desde el procedimiento de inicio.
Mostrando el formulario con el foco en la caja de texto.
Bueno, es el funcionamiento normal para ese código. No hay nada raro en el funcionamiento, lo raro es hacerlo de ese modo en gambas.
El único problema se daría si fuera de la clase FConsole necesitaras referenciar al formulario, porque te verías obligado a hacerlo mediante el nombre de la Clase y como resultado habría dos instancias de FConsole en ejecución.
Esto es así porque la clase Form utiliza la cláusula CREATE STATIC, por lo que gambas crea automáticamente una instancia de cualquier formulario la primera vez que se accede a alguno de sus elementos (controles, métodos, propiedades, variables) y por ello es que en gambas se puede referenciar a cualquier formulario por el nombre de su clase (ej. FConsole.txtCommand). Pero no se trata de ninguna variante del patrón Singleton porque Form no limita de ninguna manera la cantidad de instancias que es posible crear.
El método estático Main es totalmente innecesario en un formulario ya que (es el único caso) pueden establecerse como clase de inicio sin él. Además, es obvio que crear una instancia del formulario desde el mismo formulario es algo totalmente innecesario en gambas.
Yo lo hice de otra manera, quería tener varias instancias de la clase formulario donde se introducían los comandos.
Me valió solo para hacer comandos simples y sin tuberías "|". Cuestión de mejorarlo, aprendiendo del ejemplo de gambas.
Formulario principal:
Si analizas el código anterior, tal vez te encuentres que funciona pero no sabes por qué.
Te dejo esta pregunta para que lo pienses:
- Dado que la variable miform es local, cuando finaliza la ejecución del manejador del evento Click, la referencia a FormPlantilla se pierde y cuando esto ocurre no quedan referencias a FormPlantilla por lo que gambas debería eliminar ese objeto. Es decir, que el código anterior no debería funcionar... pero funciona ¿por qué?
[code linenumbers=false syntax= gambas]
Y el formulario plantilla.
PUBLIC SUB Form_Open()
ME.Caption = "Muestra salida de comando"
txtSalida.Background = Color.Black 'Cambia el color del fondo
txtSalida.Foreground = Color.White 'Cambia el color de la letra
txtSalida.Refresh
txtOrden.SetFocus()
END
...
Ok. Así es como se debe hacer en gambas. Aunque el código que pusiste en Form_Open, podrías ponerlo también en el constructor. Usar Form_Open es más del estilo VB6.
En gambas el evento Form_Open está para ser usado cuando realmente sea necesario, es decir, cuando quieres hacer algo al momento de abrirse el formulario, pero no antes (el constructor se ejecuta antes que el manejador del evento Form_Open).
Además, la llamada al método txtSalida.Refresh me parece que es innecesaria.
Saludos.
=================== Cómo programar con Gambas
Speed Books: informática libre.
|
#9 Viernes, 10 Febrero 2012, 14:37 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
Re: Función O Procedimiento Static, Tipo Static
Hola Fabian.
Tengo que responder a tu pregunta.
He estado haciendo nuevas pruebas y encontré varios casos y comportamientos del formulario que se instancia.
Siempre hay una sola instancia del formulario
Siempre hay una sola instancia del formulario
Crea nuevas instancias del formulario
Hubo un efecto curioso en uno de los ejemplos en la barra de aplicaciones en ejecución, parpadeaba la del formulario principal!.(Se quedaba pillado por instantes el principal).
Saludos.
=================== Gambas Básico
"No es un bug, es una característica no documentada"
|
#10 Sabado, 11 Febrero 2012, 12:20 |
|
|
|
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
|
|
|
|
|