unit uUIAutoScaler;

interface

uses
  Vcl.Forms, Vcl.StdCtrls, Vcl.DBGrids, Vcl.Controls, System.Classes,
  System.SysUtils, Vcl.Graphics, Winapi.Windows, System.Math,
  TypInfo;

type
  TUIAutoScaler = class
  public
    // Ajusta la fuente de una columna para que el texto "quepa"
    class procedure FitGridFont(AGrid: TDBGrid);
    // Escala todo el formulario y sus hijos
    class procedure ScaleForm(AForm: TForm; ADesignWidth: Integer = 1280);
  end;

implementation

type
  // Truco canónico de Delphi para acceder a miembros protegidos de TControl
  // (Font es 'protected' en TControl pero 'published' en los controles concretos)
  THackControl = class(TControl);

class procedure TUIAutoScaler.FitGridFont(AGrid: TDBGrid);
var
  i: Integer;
  ColWidth: Integer;
  NewFontSize: Integer;
begin
  for i := 0 to AGrid.Columns.Count - 1 do
  begin
    ColWidth := AGrid.Columns[i].Width;
    // Estimación simple: el tamaño de fuente ideal basado en el ancho
    // Útil para que cabeceras largas no se corten
    NewFontSize := Max(7, Min(11, Floor(ColWidth / 10)));

    // Aplicamos al título del grid (compatible con XE3 y versiones superiores)
    // Title existe en TColumn, no en TDBGrid directamente
    AGrid.Columns[i].Title.Font.Size := NewFontSize;
  end;
end;

class procedure TUIAutoScaler.ScaleForm(AForm: TForm; ADesignWidth: Integer = 1280);
var
  ScaleFactor: Double;
  i: Integer;
begin
  // Calculamos cuánto ha crecido o encogido el form respecto al diseño original
  ScaleFactor := AForm.Width / ADesignWidth;

  for i := 0 to AForm.ComponentCount - 1 do
  begin
    if AForm.Components[i] is TControl then
    begin
      // Escalado de fuentes de etiquetas, botones y edits
      if IsPublishedProp(AForm.Components[i], 'Font') then
      begin
        // Evitamos que la fuente sea ilegiblemente pequeña
        THackControl(AForm.Components[i]).Font.Size := Max(7, Round(8 * ScaleFactor));
      end;

      // Escalado de botones (especialmente útil en pantallas táctiles o bajas res)
      if AForm.Components[i] is TButton then
      begin
        TButton(AForm.Components[i]).Height := Round(25 * ScaleFactor);
      end;
    end;
  end;
end;

end.
