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

时间:2014-01-21 04:39:14

标签: forms delphi recursion position delphi-xe

我发现自己处在一个棘手的情况下,我有一个应用程序,其中有一个表单嵌入在表单中,嵌入在表单中,嵌入在表单中......(你得到了图片)。

我正在尝试找到其中一个表单的中间位置(很容易(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个表格相互嵌入。我在想一个递归的电话;问题是并非所有对象都是表单,它们是表单,标签,面板等的混合。

解决它的优雅方法是什么?

1 个答案:

答案 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;