delphiscreen-resolutiondelphi-10.1-berlinppi

How to correctly use TGridPanel when display PPI scaling is active?


I have written a small test VCL application with a monitor PPI of 96.

The application has a TGridPanel on it with a absolute pixel sized column.

On that column I placed a TComboBox and aligned it alClient.

Here is the DFM code:

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 182
  ClientWidth = 514
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  OnShow = FormShow
  PixelsPerInch = 96
  TextHeight = 13
  object GridPanel1: TGridPanel
    Left = 0
    Top = 0
    Width = 514
    Height = 182
    Align = alClient
    Caption = 'GridPanel1'
    ColumnCollection = <
      item
        Value = 100.000000000000000000
      end
      item
        SizeStyle = ssAbsolute
        Value = 150.000000000000000000
      end>
    ControlCollection = <
      item
        Column = 0
        Control = Button1
        Row = 0
      end
      item
        Column = 1
        Control = ComboBox1
        Row = 0
      end
      item
        Column = 0
        Control = Edit1
        Row = 1
      end>
    RowCollection = <
      item
        Value = 50.000000000000000000
      end
      item
        Value = 50.000000000000000000
      end>
    TabOrder = 0
    object Button1: TButton
      Left = 1
      Top = 1
      Width = 362
      Height = 21
      Align = alTop
      Caption = 'Button1'
      TabOrder = 0
      OnClick = Button1Click
    end
    object ComboBox1: TComboBox
      Left = 363
      Top = 1
      Width = 150
      Height = 21
      Align = alClient
      TabOrder = 1
      Text = 'ComboBox1'
    end
    object Edit1: TEdit
      Left = 1
      Top = 91
      Width = 362
      Height = 21
      Align = alTop
      TabOrder = 2
      Text = 'Edit1'
    end
  end
end

and the PAS code:

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    GridPanel1: TGridPanel;
    Button1: TButton;
    ComboBox1: TComboBox;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  PPI: Integer;
begin
  PPI := Integer.Parse(Edit1.Text);
  GridPanel1.ScaleForPPI(PPI);
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  Edit1.Text := Screen.PixelsPerInch.ToString;
end;

end.

I then changed the custom scaling factor to 125 in Windows 10 in the advanced scaling settings.

After signing off and signing on again when I run the application again the drop down button of the combo box is not visible any more.

How do you deal with this problem?

I tried to call GridPanel1.ScaleForPPI(96) which restores the drop down button on the combo box. This kind of defeats the purpose of PPI scaling though, doesn't it?

With 120 PPI

With 96 PPI


Solution

  • The problem is gone in Delphi 10.3.1.

    So this is a bug in at least Delphi 10.1 (and possible other older versions).