我有两种形式,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);
但我认为可以采用更好的方式
答案 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;