【问题标题】:Why form is not auto-sized for current resolution?为什么表单不针对当前分辨率自动调整大小?
【发布时间】:2013-12-20 17:19:25
【问题描述】:

我有一个 Firemonkey HD 应用程序并将其部署在 iPad 2 上。 工作正常。

当我在配备 Retina 显示屏的 iPad 4 上部署相同的应用程序时,我遇到了问题。

关键是我在表单上有一些绘图操作,需要准确的表单宽度和高度。

ShowMessage('form wh = ' + FloatToStr(TForm(FImage.Parent.Parent). Width) + ':' + FloatToStr(TForm(FImage.Parent.Parent).Height));

在两台设备上我都会收到一条消息:

form wh = 1024:748

我需要的是自动更改表单大小。

我应该怎么做才能得到它?

更新:我尝试使用 Screen.Size.Width 但在 Retina 显示屏上具有 Screen.Size.Width=1024。我做错了什么?

【问题讨论】:

  • 表单应该是全屏的(自动调整大小以匹配屏幕)。在视网膜屏幕和非视网膜屏幕之间,大小将是相同的,只是比例发生了变化。您能否更详细地描述该问题或包含该问题的图片?
  • 是的,当然。表格是全屏的。对我来说奇怪的是我有 Screen.Size.Width=1024 和 Screen.Size.Height=768。你想得到什么细节。我会为他们提供快乐。
  • 由于表单是全屏的,显然是自动调整大小的。实际问题是什么?这个? docwiki.embarcadero.com/RADStudio/XE5/en/…
  • 最近的解决方案在这里stackoverflow.com/questions/20124191/…。但是当我尝试获取屏幕结构时,我得到一个访问冲突(0x000000)异常......
  • 等等,你的意思是 SupportsPlatformService 调用在该代码中返回 True ,如果你然后尝试访问 ScreenSvc 接口,它会因访问冲突而失败?这将是一个严重的错误,因为该代码中提供的方式是正确的方式......

标签: ios delphi retina-display firemonkey delphi-xe5


【解决方案1】:

关于“更新”,您需要考虑“设备”像素数与“逻辑”像素数之间的差异。通常,“视网膜”显示器在物理上并不比非“视网膜”显示器大(或者,如果是,那与“视网膜”本身无关) - 相反,它具有更高的分辨率。此外,这种更高分辨率的意义不是将更多控件(视图)塞入相同的物理屏幕尺寸 - 而是使显示更清晰,近距离减少“块状”。

因此,逻辑像素的数量(用于调整控件大小的单位)不会仅仅因为“视网膜”显示器而增加。这就是为什么IFMXScreenService.GetScreenSize 使用“视网膜”和非“视网膜”显示器返回相同结果的原因。但是,IFMXScreenService 有另一种方法,GetScreenScale,您可以使用它来导出以“设备”像素为单位的屏幕尺寸:

uses FMX.Platform;

function GetScreenSizeInDevicePixels: TPointF;
var
  Service: IFMXScreenService;
begin
  Service := IFMXScreenService(
    TPlatformServices.Current.GetPlatformService(IFMXScreenService));
  Result := Service.GetScreenSize * Service.GetScreenScale;
end;

【讨论】:

  • 是的,您使用 GetScreenScale() 的方式对我来说没问题。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2011-04-10
  • 2014-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-17
  • 2011-05-14
  • 2014-02-02
相关资源
最近更新 更多