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
 
Función O Procedimiento Static, Tipo Static
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje 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 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Función O Procedimiento Static, Tipo Static 
 
Shell escribió: [Ver mensaje]
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.

Shell escribió: [Ver mensaje]
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.

Shell escribió: [Ver mensaje]
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.
 
fabianfv - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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.

PRIVATE $hProcess AS Process
PRIVATE $sText AS String

STATIC PUBLIC SUB Main()

  DIM hForm AS Form

  hForm = NEW FConsole
  hForm.Show

END


PUBLIC SUB _new()

  $hProcess = EXEC ["bash", "--noediting"] FOR READ WRITE
  txtCommand.SetFocus

END
 


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.

 ejemplocodigo

Y la ventana de inmediato mostraba esto:

 inmediato

Quizás errónea la manera en como lo hace.

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: Función O Procedimiento Static, Tipo Static 
 
Shell escribió: [Ver mensaje]

Pues si que es curioso como lo hace.

PRIVATE $hProcess AS Process
PRIVATE $sText AS String

STATIC PUBLIC SUB Main()
  DIM hForm AS Form

  hForm = NEW FConsole
  hForm.Show
END

PUBLIC SUB _new()
  $hProcess = EXEC ["bash", "--noediting"] FOR READ WRITE
  txtCommand.SetFocus
END
 


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.

Shell escribió: [Ver mensaje]

Vi que era local, solo que con Static imagine que la cambiaba.
Lo cierto es que en VB funciona de otra manera.

 ejemplocodigo

Y la ventana de inmediato mostraba esto:

 inmediato

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



 
gara_pm - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Función O Procedimiento Static, Tipo Static 
 
gara_pm escribió: [Ver mensaje]
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).

Public Sub _new()
  if Object.Count(ME) > 1 then Error.Raise("No se permite más de una instancia")
End
 


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 
fabianfv - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Función O Procedimiento Static, Tipo Static 
 
Gracias por la información, Fabian.
 



 
gara_pm - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Función O Procedimiento Static, Tipo Static 
 
Hola Fabian.

Shell escribió: 


PRIVATE $hProcess AS Process
PRIVATE $sText AS String

STATIC PUBLIC SUB Main()
  DIM hForm AS Form

  hForm = NEW FConsole
  hForm.Show
END

PUBLIC SUB _new()
  $hProcess = EXEC ["bash", "--noediting"] FOR READ WRITE
  txtCommand.SetFocus
END
 


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:

PUBLIC SUB btnCrear_Click()
 DIM miform AS Form
 
 miform = NEW FormPlantilla
 
 miform.Show()  

END
 


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

PUBLIC SUB txtOrden_KeyPress()
DIM acadenas AS NEW String[]
DIM cadena AS String

IF Key.code = Key.enter OR Key.Code = Key.Return THEN
    txtSalida.Text = ""
  IF txtOrden.Text = "" THEN
    Message("No hay ninguna orden")
    RETURN
  ELSE    
    acadenas = Split(txtOrden.Text, " ")
    EXEC acadenas TO txtSalida.Text
  ENDIF
ENDIF
 
END
 


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"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Función O Procedimiento Static, Tipo Static 
 
Shell escribió: [Ver mensaje]

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.

Shell escribió: [Ver mensaje]

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:

PUBLIC SUB btnCrear_Click()
 DIM miform AS Form
 
 miform = NEW FormPlantilla
 
 miform.Show()  

END
 


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é?

Shell escribió: [Ver mensaje]

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


PUBLIC SUB btnCrear_Click()
 DIM miform AS Form
  
 miform = FormPlantilla
 
 miform.Show()

END
 

Siempre hay una sola instancia del formulario

PUBLIC SUB btnCrear_Click()
 DIM miform AS NEW Form
  
 miform = FormPlantilla
 
 miform.Show()

END
 

Siempre hay una sola instancia del formulario

PUBLIC SUB btnCrear_Click()
 DIM miform AS Form
  
 miform = NEW FormPlantilla
 
 miform.Show()

END
 


Crea nuevas instancias del formulario

PRIVATE miform AS Form

PUBLIC SUB btnCrear_Click()
  
 miform = NEW FormPlantilla
 miform.Show()

END
 


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"
 
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 Jugando Con Static Shell General 4 Lunes, 20 May 2013, 03:57 Ver último mensaje
sebikul
No hay nuevos mensajes Sintaxis En Un Procedimiento O Función. Shell General 3 Domingo, 20 Abril 2014, 09:37 Ver último mensaje
Shell
No hay nuevos mensajes Cual Es La Diferencia Entre Public Y Stati... v3ctor General 1 Lunes, 13 Abril 2015, 10:57 Ver último mensaje
jsbsan
No hay nuevos mensajes Static? Que Significa (mas Explicito) En V... mckaygerhard General 2 Lunes, 19 Junio 2017, 20:44 Ver último mensaje
mckaygerhard
 

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