none
Almacenar y restablecer posición de un formulario, algo no cuadra RRS feed

  • Pregunta

  • Hola!

    Estoy guardando la posición y tamaño de un formulario, lo guardo en un fichero json  y luego lo recupero, establezco esos valores en el formulario y el formulario aparece desplazado.  

    He verificado que los valores que guardan son los del formulario, y choca un poco que la posición x,y es -8 para ambos.    al menos eso es lo que veo cuando rastreo la ejecución de la aplicación.  creo que en realidad debería ser 0,0  

    ¿Alguien me puede decir porque este comportamiento?.  

    Lo que hago es maximizar formulario, y al cerrarlo guardo posición y tamaño.    luego cuando vuelvo a abrir formulario recupero esos valores y los establezco y aparece desplazado hacia abajo y derecha

    ¿alguna posible idea de que puede causar esto?

    domingo, 30 de agosto de 2020 19:36

Respuestas

  • Lo he hecho muchas veces, y funciona impecablemente. Siempre devuelve el formulario a la posición exacta en la que se salvó. Si te toma una posición ligeramente desplazada, tiene que haber algo raro en el código que usas para leer o reestablecer la posición. Tal vez estés tomando el interior de la croma en lugar de el exterior, o algo por el estilo.

    EDITADO: Un momento, releyendo tu mensaje veo que dices que primero lo maximizas y después lees la posición. Esto no tiene sentido, cuando está maximizado no te devuelve correctamente la posición. Lo que se hace es guardar un booleano que diga si está o no maximizado. Si está maximizado, no se guarda la posición; simplemente se vuelve a maximizar cuando hay que restaurarlo. Únicamente cuando NO esta maximizado es cuando se salvan y restauran las coordenadas y el tamaño del formulario.

    Y vuelvo a editar: He subido a GitHub un código que escribí hace ya bastantes años, que sirve precisamente para salvar y restaurar formularios, y que está ya bastante pulido para contemplar cosas como que tengas varios monitores, o que abras la aplicación a través de escritorio remoto con distinta resolución unas veces y otras, salvando su ubicación bajo cada una de las resoluciones. Aquí está el proyecto:

    https://github.com/AlbertoPoblacion/SalvarUbicacionFormulario

    lunes, 31 de agosto de 2020 6:57
    Moderador

