![]() |
Cambio de resolucion - Un desastre
Cuando en tiempo de diseño colocamos en unas coordenadas determinadas los componentes con su tamaño correspondiente, el programa se ejecuta exactamente igual a como lo habíamos diseñado pero una vez compilado, si cambiamos la resolución de Windows, resulta que hay componentes que no estan en la misma posición tal y como lo diseñamos, si la ventana es muy grande resulta que ahora no cabe en la pantalla, etc. ¿Hay alguna manera, que no sea calculando a mano cada coordenada de cada componente, su ancho y su alto, que sea sencilla para resolver este problema? ¿Existe algun componente tal vez?
Gracias. |
Hola, he descubierto que si hago lo siguiente en el evento onCreate del Form:
Const Ancho = 1024; // Ancho del diseño Alto = 768; // Alto del diseño begin Height := Height * Screen.Height Div Alto; Width := Width * Screen.Width Div Ancho; ScaleControls ( Screen.Width, Ancho ); End; Los controles se adaptan a la resolucion pero el tamaño de la fuente no. Si alguien tiene la solucion... Sigo investigando. |
yo siempre he usado el mism turco cuando el diseño me lo ha permitido, y siempre que puedo lo hago porque me va muy bien.
Pongo un panel en todos los form, y todos los botones y todos los componentes necesarios dentro del panel. Y en el oncreate del form, llamo a una funcion, que centra el panel centrarpanel(panel1); Y la funcion se las apaña en centrarlo sea la resolución que sea. Tu trabajas con el panel que te dan, con su left y top, y les has signas el screen.top, o screen .left dividido entre 2 menos la mitad del panel, o algo asi.Miratelo, pero tienes que trabajar con screen con el panel y sus propiedades top y left, y cuando te quede centrado pues ya esta El unico problema y lógico, es que si por ej: En una resolucion 1024 por 768, llenas la pantalla , en una resolución menor, pues se perderan componentes,claro. Pero si tu te lo montas, para que en la peor resolución que hagas, se vea toda la pantalla ocupada, en las demas más grandes, se vera perfecto y centrado siempre en el centro. Yo personalmente trabajo a 1024 por 168, pero las aplicaciones las preparo para que tambien se vean en resoluciones menores, es decir, que en mi resolución los componentes no me ocupan toda la pantalla. Y el screen te cambiara solo cuando cambies la resolucion. Saludos |
jeje, pues precisamente, el problema que tengo es que al cambiar la pantalla a una resolución menor pierdo componentes, pero si uso la función ScaleControls ya no pasa, lo que ocurre es que las fuentes no se reescalan. He encontrado una función que en teoria reescala los componentes y las fuentes pero no me funciona --> http://www.bsdg.org/swag/DELPHI/0440.PAS.html
|
Cita:
Un Saludo. |
Tengo esta otra información, que debo reconocer no he probado, haz la prueba y nos cuentas si funciona correctamente.
Cita:
Un Saludo. |
He tenido en cuenta la propiedad Scale = false y en cuanto al ejemplo de Franciso ya lo había probado. Tal vez el problema consiste en que en tiempo de diseño utilice una resolucion de 1024X768 y cuando pruebo el programa lo hago a 800X600, pero creia que la fuente se me tendria que hacer mas pequeña pero no es asi. He ejecutado el programa con resoluciones superiores a 1024X768 y parece que funciona bien.
|
Pues finalmente parece ser que la ventana que yo estaba intentando reescalar no podia caber en una resolucion de 800X600, pero cuando la reescalaba a una resolucion superior a 1024X768 los componentes se adaptaban bien a la nueva resolución pero la ventana era demasiado grande. Para quien le interese, a partir de la información que he sacado de Internet he creado una unidad que me ha solucionado el problema que tenía:
unit UtilidadesU; interface Uses Forms, Windows; Type TResolucion = Record Ancho : Integer; Alto : Integer; End; Procedure AdaptarResolucion ( Ventana : TForm; AnchoTiempoDiseno, AltoTiempoDiseno, cPixelsPerInch, cFontHeight : Integer ); Function ConocerResolucionWindows : TResolucion; Function CambiarResolucionWindows ( Ancho, Alto : word): Boolean; implementation Procedure AdaptarResolucion ( Ventana : TForm; AnchoTiempoDiseno, AltoTiempoDiseno, cPixelsPerInch, cFontHeight : Integer ); {Esta función reescala los componentes de una ventana a una nueva resolución} Var OldFormWidth : integer; begin With TForm.Create ( Ventana ) Do Begin scaled := true; if Screen.Width <> AnchoTiempoDiseno then begin OldFormWidth := width; height := longint ( height ) * longint ( screen.height ) DIV AltoTiempoDiseno; width := longint ( width ) * longint ( screen.width ) DIV AnchoTiempoDiseno; scaleBy ( screen.width, AnchoTiempoDiseno ); font.size := ( Width DIV OldFormWidth ) * font.size; end; End; // With End; Function ConocerResolucionWindows : TResolucion; Begin ConocerResolucionWindows.Ancho := Screen.Width; ConocerResolucionWindows.Alto := Screen.Height; End; Function CambiarResolucionWindows ( Ancho, Alto : word): Boolean; var lpDevMode: TDeviceMode; begin Result := EnumDisplaySettings ( nil, 0, lpDevMode ); if Result then begin lpDevMode.dmFields := DM_PELSWIDTH Or DM_PELSHEIGHT; lpDevMode.dmPelsWidth := Ancho; lpDevMode.dmPelsHeight := Alto; Result := ChangeDisplaySettings ( lpDevMode, 0 ) = DISP_CHANGE_SUCCESSFUL; end; end; end. |
La franja horaria es GMT +2. Ahora son las 05:34:29. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi