PDA

Ver la Versión Completa : Cambio de resolucion - Un desastre


SMTZ
02-01-2004, 14:34:20
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.

SMTZ
02-01-2004, 15:27:19
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.

Descendents
02-01-2004, 16:34:24
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

SMTZ
02-01-2004, 16:39:28
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

marcoszorrilla
02-01-2004, 17:36:09
begin
{
IMPORTANT!! : Set Scaled Property of TForm to FALSE with Object Inspector.


Has tenido este detalle que se índica en cuenta?

Un Saludo.

marcoszorrilla
02-01-2004, 17:39:06
Tengo esta otra información, que debo reconocer no he probado, haz la prueba y nos cuentas si funciona correctamente.


Adaptar el formulario a la resolución de pantalla
(Por Francisco Charte)


Este es uno de los temas que más quebraderos de cabeza nos da a los programadores. La solución, generalmente, nunca es sencilla. Los formularios Delphi cuentan con dos propiedades, Scaled y PixelsPerInch, cuya finalidad es adaptar el tamaño de letra cuando la resolución del sistema en que se ejecuta el programa difiere de la que se utilizó en el momento del desarrollo. Esto, usado conjuntamente con el método ScaleBy, nos puede facilitar mucho el trabajo. Básicamente podemos seguir dos métodos para conseguir que nuestras ventanas se vean siempre bien indistintamente de la resolución usada. El primero consiste en calcular la relación existente entre la resolución en que se diseñó y la resolución actual, aplicándola al tamaño del formulario, los controles y los tipos de letra. El segundo método consiste en calcular el tamaño del formulario y de todos los elementos existentes en él de forma proporcional al espacio disponible en pantalla. Aparentemente parece lo mismo, pero no lo es. Puede ver cómo actúa el primer método creando un formulario, insertando en él los controles que desee, y escribiendo el código siguiente:

const
ancho = 640; // Ancho del diseño
alto = 480; // Alto del diseño
procedure TForm1.FormCreate(Sender: TObject);
begin
Height := Height * Screen.Height div alto;
Width := Width * Screen.Width div ancho;
ScaleBy(Screen.Width, ancho);
end;


Las constantes Ancho y Alto deben almacenar la resolución usada durante el diseño. En el momento en que se crea el formulario, se calcula la relación existente entre el modo de diseño y el modo actual, cuyas dimensiones tomamos del objeto Screen. La llamada al método ScaleBy se encargará de modificar proporcionalmente el tamaño de todos los controles, adaptando también los tipos de letra. Indistintamente del método que se utilice, hay que asegurarse de que la visualización es correcta en todos los modos habituales. Para ello lo mejor es ejecutar el programa al menos en las resoluciones de 640x480 y 1024x768 usando fuentes de letra pequeñas y grandes.



Un Saludo.

SMTZ
02-01-2004, 18:16:35
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.

SMTZ
02-01-2004, 20:23:37
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.