如何处理从Delphi 6和WinXP到Delphi 2007和Vista / Win7的表单大小问题

时间:2011-06-02 11:33:33

标签: windows delphi forms size border

我有一个用Delphi 6编写的应用程序,并在Windows XP上编译。通常我会在控件和表单边缘之间留出8px的空白。

当此应用程序在Vista或Win 7上运行时,此差距较小或根本不存在。我想这可能是因为这些版本的Windows具有较厚的边框形式。

现在我正在将应用程序迁移到Delphi 2007.在表单设计器中,表单已经失去了底部和右边的空白。

我该如何处理?我有数百种表格,不想改变它们。此外,我们的大多数用户在Win XP上运行应用程序,因此我不想让它在XP中看起来很糟糕。

1 个答案:

答案 0 :(得分:11)

简短版本:将所有表单更改为AutoScroll = False


问题是表单的AutoScroll属性,以及它如何影响在DFM中存储的表单大小。

如果AutoScroll 为真(默认值),则DFM将存储WidthHeight

object Form1: TForm1
  Left = 192
  Top = 114
  Width = 544
  Height = 375
  Caption = 'Form1'
  ...

如果AutoScroll false 首选设置),则DFM将存储ClientWidthClientHeight

object frmSplash: TfrmSplash
  Left = 192
  Top = 114
  ClientWidth = 536
  ClientHeight = 348
  Caption = 'Form1'

存储Height的问题是当用户的标题栏与开发机器的大小不同时会发生的问题,例如

  • 您在Windows 2000上开发,程序在Windows XP上运行
  • 您在Windows XP上开发,程序在Windows Vista上运行
  • 使用小字体开发,使用大字体运行程序

Windows 2000有一个4像素的边框,带有23像素的标题栏。 DFM存储{37}的Height,这为表单客户区留下348px。

在Windows XP上运行相同的程序,Windows XP具有更高的(28像素)标题栏。 DFM存储375像素的Height,这为客户区留下了343px。

您的表单“缩短了5个像素”。

您需要强制Delphi通过关闭ClientWidthClientHeightAutoScroll存储在DFM中。

现在,当您在Windows XP上创建348px高的表单时,它将在客户端区域中继续保留348像素 - 但是如果需要额外的高,则需要一个标题栏。

如果我的帮助库代码发现任何错误地将OutputDebugString设置为 true 的表单,我甚至会有AutoScroll和断点触发器。


编辑:因为我试图成为一名优秀的开发者,所以我的表单会尊重用户的字体偏好。在我所有表单的OnCreate期间,我调用StandardizeForm(Self)函数:

  • 缩放表单以匹配用户的默认字体大小
  • 将表单上所有控件上的字体更改为用户的首选项
  • 如果表单设置错误地设置为Scaled ,则
  • 发布ODS
  • 如果AutoScroll为真,则发出ODS和断点(并将其设置为false)
  • 如果ShowHint为假(并将其打开)
  • ,则会发出ODS和断点

你可以做类似的事情。是的,你必须添加:

procedure TCustomerEditForm.FormCreat(Sender: TObject);
begin
   StandardizeForm(Self); //Pay your taxes!
   ...
end;

但这对我来说是值得的。