Delphi - 在TLabel位置打开窗口

时间:2011-03-27 08:22:47

标签: delphi

我有两种形式,Form1和Form2 我在Form1上有一个TLabel,它是一个调用Form2.show的onclick事件;

我想要做什么,如果弄清楚如何让form2在标签中间的标签下面显示5px :) Form2很小,只显示一些选项。

我可以使用鼠标位置,但它不够好。

我在想像

这样的东西
// Set top - add 20 for the title bar of software
Form2.Top := Form1.Top + Label1.Top + Label1.Height + 20;
// Set the Left
Form2.Left := Form1.Left + Label1.Left + round(Label1.Width / 2) - round(form2.Width/2);

但我认为可以采用更好的方式

4 个答案:

答案 0 :(得分:3)

您需要使用其父级的坐标系设置Form2的坐标。假设Parent是桌面(因为你试图补偿标题栏的高度),这可以做到:

procedure ShowForm;
var P: TPoint;
begin
  // Get the top-left corner of the Label in *screen coordinates*. This automatically compensates
  // for whatever height the non-client area of the window has.
  P := Label1.ScreenToClient(Label1.BoundsRect.TopLeft);
  // Assign the coordinates of Form2 based on the translated coordinates (P)
  Form2.Top := P.Y + 5; // You said you want it 5 pixels lower
  Form2.Left := P.X + 5 + (Label1.Width div 2); // Use div since you don't care about the fractional part of the division
end;

你需要根据你的居中要求调整Form2的定位代码,我不太明白你想要什么。当然,如果框架或面板足够,那就更好了!仔细看看Guillem的解决方案。

答案 1 :(得分:3)

procedure TForm2.AdjustPosition(ARefControl: TControl);
var
  LRefTopLeft: TPoint;
begin
  LRefTopLeft := ARefControl.ScreenToClient(ARefControl.BoundsRect.TopLeft);

  Self.Top := LRefTopLeft.Y + ARefControl.Height + 5;
  Self.Left := LRefTopLeft.X + ((ARefControl.Width - Self.Width) div 2);
end;

然后您可以让表单相对于任何所需的控件进行自我调整,如下所示:

Form2.AdjustPosition(Form1.Label1);

答案 2 :(得分:2)

你真的需要Form2作为表格吗?您可以选择创建包含Form2逻辑的框架,并使用隐藏的TPanel作为其父级。当用户点击Label1时,您会显示该面板。

如下所示。当您创建Form1或单击Label1时(根据您的需要):

 Frame := TFrame1.Create(Self);
 Frame.Parent := Panel1;

在Label1的OnClick事件中:

Panel1.Top  := Label1.Top + 5;
Panel1.Left := Label1.Left + round(Label1.Width / 2) - round(form2.Width/2);
Panel1.Visible := true;

完成用户后,再次隐藏面板(必要时销毁框架)。如果在用户使用Form1时保持Frame处于活动状态,请记住在离开表单时将其释放。

HTH

答案 3 :(得分:1)

ClientOrigin属性将在屏幕坐标中返回lebel的左上角,因此您无需手动确定它:

var
  Pt: TPoint;
begin
  Pt := Label1.ClientOrigin;
  Form2.Left := Pt.X + Round(Label1.Width / 2) - Round(Form2.Width/2); 
  Form2.Top := Pt.Y + Label1.Height + 5;
end;