一个窗口定位的问题是这样的: 
我在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的下方出现。

解决方案 »

  1.   

    var
      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;
      

  2.   

    需要使用ClientToScreen函数进行坐标转换一下的。
    下面这个函数是我以前写的,用于调整弹出式窗体的坐标位置的。
    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;