¿Cuantas veces nos hemos tenido que plantear el ajustar una ventana maximizada a la resolución de pantalla? ¿Cuantas veces hemos tenido que diseñar en varios archivos de recursos los distintos tamaños y después llamarlos según la resolución de la pantalla?
Bueno, pues se me planteo esta cuestión con el programa de hosteleria que estoy haciendo, así que depués de informarme de si había alguna forma en Xailer de hacer esto de forma automática y tener la respuesta que me esperaba de "hay que hacerlo desde programa" me puse a investigar un poquito y obtuve la solución que incluyo en la descarga.
La solución pasa por capturar el evento OnSize del formulario, calcular un factor de escala y aplicarlo a los controles.
Me queda pulir un poco el algoritmo, pero aqui dejo un ejemplo.
Descargar:
Actualización 25.01.2006 7:21:
Con ayuda de José F. Giménez se ha solucionado un problema de redondeo que evita que si se redimensiona de forma constante el formulario se terminen perdiendo las proporciones de los controles.
Redimensionando con Xailer. Solución de ajuste de redondeo.
Conciso peor muy efectivo, pura matematica, chapo.
Donde estabas cuando pregunte en el foro de Xailer hace muchos meses sobre como tratar los objetos visuales en grupo, menuda comida de bola me he pegado por no conocer la existencia de "::aControls".
Sigue asi.
Disculpa queria decir..
Conciso pero muy efectivo
Pero con la emosion se me fueron la teclas.
Comentado por Pedro Amaro a Martes, 24 de Enero de 2006José Alfonso,
si redimensionas repetidamente el formulario termina perdiendo las proporciones de los controles. Esto se debe a que cada vez que se realizan los cálculos se produce un pequeño error de redondeo (las coordenadas son siempre valores enteros) que se va acumulando.
La solución pasa por hacer los cálculos sobre las coordenadas originales, y no sobre las últimas calculadas. De esta forma se evita acumular el error de redondeo.
Aquí tienes el proyecto corregido y funcionando perfectamente:
http://www.xailer.com/files/redimensionar.zip
Un saludo.
José F.
Gracias por la ayuda.
Estaba dandole vueltas a ver como solucionar el problema del redondeo.
Saludos,
Una pregunta, ¿porqué redimensionar los controles y no anclarlos en el formulario?
Comentado por ^_^ a Miércoles, 25 de Enero de 2006¿Y por qué anclarlos en el formulario?
Si los anclas se quedan donde quieras, bien, pero no se llena el resto de la ventana, lo que a un TPV le confiere un feo aspecto, por ejemplo.
Y otra cosa, me gusta que la gente se identifique con un nombre, aunque sea un nick, se me hace muy extraño hablar con un anagrama.
Y que hago con los controles que estan dentro de un TGroupBox.
Comentado por Pedro Amaro a Miércoles, 25 de Enero de 2006Pedro,
para incluir los controles que haya dentro de un TGroupBox o cualquier otro contenedor puedes modificar la rutina para que busque recursivamente los controles; todos los controles contenedores (incluidos los formularios) tienen una propiedad aControls con los controles que contiene.
Un saludo.
Comentado por José F. Giménez a Jueves, 26 de Enero de 2006Ok! Recursividad al canto, ya funciona con los objetos Contenedores, pero me surge un pequeño problema que he resuelto de la manera mas tonta, por algun motivo al pintarse por primera vez el formulario todo el contenido de un TGroupBox desaparecia y solo se quedaba el cursor parpadeante de uno de los controles, solucion; incluir una condicion para que no se ejecute el codigo de redimension si los coeficientes de redimension son igual a 1.
Saludos
Pedro Amaro
Jose a mi se me descuageringa toooo
Por cierto el metodo de la clase que propones esta mal, tu haces esto:
METHOD Create( oParent ) CLASS TControl
::nOrgLeft := ::nLeft
::nOrgTop := ::nTop
::nOrgWidth := ::nWidth
::nOrgHeight := ::nHeight
RETURN Super:Create( oParent )
Si te fija en el return estas devolviendo un objeto de la clase Super, lo logico seria esto otro:
METHOD Create( oParent ) CLASS TControl
::nOrgLeft := ::nLeft
::nOrgTop := ::nTop
::nOrgWidth := ::nWidth
::nOrgHeight := ::nHeight
Super:Create( oParent )
RETURN Self
Ademas eso te funciona porque los objetos se pasan por referencia si no te iria mal por el orden en que lo haces, deberia ser asi:
METHOD Create( oParent ) CLASS TControl
Super:Create( oParent )
::nOrgLeft := ::nLeft
::nOrgTop := ::nTop
::nOrgWidth := ::nWidth
::nOrgHeight := ::nHeight
RETURN Self
Comentado por Manu Exposito a Sábado, 04 de Febrero de 2006El ejemplo de Jose Gimenez si va perfecto ;-)
Saludos
Comentado por Manu Exposito a Domingo, 05 de Febrero de 2006