我试图在FMX.Forms中使用SetBounds()的重载函数,将Screen.Displays[index].BoundsRect作为参数传递。然而,由于 Delphi 11 BoundsRect似乎返回了TRectF而不是TRect。我正在寻找一种方法来转换这个TRectF到一个TRect,这样我就可以把它传递给SetBounds()。
FMX.Forms
SetBounds()
Screen.Displays[index].BoundsRect
BoundsRect
TRectF
TRect
px9o7tmv1#
@SilverWarior的答案(以及@AndreasRejbrand的注解)解释了如何将TRectF转换为TRect,以便可以将其与TForm.SetBounds()方法(或TForm.Bounds属性)一起使用。我只想提一下,沿着TDisplay.BoundsRect从TRect更改为TRectF, Delphi 11还引入了一个新的TForm.SetBoundsF()方法和一个新的TForm.BoundsF属性,这两个方法都通过TRectF获取浮点坐标,而不是通过TRect获取整数坐标。因此,您根本不需要将坐标从浮点数转换为整数,只需更新代码逻辑以调用不同的方法/属性即可,例如:D11前:
TForm.SetBounds()
TForm.Bounds
TDisplay.BoundsRect
TForm.SetBoundsF()
TForm.BoundsF
MyForm.Bounds := Screen.Displays[index].BoundsRect; or MyForm.SetBounds(Screen.Displays[index].BoundsRect);
D11后:
MyForm.BoundsF := Screen.Displays[index].BoundsRect; or MyForm.SetBoundsF(Screen.Displays[index].BoundsRect);
biswetbf2#
TRect和TRectF之间的唯一区别是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()中的一个或多个。
System.Math
Floor()
Ceil()
2条答案
按热度按时间px9o7tmv1#
@SilverWarior的答案(以及@AndreasRejbrand的注解)解释了如何将
TRectF
转换为TRect
,以便可以将其与TForm.SetBounds()
方法(或TForm.Bounds
属性)一起使用。我只想提一下,沿着
TDisplay.BoundsRect
从TRect
更改为TRectF
, Delphi 11还引入了一个新的TForm.SetBoundsF()
方法和一个新的TForm.BoundsF
属性,这两个方法都通过TRectF
获取浮点坐标,而不是通过TRect
获取整数坐标。因此,您根本不需要将坐标从浮点数转换为整数,只需更新代码逻辑以调用不同的方法/属性即可,例如:
D11前:
D11后:
biswetbf2#
TRect
和TRectF
之间的唯一区别是TRect
将其坐标存储为整数值,而TRectF
将其坐标存储为浮点值。因此,您所要做的就是将存储在TRectF
中的浮点值转换为整数值,方法如下:注意:根据您的情况,您可能需要使用
System.Math
单位中提供的其他两种舍入方法:Floor()
或Ceil()
中的一个或多个。