查找嵌入表单中的表单的屏幕位置,嵌入表单中,

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个表格相互嵌入.我在想一个递归的电话; 问题是并非所有对象都是表单,它们是表单,选项卡,面板等的混合.

什么是优雅的解决方法?

Hea*_*are 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;
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)

  • 你可以通过将Form的中心坐标直接传递给`ClientToScreen()`来简化它:`Result:= F.ClientToScreen(Point(F.Width div 2,F.Height div 2));` (3认同)