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

Delphi游戏开发:全屏时Panel与网格图片比例适配问题求助

Delphi游戏全屏后Panel与网格图片比例适配问题

调试时正常布局

我正在为10年级的PAT项目开发一款Delphi游戏。由于是首次接触Delphi,我尚不掌握StringGrid的使用方法,因此采用一张图片作为游戏网格,并在每个网格中放置独立的Panel。调试时布局显示正常,但切换至全屏模式后,Panel虽仍处于对应网格内,但其尺寸与图片的比例却无法保持初始设置状态,恳请提供解决方案。感谢您的帮助。

全屏后比例失调


解决方案

核心思路

通过监听窗体尺寸变化事件,实时计算网格图片缩放后的单元格尺寸,同步调整所有Panel的位置与大小,确保始终与网格单元格匹配。

具体步骤

  1. 配置网格图片控件

    • 将作为网格背景的图片放入TImage控件,设置Align属性为alClient,让图片铺满整个窗体;
    • 开启TImage的Stretch属性,保证图片缩放时保持原有比例。
  2. 编写窗体尺寸变化事件代码
    在窗体的OnResize事件中添加以下逻辑(以5行5列网格为例,需根据你的实际网格行列数调整):

procedure TForm1.FormResize(Sender: TObject);
var
  CellWidth, CellHeight: Integer;
  Row, Col: Integer;
  TargetPanel: TPanel;
  BorderOffset: Integer;
begin
  // 计算单个网格单元格的基础尺寸
  CellWidth := Image1.ClientWidth div 5;
  CellHeight := Image1.ClientHeight div 5;

  // 如果Panel有边框,计算偏移量(比如BevelWidth为2时,每个方向减2)
  BorderOffset := Panel1.BevelWidth * 2;

  // 遍历所有Panel,调整位置与大小
  for Row := 1 to 5 do
    for Col := 1 to 5 do
    begin
      // 根据命名规则查找对应Panel(示例命名为Panel_行号_列号)
      TargetPanel := FindComponent('Panel_' + IntToStr(Row) + '_' + IntToStr(Col)) as TPanel;
      if Assigned(TargetPanel) then
      begin
        TargetPanel.Left := Image1.Left + (Col - 1) * CellWidth;
        TargetPanel.Top := Image1.Top + (Row - 1) * CellHeight;
        // 减去边框偏移量,避免Panel超出网格
        TargetPanel.Width := CellWidth - BorderOffset;
        TargetPanel.Height := CellHeight - BorderOffset;
      end;
    end;
end;
  1. 额外优化建议
    • 若Panel命名规则不同,可将所有Panel放入一个TList或数组中管理,避免通过名称查找;
    • 全屏切换时手动调用一次FormResize方法,确保布局立即更新;
    • 测试时调整不同分辨率的全屏模式,验证适配效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 20:20:26