我发现自己处在一个棘手的情况下,我有一个应用程序,其中有一个表单嵌入在表单中,嵌入在表单中,嵌入在表单中......(你得到了图片)。
我正在尝试找到其中一个表单的中间位置(很容易(Self.Width div 2
)和(Self.Height div 2
),右)。然后是相对于屏幕的位置(也很容易(Self.Width div 2) + Self.Left
和(Self.Height div 2) + Self.Top)
。
问题是这个表单嵌入了另一种形式,所以我得到了
(Self.Width div 2) + Self.Left + Self.Parent.Left
和
(Self.Height div 2) + Self.Top + Self.Parent.Top
问题是我有6到8个表格相互嵌入。我在想一个递归的电话;问题是并非所有对象都是表单,它们是表单,标签,面板等的混合。
解决它的优雅方法是什么?
答案 0 :(得分:6)
这个怎么样:
FUNCTION CenterOfFormAsScreenCoords(F : TForm) : TPoint;
BEGIN
Result:=F.ClientToScreen(Point(0,0));
Result:=Point(Result.Left+F.Width DIV 2,Result.Top+F.Height DIV 2)
END;
或合并版本,如Remy Lebeau所建议的那样:
FUNCTION CenterOfFormAsScreenCoords(F : TForm) : TPoint;
BEGIN
Result:=F.ClientToScreen(Point(F.Width DIV 2,F.Height DIV 2))
END;
和更一般的版本(由Craig Young建议):
FUNCTION GetCenterOfControlAsScreenCoords(C : TControl) : TPoint;
BEGIN
Result:=C.ClientToScreen(Point(C.Width DIV 2,C.Height DIV 2))
END;
或作为CLASS HELPER:
TYPE
TControlHelper = CLASS HELPER FOR TControl
FUNCTION CenterAsScreenCoords : TPoint;
END;
FUNCTION TControlHelper.CenterAsScreenCoords : TPoint;
BEGIN
Result:=ClientToScreen(Point(Width DIV 2,Height DIV 2))
END;