Portal    Foro    Buscar    FAQ    Registrarse    Conectarse

Guardar La Posicion De Todos Los Formularios Abiertos

Guardar La Posicion De Todos Los Formularios Abiertos
Artículo
Responder citando    Descargar mensaje  
Mensaje Guardar La Posicion De Todos Los Formularios Abiertos 
 
Tengo una aplicación (xlince) que abre muchos formularios, necesitaria tener una subrutina que recorriera todos los formularios abiertos y guardara la posicion X,Y,y anchos y largo de cada formulario...

¿como puedo recorrer todos los formularios que tengo abiertos, que apriori no se cuantos pueden ser, ya que depende del usuario...?

Gracias...



 
jsbsan - Ver perfil del usuario Enviar mensaje privado  
jsbsan [ Lunes, 13 Diciembre 2010, 20:02 ]
 


Guardar La Posicion De Todos Los Formularios Abiertos
Comentarios
Responder citando    Descargar mensaje  
Mensaje Re: Guardar La Posicion De Todos Los Formularios Abiertos 
 
Hola

Esto habría que probarlo, pero yo creo que si en el _new incrementas una variable estática con ver el valor de esa variable en cualquiera de tus formularios valdría.

Las variables estáticas son vistas en todas las instancias de una clase, así que si cada vez que instancias una incrementas y cada vez que cierras una decrementas en esa variale tendrás el número de instancias abiertas.

static private variable as integer
public sub _new()
inc variable
end

private sub _free()
dec variable
end


Para conocer ese valor desde el exterior podrías tener una propiedad de solo lectura que devolviera ese dato
property read Num_instancias as integer

public function Num_Instancias_read() as integer
return variable
end


Un saludo



 
última edición por soplo el Lunes, 13 Diciembre 2010, 20:17; editado 3 veces 
soplo - Ver perfil del usuario Enviar mensaje privado  
soplo [ Lunes, 13 Diciembre 2010, 20:13 ]
Responder citando    Descargar mensaje  
Mensaje Re: Guardar La Posicion De Todos Los Formularios Abiertos 
 
Yo crearía dos arrays en un módulo (accesibles a toda la aplicación), uno con el nombre de los formularios y otro con la referencia del formulario en sí mismo y añadiría un elemento a cada uno con cada formulario.

'en un módulo llamado mimodulo
public aNombreForms as new string[]
public aForms as new Form[]
 


Y luego en cada formulario
public sub Form_new()

 mimodulo.aNombreForms.Add(ME.Name)
 mimodulo.aForms.Add(ME)

end

public sub form_Close()

 mimodulo.aNombreForms.delete(me.name)
 mimodulo.aForms.delete(ME)

end
 

Para conocer el estado de x e y de cada uno sólo tienes que consultar

DIM n,pos_X,pos_Y as Integer
'posicion x e y del formulario llamado miformulario
n=mimodulo.aNombreForms.find["miFormulario"]
if n then
   pos_X=mimodulo.aForms[n].X
   pos_Y=mimodulo.aForms[n].Y
end if
 


Seria más elegante con un array de dos dimensiones... pero como que la idea se entiende ¿no?

Suerte



 
shordi - Ver perfil del usuario Enviar mensaje privado  
shordi [ Lunes, 13 Diciembre 2010, 21:28 ]
Responder citando    Descargar mensaje  
Mensaje Re: Guardar La Posicion De Todos Los Formularios Abiertos 
 
Yo creo que basta con usar la clase Settings.

En el evento Form_Close() de cada formulario, guardas su posición y tamaño y en el Form_Open() de cada uno, lo vuelves a cargar.

' al cerrar el FormX se guarda su posición y tamaño
PUBLIC SUB Form_Close()
    Settings["FormX/Top"] = ME.ScreenY
    Settings["FormX/Left"] = ME.ScreenX
    Settings["FormX/Height"] = ME.Height
    Settings["FormX/Width"] = ME.Width
END

' al abrir el FormX se cargan los datos
PUBLIC SUB Form_Open()
    ME.Left = Settings["FormX/Left", ME.Left]
    ME.Top = Settings["FormX/Top", ME.Top]  
    ME.Height = Settings["FormX/Height", ME.Height]
    ME.Width = Settings["FormX/Width", ME.Width]
END


