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

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

当这个应用程序在Vista或Win 7上运行,这个差距更小或根本不存在。 我认为这可能是因为这些版本的Windows有更厚的forms边界

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

我该如何处理? 我有几百个表格,不想改变他们。 另外,我们大多数用户在Win XP上运行这个应用程序,所以我不想让它在XP中看起来不好。

Solutions Collecting From Web of "如何处理从Delphi 6和WinXP到Delphi 2007和Vista / Win7的表单大小问题"

简短版本:将所有窗体更改为AutoScroll = False


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

如果AutoScrolltrue (默认),DFM将存储WidthHeight

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

如果AutoScrollfalse首选设置),则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存储Height 375,这留下348px的表单客户区。

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

你的表格“缩短了5个像素”。

您需要强制Delphi通过关闭AutoScroll来将ClientWidthClientHeight存储在DFM中。

现在,当您在Windows XP上创建348像素高的表单时,它将在客户区中继续保持348像素 – 然而,额外的高度需要有一个标题栏。

我甚至有一个OutputDebugString和一个断点触发器,如果​​我的帮助器库代码发现任何错误地将AutoScroll设置为true的形式


编辑:因为我试图成为一个很好的开发人员,我使我的表单尊重用户的字体偏好。 在我所有表单的OnCreate ,我调用了一个StandardizeForm(Self)函数:

  • 缩放表格以匹配用户的默认字体大小
  • 将表单上的所有控件的字体更改为用户的偏好
  • 如果表单被错误地设置为Scaled则发出ODS
  • 如果AutoScroll true,则发出ODS和断点(并将其设置为false)
  • 如果ShowHint为false(并将其打开),则发出ODS和断点
  • 等等

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

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

但这对我来说是值得的。