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

Delphi XE8表单屏幕分辨率适配问题求助

Delphi XE8 表单多分辨率适配解决方案

核心思路

仅靠Align、Anchors这类属性无法实现控件按比例适配不同分辨率——它们只能让控件固定相对边缘,不能同步调整尺寸和位置的比例。要让大屏上的布局和1366×768时完全一致,需要通过代码动态计算缩放比例,对所有控件的位置、尺寸、字体做批量适配。

具体实现步骤

1. 定义基准分辨率常量

在表单的private区域添加设计时的基准分辨率,也就是你开发用的1366×768:

private
  const
    BASE_WIDTH = 1366;
    BASE_HEIGHT = 768;
  FScaleX: Double;
  FScaleY: Double;

2. 计算缩放比例

在表单OnCreate事件里,根据当前屏幕尺寸和基准分辨率算出缩放比例:

procedure TForm1.FormCreate(Sender: TObject);
begin
  // 计算X、Y方向的缩放系数
  FScaleX := Screen.Width / BASE_WIDTH;
  FScaleY := Screen.Height / BASE_HEIGHT;
  
  // 让表单铺满屏幕
  Self.WindowState := wsMaximized;
end;

3. 递归缩放所有控件

写一个递归函数,遍历表单及容器控件内的所有子控件,按比例调整位置、尺寸和字体:

procedure TForm1.ScaleControl(AControl: TControl; ScaleX, ScaleY: Double);
var
  i: Integer;
begin
  if AControl = nil then Exit;
  
  // 缩放控件位置与尺寸
  AControl.Left := Round(AControl.Left * ScaleX);
  AControl.Top := Round(AControl.Top * ScaleY);
  AControl.Width := Round(AControl.Width * ScaleX);
  AControl.Height := Round(AControl.Height * ScaleY);
  
  // 缩放字体大小
  AControl.Font.Size := Round(AControl.Font.Size * ScaleX);
  
  // 处理容器控件的子控件(比如TPanel、TGroupBox)
  if AControl is TWinControl then
    for i := 0 to TWinControl(AControl).ControlCount - 1 do
      ScaleControl(TWinControl(AControl).Controls[i], ScaleX, ScaleY);
end;

4. 触发缩放操作

在表单OnResize事件中调用缩放函数,确保窗口大小变化时自动适配:

procedure TForm1.FormResize(Sender: TObject);
begin
  // 重新计算当前窗口的缩放比例
  FScaleX := Self.Width / BASE_WIDTH;
  FScaleY := Self.Height / BASE_HEIGHT;
  
  ScaleControl(Self, FScaleX, FScaleY);
end;

额外注意事项

  • 带滚动条的容器(比如TScrollBox),需要单独调整其ClientWidth和ClientHeight,避免滚动条异常。
  • TImage控件如果设置了Stretch=True,可以自动缩放图片,无需额外处理;固定尺寸的图标则需要同步调整显示比例。
  • 若缩放后字体模糊,可结合Screen.PixelsPerInch做精度调整,或直接使用矢量字体。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 19:20:49