在 FMX 中将 TRect 转换为 TRectF

Convert TRect to TRectF in FMX

我正在尝试在 FMX.Forms 中使用 SetBounds() 的重载函数,将 Screen.Displays[index].BoundsRect 作为参数传递。但是,由于 Delphi 11 BoundsRect 似乎 return 一个 TRectF 而不是 TRect.

我正在寻找一种方法将此 TRectF 转换为 TRect,以便我可以将其传递给 SetBounds()

TRectTRectF 之间的唯一区别是 TRect 将其坐标存储为整数值,而 TRectF 将其坐标存储为浮点值。因此,您所要做的就是通过执行以下操作将存储在 TRectF 中的浮点值转换为整数:

Rect.Left := Round(RectF.Left);
Rect.Right := Round(RectF.Right);
Rect.Top := Round(RectF.Top);
Rect.Bottom := Round(RectF.Bottom);

注意:根据您的情况,您可能希望使用 System.Math 单元中可用的其他两种舍入方法:Floor()Ceil()

(and 解释了如何将 TRectF 转换为 TRect 以便您可以将其与 TForm.SetBounds() 方法(或 TForm.Bounds 属性).

我只想提一下,随着 TDisplay.BoundsRectTRect 更改为 TRectF,Delphi 11 还引入了一个新的 TForm.SetBoundsF() method, and a new TForm.BoundsF 属性,两者都通过 TRectF 获取浮点坐标,而不是通过 TRect.

获取整数坐标

因此,您根本不需要将坐标从浮点数转换为整数。您只需要更新您的代码逻辑以调用不同的 method/property,例如:

D11 之前:

MyForm.Bounds := Screen.Displays[index].BoundsRect;
or
MyForm.SetBounds(Screen.Displays[index].BoundsRect);

Post-D11:

MyForm.BoundsF := Screen.Displays[index].BoundsRect;
or
MyForm.SetBoundsF(Screen.Displays[index].BoundsRect);