Ica*_*aro 2 forms delphi recursion position delphi-xe
我发现自己处在一个棘手的情况下,我有一个应用程序,它有一个嵌入表单的表单,嵌入一个表单,嵌入一个表单......(你得到了图片).
我试图找到其中一个表单的中间部分(即easy(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个表格相互嵌入.我在想一个递归的电话; 问题是并非所有对象都是表单,它们是表单,选项卡,面板等的混合.
什么是优雅的解决方法?
这个怎么样:
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;
Run Code Online (Sandbox Code Playgroud)
或者是Remy Lebeau建议的组合版本:
FUNCTION CenterOfFormAsScreenCoords(F : TForm) : TPoint;
BEGIN
Result:=F.ClientToScreen(Point(F.Width DIV 2,F.Height DIV 2))
END;
Run Code Online (Sandbox Code Playgroud)
和更通用的版本(由Craig Young建议):
FUNCTION GetCenterOfControlAsScreenCoords(C : TControl) : TPoint;
BEGIN
Result:=C.ClientToScreen(Point(C.Width DIV 2,C.Height DIV 2))
END;
Run Code Online (Sandbox Code Playgroud)
或作为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;
Run Code Online (Sandbox Code Playgroud)