在运行时更改Modal表单的位置

时间:2012-05-14 13:35:45

标签: delphi delphi-2007

我的Delphi 2007应用程序中有一个模态表单。我已经在表单上应用了MinHeight,MaxHeight,MinWidth和MaxWidth约束。

如果屏幕分辨率低于最小/最大约束,我想根据屏幕分辨率重新调整窗体大小并重新定位。

我在 OnCreate 事件处理函数中编写了以下代码来处理屏幕分辨率。

procedure TfrmMyForm.FormCreate(Sender: TObject);
var      
  WorkArea: TRect;
  iTitleHeight: Integer;
begin
  inherited;
  //-------------------------------------------------------------------
  //Adjust Height/Width of the form if min/max values 
  //don't fall under the current resolution.
  iTitleHeight := GetSystemMetrics(SM_CYCAPTION); //Height of titlebar
  WorkArea := Screen.WorkAreaRect;

  if(Self.Constraints.MinWidth > WorkArea.BottomRight.X) then
  begin
    if(Self.Constraints.MaxWidth > WorkArea.BottomRight.X) then
    begin
      Self.Constraints.MinWidth := WorkArea.BottomRight.X;
      Self.Constraints.MaxWidth := WorkArea.BottomRight.X;
      Self.Position := poDesigned;
      SetBounds(0,0,WorkArea.BottomRight.X, WorkArea.BottomRight.Y - 5);
    end
    else
    begin
      Self.Constraints.MinWidth := WorkArea.BottomRight.X;
    end;
  end;
  if(Self.Constraints.MinHeight > WorkArea.BottomRight.Y) then
  begin
    if(Self.Constraints.MaxHeight > WorkArea.BottomRight.Y) then
    begin
      Self.Constraints.MinHeight := WorkArea.BottomRight.Y - iTitleHeight;
      Self.Constraints.MaxHeight := WorkArea.BottomRight.Y;
      Self.Position := poDesigned;
      SetBounds(0,0,WorkArea.BottomRight.X, WorkArea.BottomRight.Y -  5);
    end
    else
    begin
      Self.Constraints.MinHeight := WorkArea.BottomRight.Y;
    end;
  end;
//-------------------------------------------------------------------
end;

在设计时我将 Position 属性设置如下

Position := poCentreScreen

现在,当屏幕分辨率较低时,我遇到三个问题,如1024x768和Min&最大高度/宽度约束值高于此分辨率。

我正在将 Position 属性更改为 poDesigned ,因为否则表单不会移动到我想要的位置。

当我在系统上运行我的应用程序时,它有双显示器,它会出乎意料地运行。

我还在表格的系统菜单中添加了一个自定义菜单项,当我在 OnCreate 中将位置属性更改为 poDesigned 时功能它重置系统菜单并删除自定义菜单项。

有没有办法在不修改 Position 属性的情况下重新调整和重新定位表单?

感谢您的期待。

0 个答案:

没有答案