delphi 在FMX中将TRect转换为TRectF

uqjltbpv  于 2022-11-04  发布在  其他
关注(0)|答案(2)|浏览(251)

我试图在FMX.Forms中使用SetBounds()的重载函数,将Screen.Displays[index].BoundsRect作为参数传递。然而,由于 Delphi 11 BoundsRect似乎返回了TRectF而不是TRect
我正在寻找一种方法来转换这个TRectF到一个TRect,这样我就可以把它传递给SetBounds()

px9o7tmv

px9o7tmv1#

@SilverWarior的答案(以及@AndreasRejbrand的注解)解释了如何将TRectF转换为TRect,以便可以将其与TForm.SetBounds()方法(或TForm.Bounds属性)一起使用。
我只想提一下,沿着TDisplay.BoundsRectTRect更改为TRectF, Delphi 11还引入了一个新的TForm.SetBoundsF()方法和一个新的TForm.BoundsF属性,这两个方法都通过TRectF获取浮点坐标,而不是通过TRect获取整数坐标。
因此,您根本不需要将坐标从浮点数转换为整数,只需更新代码逻辑以调用不同的方法/属性即可,例如:
D11前:

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);
biswetbf

biswetbf2#

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()中的一个或多个。

相关问题