在改变表格大小后重新定位表格

时间:2013-03-07 06:29:49

标签: delphi resize

我有一个有两个选项的组合框,两个选项是触发表单大小调整。我的想法是隐藏并根据选择显示其他控件。

当我更改表单宽度时,大小会根据需要更改,但表单现在不再位于屏幕中央。我可以在改变表格宽度的同时来回移动表格的XY位置吗?

procedure TReportFrm.SpecialFilesComboBoxChange(Sender: TObject);
begin
  if(SpecialFilesComboBox.ItemIndex = 0) then begin
    //No special files
    Width := 412;
    Height := 423;
    ...
  end
  else begin
    //Yes special files
    Width := 893;
    Height := 423;
    ...
  end;
end;

2 个答案:

答案 0 :(得分:6)

一个非常简单的ReCenter功能可能如下所示:

procedure TReportFrm.ReCenter;
var
  LRect: TRect;
  X, Y: Integer;
begin
  LRect := Screen.WorkAreaRect;
  X := LRect.Left + (LRect.Right - LRect.Left - Width) div 2;
  Y := LRect.Top + (LRect.Bottom - LRect.Top - Height) div 2;
  SetBounds(X, Y, Width, Height);
end;

procedure TReportFrm.SpecialFilesComboBoxChange(Sender: TObject);
begin
  if(SpecialFilesComboBox.ItemIndex = 0) then begin
    //No special files
    Width := 412;
    Height := 423;
    ...
  end
  else begin
    //Yes special files
    Width := 893;
    Height := 423;
    ...
  end;
  ReCenter;
end;

它将窗口居中到屏幕的WorkArea,您可能希望将其居中于其他参考,在这种情况下,由您决定有意义的矩形。

答案 1 :(得分:6)

现在,多监视器系统很常见。放置在屏幕的中心可以将表格分布在多个监视器上。这是不可取的。

所以我将表格放在显示器上:

R := Form.Monitor.WorkAreaRect;
Form.Left := (R.Left+R.Right-Form.Width) div 2;
Form.Top := (R.Top+R.Bottom-Form.Height) div 2;

正如@bummi指出的,你可以写:

Form.Position := poScreenCenter;

这几乎可以按照您的意愿运作。我将表格放在屏幕上。但是,它总是选择默认监视器。因此,使用该代码可能会导致您的表单被移动到我认为永远不可取的不同监视器上。

相反,迫使表格到中心,你可以决定在各方面增长或缩小它:

procedure TReportFrm.SpecialFilesComboBoxChange(Sender: TObject);
var
  NewLeft, NewTop, NewWidth, NewHeight: Integer;
begin
  if(SpecialFilesComboBox.ItemIndex = 0) then begin
    //No special files
    NewWidth := 412;
    NewHeight := 423;
    ...
  end
  else begin
    //Yes special files
    NewWidth := 893;
    NewHeight := 423;
    ...
  end;

  NewLeft := Left + (Width-NewWidth) div 2;
  NewTop := Top + (Top-NewHeight) div 2;
  NewBoundsRect := Rect(NewLeft, NewTop, NewLeft+NewWidth, NewTop+NewHeight);
  BoundsRect := NewBoundsRect;
end;

如果你想变得非常可爱,你可以调整边界矩形,这样新尺寸和定位的形状就不会偏离显示器的边缘。

procedure MakeAppearOnScreen(var Rect: TRect);
const
  Padding = 24;
var
  Monitor: HMonitor;
  MonInfo: TMonitorInfo;
  Excess, Width, Height: Integer;
begin
  Monitor := MonitorFromPoint(Point((Rect.Left+Rect.Right) div 2, (Rect.Top+Rect.Bottom) div 2), MONITOR_DEFAULTTONEAREST);
  if Monitor=0 then begin
    exit;
  end;
  MonInfo.cbSize := SizeOf(MonInfo);
  if not GetMonitorInfo(Monitor, @MonInfo) then begin
    exit;
  end;
  Width := Rect.Right-Rect.Left;
  Height := Rect.Bottom-Rect.Top;

  Excess := Rect.Right+Padding-MonInfo.rcWork.Right;
  if Excess>0 then begin
    dec(Rect.Left, Excess);
  end;
  Excess := Rect.Bottom+Padding-MonInfo.rcWork.Bottom;
  if Excess>0 then begin
    dec(Rect.Top, Excess);
  end;
  Excess := MonInfo.rcWork.Left+Padding-Rect.Left;
  if Excess>0 then begin
    inc(Rect.Left, Excess);
  end;
  Excess := MonInfo.rcWork.Top+Padding-Rect.Top;
  if Excess>0 then begin
    inc(Rect.Top, Excess);
  end;
  Rect.Right := Rect.Left+Width;
  Rect.Bottom := Rect.Top+Height;
end;

然后上一个代码示例将改变如下:

NewBoundsRect := Rect(NewLeft, NewTop, NewLeft+NewWidth, NewTop+NewHeight);
MakeAppearOnScreen(NewBoundsRect);
BoundsRect := NewBoundsRect;