Todas las respuestas

  • Lo he hecho muchas veces, y funciona impecablemente. Siempre devuelve el formulario a la posición exacta en la que se salvó. Si te toma una posición ligeramente desplazada, tiene que haber algo raro en el código que usas para leer o reestablecer la posición. Tal vez estés tomando el interior de la croma en lugar de el exterior, o algo por el estilo.

    EDITADO: Un momento, releyendo tu mensaje veo que dices que primero lo maximizas y después lees la posición. Esto no tiene sentido, cuando está maximizado no te devuelve correctamente la posición. Lo que se hace es guardar un booleano que diga si está o no maximizado. Si está maximizado, no se guarda la posición; simplemente se vuelve a maximizar cuando hay que restaurarlo. Únicamente cuando NO esta maximizado es cuando se salvan y restauran las coordenadas y el tamaño del formulario.

    Y vuelvo a editar: He subido a GitHub un código que escribí hace ya bastantes años, que sirve precisamente para salvar y restaurar formularios, y que está ya bastante pulido para contemplar cosas como que tengas varios monitores, o que abras la aplicación a través de escritorio remoto con distinta resolución unas veces y otras, salvando su ubicación bajo cada una de las resoluciones. Aquí está el proyecto:

    https://github.com/AlbertoPoblacion/SalvarUbicacionFormulario

    lunes, 31 de agosto de 2020 6:57
    Moderador
  • Gracias por responder.... pues puede que se alo que indicas, que al estar maximizado pasa algo,   haré lo que comentas y te digo,   es decir, si no está mazimizado guardo posicion y si estaba maximizado la actualizo .   en fin, que tengo que diferenciar.  Pruebo y te digo.

    voy a bajar tu codigo, gracias!

    lunes, 31 de agosto de 2020 11:51
  • ¿Alguna novedad sobre la consulta realizada? 

    Cualquier duda referente a productos Microsoft, puedes consultarnos. Es un gusto informarte. 

    Gracias por usar los foros de MSDN.  

    Eric Ruiz 

    ____________________________  

     

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.  

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.   

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

    lunes, 31 de agosto de 2020 15:05
    Moderador
  • ¡Hola!

    Guardando el estado del formulario, no solo la posición y tamaño, si que se soluciona.  Es decir, si el estado es maximizado lo restablezco tal cual, pero si no, lo restablezco a sus posiciones tamaño y funciona.

    Lo que me falta es bajar y echar un vistazo  al ejemplo que me pasaste, lo vi algo complejo para mi nivel, tengo que estudiarlo y aprender de él.

    un saludo y gracias por la ayuda

    martes, 1 de septiembre de 2020 12:32
  • Una pequeña explicación acerca del ejemplo: Piensa en el caso de que tu programa se ejecuta, por ejemplo, en un ordenador de la oficina que tiene un monitor de 2000x1000 pixels de resolución. Ubicas la ventana en pequeño en la parte de abajo a la derecha, y cierras el programa. Después te vas a casa y te conectas mediante RDP al ordenador de la oficina, usando un portátil que tiene una pantalla mucho más pequeña. Si el programa se abre "abajo a la izquierda" contando con los píxels del monitor grande, entonces se te sale de la pantalla del portátil y no lo ves. También ocurren consideraciones similares si tienes dos monitores y guardas el programa mientras estaba en el monitor de la derecha y luego te conectas desde un equipo remoto que solo tiene un monitor. O si desenchufas el monitor donde salvaste el programa y luego lo vuelves a abrir cuando el ordenador solo tiene conectado un monitor.

    En resumidas cuentas, el ejemplo hace un cálculo en el que toma en consideración el número de monitores y su resolución, dando lugar a un "código" que se salva junto con las coordenadas de la ventana. Cuando va a restaurarlo, vuelve a calcular el "código" y si no es el mismo, abre el programa en la posición predeterminada, y luego cuando lo cierras lo salva asociado a este nuevo código. De esa manera puede mantener salvadas varias posiciones de la ventana, y utiliza una u otra dependiendo de los monitores que tengas conectados en el momento de abrir la aplicación. El ejemplo también contempla salvar varios Forms, cada uno en su posición distinta, en caso de que el programa funcione con varias ventanas.

    Todo esto al principio no lo piensas, cuando desarrollas el programa en tu pequeño ordenador con un único monitor, pero cuando lo empiezan a utilizar los usuarios y lo ejecutan con distintos monitores y con escritorio remoto, se empiezan a quejar de que "no funciona bien", y al final acabas teniendo que implementar estas complejidades.

    martes, 1 de septiembre de 2020 17:26
    Moderador
  • ¡Hola!

    La verdad es que no había hehco un análisis tan profundo, pero tienes toda la razón del mundo. Un programa que guardaba datos de posición en el registro de windows una vez algo pasó que arrancabas y nunca veías la ventana principal, no sabia que podía ser, y se me ocurrió ir al registro a consultar los valores de posición y era ese mismo problema que me indicas.

    YO lo que estoy haciendo, es que cada formulario, guarda en un Json serializado y en una carpeta.   Mas que nada para que se pueda editar fácilmente algún parámetro por parte del usuario.   

    Lo que si que voy a copiar de tus recomendaciones es el hecho de tener un "modo" de detectar si ha cambiado resolución, monitor, o algo, y que en dicho caso tenga unos valores predeterminado (que creo que lo mejor sería simplemente maximizar).   

    Muchas gracias por tus explicaciones y sugerencias. Muy agradecido.

    viernes, 4 de septiembre de 2020 9:11