FormX es el nombre que quieras (diferente para cada Form), para identificar cada formulario o ventana de forma individual. Si usas ese código en cada uno de tus formularios, siempre se abrirán en la última posición y tamaño que tuvieran antes de cerrar la aplicación.

Saludos



 
jguardon - Ver perfil del usuario Enviar mensaje privado  
jguardon [ Lunes, 13 Diciembre 2010, 23:17 ]
Responder citando    Descargar mensaje  
Mensaje Re: Guardar La Posicion De Todos Los Formularios Abiertos 
 
Gente, no se si se han dado cuenta que cada uno está dando opiniones muy diferentes y que eso puede desorientar.

Si realmente fuera necesario llevar un control de los formularios abiertos la propuesta de Soplo sería la ideal (faltó decir que debería ser una clase estática que inicie el sistema).

La propuesta de shordi sería viable si se crearan los formularios por código (olvidó mostrar cómo guardaría los valores en disco).

La propuesta de Jesús es a mi criterio la más adecuada pero tiene el inconveniente de que multiplica el código por cada formulario. Para no duplicar el código sólo bastaría con crear dos métodos con parámetros formales (X, Y, W, H) de tipo entero en una clase estática o en un módulo que encapsulen el código, para luego llamar a esas rutinas desde los eventos Open y Close de cada formulario.

Saludos.



 
fabianfv - Ver perfil del usuario Enviar mensaje privado  
fabianfv [ Martes, 14 Diciembre 2010, 05:35 ]
Responder citando    Descargar mensaje  
Mensaje Re: Guardar La Posicion De Todos Los Formularios Abiertos 
 
Citar:
La propuesta de shordi sería viable si se crearan los formularios por código (olvidó mostrar cómo guardaría los valores en disco).

Discrepo, Fabián. En mi solución sólo utilizo eventos que maneja cada formulario desde el IDE. Es a la inversa, no sería viable si se crearan los forms por código... aún no sé cómo crear código por código, jejeje.
El cómo los guardaría... jsbsan no ha especificado si quiere almacenar los valores para futuras ejecuciones o sólo para la ejecución actual. Si es lo segundo, ya lo tiene disponible en los arrays del módulo(como le indico en el ejemplo). Si es para lo primero, yo lo guardaría en un Settings que crearía a la hora de cerrar la aplicación, o en una tabla de SQLite, que van muy bien.

Añado: La solución de soplo sólo controla el número de formularios abiertos. La solución de jGuardón, obliga a llevar el nombre de los forms en el propio código una y otra vez... Creo que la mía es la más flexible.

Se abre el concurso: Concursantes defiendan sus opciones. jejejeje



 
última edición por shordi el Martes, 14 Diciembre 2010, 08:19; editado 1 vez 
shordi - Ver perfil del usuario Enviar mensaje privado  
shordi [ Martes, 14 Diciembre 2010, 08:17 ]
Responder citando    Descargar mensaje  
Mensaje Re: Guardar La Posicion De Todos Los Formularios Abiertos 
 
Shordi:
Citar:

jsbsan no ha especificado si quiere almacenar los valores para futuras ejecuciones


Si se me ha pasado comentarlo, es para que lo abra para futuras ejecuciones el usuario...

El tema esta es que al abrirse tantas ventanas, el usuario , en cada archivo de trabajo (PRESUPUESTO), las pondrá donde el las pueda ver mejor, empezara a trabajar y luego cerrará la aplicación....
Al día siguiente volverá ha abrir el PRESUPUESTO  (intentara seguir trabajando en el punto en que lo dejo), y no quiero que tenga que volver organizar las ventanas (perderá mucho tiempo y es incómodo). Quiero que al abrir el PRESUPUESTO se abran las ventanas tal como las dejo.

Según vuestros códigos, habría  dos maneras de grabar la posición y nombres del formularios que estén abiertos:
               - en un archivo de datos Settings,
               - en un archivo plano de texto, que se guarde junto al archivo PRESUPUESTO.

También tengo que tener en cuenta que:
      - que en el mismo día trabaje con varios presupuestos
      - Y el usuario puede estar trabajando con varios  Xlincegambas a la vez (en lo más normal en este tipo de aplicaciones, trabajar con varios presupuestos a la vez)

Quizás, con estas formas de trabajar, lo mejor sera tener un archivo donde guarde la posición y el nombre de cada formulario para cada archivo de PRESUPUESTO


Muchas gracias por vuestros códigos, los analizare cada uno y veré cual me puede servir mejor para mi propósito.

