Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Formulario que ocupe toda la pantalla (https://www.clubdelphi.com/foros/showthread.php?t=75987)

Parsec 01-10-2011 22:18:55

Formulario que ocupe toda la pantalla
 
Buenas a tod@s,

quisiera que un formulario se mostrara siempre ocupando toda la pantalla. Quiero evitar con esto que dependiendo de la resolución del monitor se vea más o menos grande.

Saludos

escafandra 02-10-2011 02:39:20

Para que un formulario ocupe la pantalla puedes dimensionarlo al tamaño de ésta:

Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
  Left:= 0;
  Top:= 0;
  Width:= Screen.Width;
  Height:= Screen.Height;
end;

Puede que te interese la lectura de este tema.

Saludos.

newtron 03-10-2011 10:02:23

Hola.

Por otro lado si lo que te interesa es redimensionar los componentes de la pantalla tendrás que utilizar scaleby, haz una búsqueda que ya se ha tratado ese tema.

Saludos

Parsec 03-10-2011 11:19:44

Hola newtron,

estoy buscando código que utilice scaleby para redimensionar los componentes del formulario y no he encontrado nada, ¿me puedes echar un cable?.

Gracias y un saludo

Parsec 03-10-2011 11:25:51

concretamente estoy utilizando esto:

Cita:

Height:= Height * Screen.Height div Alto;
Width:= Width * Screen.Width div Ancho;
ScaleBy(Screen.Width, Ancho); //en base al ancho
ScaleBy(Screen.Height, Alto); // en base al alto.
previamente tengo definido el ancho y alto con lo que lo diseñé.

El problema está en que, por ejemplo, un componente dbgrid 'si' se dimensiona pero los campos que continen 'no' y me aparece el odiado scroll.

Gracias

newtron 03-10-2011 12:40:41

El asunto es que es peliagudo, en el caso de los grids tendrás que redimensionar también las casillas del mismo. Yo no uso dbgrids pero en el caso del stringgrid lo que hago es esto:

Código Delphi [-]
      StringGrid.DefaultRowHeight := DefaultRowHeight*longint ( screen.height ) DIV 600;

igualmente tendrás que hacer algo parecido con el width de las columnas.

El 600 es porque yo desarrollo a 800x600.

Saludos

ecfisa 03-10-2011 13:12:18

Hola Parsec.

Ya lo mencionó escafandra más arriba, pero como está codificado en C++ quizá no lo hayas podido probar.

Este código funciona razonablemente bién:
Código Delphi [-]
procedure AdaptarResolucion(AForm: TForm; Alto,Ancho: Integer);
begin
  with AForm do
  begin
    if Screen.PixelsPerInch = 96 then
    begin
      ClientHeight := ClientHeight * Screen.Height div Alto;
      ClientWidth := ClientWidth * Screen.width div Ancho;
      ScaleBy(Screen.Width, Ancho);
    end
    else if Screen.PixelsPerInch = 120 then
    begin
      ClientHeight := ClientHeight * Screen.Height div Alto;
      ClientHeight := ClientHeight + ((ClientHeight*15) div 100);
      ClientWidth := ClientWidth * Screen.Width div Ancho;
      ClientWidth := ClientWidth + ((ClientWidth*15) div 100);
      ScaleBy(Screen.Width,Ancho);
      Top := Top - 70;
      Left := Left - 70;
    end
    else
    begin
      ClientHeight := ClientHeight * Screen.Height div Alto;
      ClientWidth := ClientWidth * Screen.width div Ancho;
      ScaleBy(Screen.Width,Ancho);
    end;
  end;
end;

Ejemplo de llamada:
Código Delphi [-]
   AdaptarResolucion(Form1, 768, 1024);


Saludos.

Parsec 03-10-2011 17:03:17

A eso me refiero newtron, para el caso de los Dbgrid o cualquier otro componente con características similares, tengo que ir columna por columna y cabecera por cabecera redimensionando, ¿verdad?.

Gracias Ecfisa
Gracias Newtron

Parsec 03-10-2011 17:31:36

Así es como lo he solucionado...

En la propiedad Align del form debe de llevar alClient, para que ocupe toda la pantalla.


Cita:

x:=Screen.Width;
y:= Screen.Height;

Height := Height * y div alto;
Width := Width * x div ancho;

ScaleBy(Screen.Width, ancho);
//El dbgrid no hace falta escalarlo porque lo hace según su contenido (ver a continuación)
// Dbgrid1.ScaleBy(Screen.Width, ancho);
Dbgrid1.Columns[0].Width:=Dbgrid1.Columns[0].Width * x div ancho;
Dbgrid1.Columns[1].Width:=Dbgrid1.Columns[1].Width * x div ancho;
Dbgrid1.Columns[2].Width:=Dbgrid1.Columns[2].Width * x div ancho;
Dbgrid1.Columns[3].Width:=Dbgrid1.Columns[3].Width * x div ancho;
Dbgrid1.Columns[4].Width:=Dbgrid1.Columns[4].Width * x div ancho;

Dbgrid1.Columns[0].Title.Font.Size:=Dbgrid1.Columns[0].Title.Font.Size * x div ancho;
Dbgrid1.Columns[1].Title.Font.Size:=Dbgrid1.Columns[1].Title.Font.Size * x div ancho;
Dbgrid1.Columns[2].Title.Font.Size:=Dbgrid1.Columns[2].Title.Font.Size * x div ancho;
Dbgrid1.Columns[3].Title.Font.Size:=Dbgrid1.Columns[3].Title.Font.Size * x div ancho;
Dbgrid1.Columns[4].Title.Font.Size:=Dbgrid1.Columns[4].Title.Font.Size * x div ancho;
Habría que ver la forma de optimizar el código para no repetir tanto Columns[0], [1], etc. y el formulario queda perfecto sea cual sea la resolución donde se vaya a mostrar.

newtron 03-10-2011 17:55:08

Bueno, si no me equivoco tu código se podría optimizar un poco de la siguiente manera:

Código Delphi [-]
For N:=0 to Dbgrid1.Colcount do begin
  Dbgrid1.Columns[N].Width:=Dbgrid1.Columns[N].Width * x div ancho;
  Dbgrid1.Columns[N].Title.Font.Size:=Dbgrid1.Columns[N].Title.Font.Size * x div ancho;
end;

Saludos

ecfisa 03-10-2011 17:57:43

Cita:

Empezado por Parsec (Mensaje 414379)
Habría que ver la forma de optimizar el código para no repetir tanto Columns[0], [1], etc.

No lo probé pero creo que así debería funcionar sin problemas:
Código Delphi [-]
...
var
  i: Integer;
begin
  ...
  with DBGrid1 do
    for i:= 0 to Columns.Count -1 do
    begin
      Columns[i].Width:= Columns[i].Width * x div ancho;
      Columns[i].Title.Font.Size:= Columns[i].Title.Font.Size * x div ancho;
    end;
end;

Un saludo.

Edito: newtron, me alegra saber que tenemos en común algo más que la viajera... :D:D:D

ecfisa 03-10-2011 18:28:09

Hola Parsec.

Me acabo de acordar del método ScaleControls:
Código Delphi [-]
...
type
  TDBGrid = class(DBGrids.TDBGrid);
  TForm1 = class(TForm)
    DBGrid1: TDBGrid;
  ...

implementation

...
begin
  DBGrid1.ScaleBy(1024, Screen.Width);
  DBGrid1.ScaleControls(1024, Screen.Width);
end;
Pero tendrías que probar si realiza lo que buscas en las diferentes resoluciones... :rolleyes:

Un saludo.

newtron 03-10-2011 18:32:46

Cita:

Empezado por ecfisa (Mensaje 414387)
Edito: newtron, me alegra saber que tenemos en común algo más que la viajera... :D:D:D

Ojalá amigo ecfisa, ojalá porque creo que me faltarán vidas para llegar a tu nivel. :cool:

Parsec 03-10-2011 18:33:50

Lo probaré Ecfisa.

Muchas gracias Newtron y Ecfisa por la ayuda.

Saludos cordiales

ecfisa 03-10-2011 23:35:39

Cita:

Empezado por newtron (Mensaje 414391)
Ojalá amigo ecfisa, ojalá porque creo que me faltarán vidas para llegar a tu nivel. :cool:

Vas a tener que repetir ese mantra varias vidas seguidas para que alguién (sobre todo yo) pueda creerlo... :D:D:D

Un saludo.:)


La franja horaria es GMT +2. Ahora son las 11:55:58.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi