一个窗口定位的问题是这样的:
我在Form1上有一个Edit1,旁边放一个小按钮,(这里是一个比方,实际上我是使用RzButtonEdit实现的)
我现在在按钮点击时,弹出另一个窗口Form2.我在Form1中得到Edit1的top和left值:
i := self.left + Edit1.left;
j := self.top + Edit1.top + Edit1.Height;然后在点击按钮时,将i,j值传入Form2,
即:Form2.left := i;
Form2.top := j;为什么窗口总是偏高一部分,而不是刚好在Edit1的下方出现。
我在Form1上有一个Edit1,旁边放一个小按钮,(这里是一个比方,实际上我是使用RzButtonEdit实现的)
我现在在按钮点击时,弹出另一个窗口Form2.我在Form1中得到Edit1的top和left值:
i := self.left + Edit1.left;
j := self.top + Edit1.top + Edit1.Height;然后在点击按钮时,将i,j值传入Form2,
即:Form2.left := i;
Form2.top := j;为什么窗口总是偏高一部分,而不是刚好在Edit1的下方出现。
Pt: TPoint;
begin
Pt.X := Edit1.left;
Pt.Y := Edit1.top + Edit1.Height;
Pt := ClientToScreen(Pt);
Form2.left := Pt.X ;
Form2.top := Pt.Y;
Form2.Show;
下面这个函数是我以前写的,用于调整弹出式窗体的坐标位置的。
procedure AdjustDropDownForm(AControl : TControl; HostControl: TControl);
var
WorkArea: TRect;
HostP, PDelpta: TPoint;
begin
SystemParametersInfo(SPI_GETWORKAREA,0,@WorkArea,0);
HostP := HostControl.ClientToScreen(Point(0,0));
PDelpta := AControl.ClientToScreen(Point(0,0)); AControl.Left := HostP.x;
AControl.Top := HostP.y + HostControl.Height + 1; if (AControl.Width > WorkArea.Right - WorkArea.Left) then
AControl.Width := WorkArea.Right - WorkArea.Left; if (AControl.Left + AControl.Width > WorkArea.Right) then
AControl.Left := WorkArea.Right - AControl.Width;
if (AControl.Left < WorkArea.Left) then
AControl.Left := WorkArea.Left;
if (AControl.Top + AControl.Height > WorkArea.Bottom) then begin
if (HostP.y - WorkArea.Top > WorkArea.Bottom - HostP.y - HostControl.Height) then
AControl.Top := HostP.y - AControl.Height;
end; if (AControl.Top < WorkArea.Top) then begin
AControl.Height := AControl.Height - (WorkArea.Top - AControl.Top);
AControl.Top := WorkArea.Top;
end; if (AControl.Top + AControl.Height > WorkArea.Bottom) then begin
AControl.Height := WorkArea.Bottom - AControl.Top;
end;
end;使用方法如下:
procedure TForm1.Button1Click(Sender: TObject);
begin
AdjustDropDownForm(Form2, Edit1);
Form2.ShowModal;
end;