Saludos


Julio

Nota:
Hoy subo la alfta02 de este programa.. se admiten sugerencias para la mejora del programa...
https://sites.google.com/site/xlincegambas/descarga



 
jsbsan - Ver perfil del usuario Enviar mensaje privado  
jsbsan [ Martes, 14 Diciembre 2010, 10:47 ]
Responder citando    Descargar mensaje  
Mensaje Re: Guardar La Posicion De Todos Los Formularios Abiertos 
 
Si pretendes guardar la configuración de todas las pantallas abiertas según el presupuesto que el usuario abra etc. etc. Estás abocado a utilizar una base de datos para relacionar todo eso. Una tabla donde tengas el nick del usuario del programa, el nombre de las ventanas, la posición x e y, el registro último, etc. etc.

A mí, por lo menos, cualquier otra solución (settings, archivos planos, etc.) me parece mucho más engorrosa.

Yo utilizaría SQLite3, que va de maravilla.


Saludos.



 
shordi - Ver perfil del usuario Enviar mensaje privado  
shordi [ Martes, 14 Diciembre 2010, 11:14 ]
Responder citando    Descargar mensaje  
Mensaje Re: Guardar La Posicion De Todos Los Formularios Abiertos 
 
Shordi:
Citar:

Discrepo, Fabián. En mi solución sólo utilizo eventos que maneja cada formulario desde el IDE. Es a la inversa, no sería viable si se crearan los forms por código

Los nombres de los eventos son genéricos, no están asociados a un nombre de formulario. En consecuencia, sí sería viable usarlos si se crearan los formularios por código: lo único necesario sería crear un nombre para el manejador de eventos al momento de crear cada formulario.

Pero lo que dije sobre que tu propuesta era viable si se creaban los formularios dinámicamente es consecuencia de que leí apresuradamente tu código y lo malinterpreté. De todos modos, no es necesario guardar los datos en un array para lo que Julio quiere hacer.

Citar:

El cómo los guardaría... jsbsan no ha especificado si quiere almacenar los valores para futuras ejecuciones o sólo para la ejecución actual

Es que a mí me resultó obvio al leer el mensaje de Julio que quería guardar esos datos para restablecerlos en cada ejecución posterior.

Citar:

La solución de jGuardón, obliga a llevar el nombre de los forms en el propio código una y otra vez

Es cierto. Se debería reemplazar algo como "FormX/Left" por ME.Name & "/Left".

Respecto de usar SQLite3, me parece que no es necesario porque este caso es muy simple de resolver mediante Settings. Supongamos que el sistema de Julio se utiliza en una empresa. En cada puesto de trabajo una misma pc será usada, probablemente, por 2 o 3 personas a lo sumo, no veo que haya razón para usar una base de datos para esto porque no hay complejidad en la estructura de datos a guardar, ni gran cantidad de datos, tampoco hay gran cantidad de usuarios, ni necesidad de accesos concurrentes.

Saludos



 
fabianfv - Ver perfil del usuario Enviar mensaje privado  
fabianfv [ Martes, 14 Diciembre 2010, 19:27 ]
Responder citando    Descargar mensaje  
Mensaje Re: Guardar La Posicion De Todos Los Formularios Abiertos 
 
Con todo el cariño y respeto debo decir que mi propuesta es la mejor y mas sencila je je je.

Si tu creas una variable estática dentro de una clase esa variable es visible dentro de todas las instancias de esa clase osea que si tu tienes diez instancias de un form por ejemplo y en uno de ellos a una variable estática le das el valor PI desde todas las instancias esa variable valdrá PI.

Por esa razón si cada vez que abres una instancia incrementas una variable y cada vez que cierras decrementas el resultado es que en esa variable tienes la cantidad de instancias que tienes.

La pregunta de este hilo se responde con que basta con crear una variable que sea declarada como estática, incrementarla o decrementarla según se crean o se destruyen instancias.

Mas simple imposible

 



 
última edición por soplo el Martes, 14 Diciembre 2010, 20:00; editado 1 vez 
soplo - Ver perfil del usuario Enviar mensaje privado  
soplo [ Martes, 14 Diciembre 2010, 19:59 ]
Mostrar mensajes anteriores:    
 
Ocultar¡Este tema fue útil?

 

Elegir valoración:                       

Media de valoración Valoración mínima Valoración máxima Número de valoraciones
0.00 0 0 0
 
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