You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi 11.2 Patch1多屏高DPI环境下TFrame控件显示异常求助

Delphi 11.2 Patch1 多显示器高DPI问题解决方案

核心问题分析

你遇到的问题本质是TFrame及其嵌套控件的DPI适配未跟随主窗口跨显示器同步更新。Delphi的Automatic (Screen PPI)模式下,主表单的DPI缩放逻辑会自动触发,但Frame作为嵌套容器,其内部第三方控件(如TDBAdvGrid、TDBNavigator)的缩放优先级独立于主表单,跨DPI显示器拖拽时容易出现布局错乱,且往返拖拽后会因多次缩放叠加导致问题加剧。

针对性解决方案

1. 利用主表单DPI变更事件强制同步Frame适配

必须通过OnBeforeMonitorDPIChange和OnAfterMonitorDPIChange事件,手动触发Frame及其内部控件的DPI重计算,示例代码如下:

procedure TMainForm.FormAfterMonitorDPIChange(Sender: TObject; OldDPI, NewDPI: Integer);
begin
  if Assigned(YourFrame) then
  begin
    // 强制Frame更新DPI上下文
    YourFrame.UpdateDPI(NewDPI);
    // 调用第三方控件自身的适配方法修正布局
    YourFrame.DBAdvGrid1.AdjustColumns;
    YourFrame.DBNavigator1.UpdateControlState;
  end;
end;
  • 若使用TMS组件,确保调用控件专属的DPI适配接口(如TDBAdvGrid.AdjustColumns),避免仅依赖Delphi原生缩放。
  • OnBeforeMonitorDPIChange可用于临时保存当前列宽等布局参数,避免缩放过程中丢失状态。

2. 修正Frame的基础属性设置

  • 确保Frame的Scaled属性设为True,DPIAwareness与主表单一致(设为Automatic)。
  • 内部控件尽量使用**锚点(Anchors)或布局控件(如TPanel的Align属性)**自适应,避免手动固定尺寸。

3. 列宽的多DPI存储策略

必须针对不同显示器PPI分别存储列宽,因为不同DPI下的列宽是基于缩放比例的绝对像素值,直接复用会导致布局偏差。推荐用INI文件分段存储:

[ColumnWidths_96]  // 100%缩放(标准96PPI)
Grid1_Col1=100
Grid1_Col2=150

[ColumnWidths_192] // 200%缩放(192PPI)
Grid1_Col1=200
Grid1_Col2=300

读取时根据当前显示器PPI匹配对应分段:

function GetCurrentMonitorPPI: Integer;
var
  Monitor: TMonitor;
begin
  Monitor := Screen.MonitorFromWindow(Handle);
  Result := Monitor.PixelsPerInch;
end;

procedure LoadGridColumnWidths(Grid: TDBAdvGrid);
var
  Ini: TIniFile;
  PPIKey: string;
  I: Integer;
begin
  Ini := TIniFile.Create('AppConfig.ini');
  try
    PPIKey := Format('ColumnWidths_%d', [GetCurrentMonitorPPI]);
    for I := 0 to Grid.ColumnCount - 1 do
      Grid.Columns[I].Width := Ini.ReadInteger(PPIKey, Format('Col%d', [I]), Grid.Columns[I].Width);
  finally
    Ini.Free;
  end;
end;

额外注意事项

  • 升级第三方控件:确认TMS组件为适配Delphi 11.2的最新版本,旧版本TDBAdvGrid存在跨DPI布局缺陷。
  • 避免手动缩放:禁止在代码中单独调整控件尺寸,否则会与Delphi自动缩放逻辑冲突,导致双重缩放问题。
  • 多场景测试:不仅测试窗口拖拽,还要验证程序直接在副显示器启动的情况,确保初始化时DPI适配正确。

内容的提问来源于stack exchange,提问作者Steve

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 22:20:59