我有一个用Delphi 6编写的应用程序,并在Windows XP上编译。 通常我会在控件和表单的边之间留下8像素的空闲空间。
当这个应用程序在Vista或Win 7上运行,这个差距更小或根本不存在。 我认为这可能是因为这些版本的Windows有更厚的forms边界。
现在我正在将应用程序移到Delphi 2007中。在表单devise器中,表单已经失去了底部和右边的空白。
我该如何处理? 我有几百个表格,不想改变他们。 另外,我们大多数用户在Win XP上运行这个应用程序,所以我不想让它在XP中看起来不好。
简短版本:将所有窗体更改为AutoScroll = False
问题是表单的AutoScroll
属性,以及它如何影响DFM中存储的表单大小。
如果AutoScroll
为true (默认),DFM将存储Width
和Height
:
object Form1: TForm1 Left = 192 Top = 114 Width = 544 Height = 375 Caption = 'Form1' ...
如果AutoScroll
为false ( 首选设置),则DFM将存储ClientWidth
和ClientHeight
:
object frmSplash: TfrmSplash Left = 192 Top = 114 ClientWidth = 536 ClientHeight = 348 Caption = 'Form1'
存储Height
的问题是当用户的标题栏与您的开发机器不同时发生的情况,例如
Windows 2000有一个4像素的边框,有一个23像素的标题栏。 随着DFM存储Height
375,这留下348px的表单客户区。
在Windows XP上运行相同的程序,该程序具有较高(28像素)的标题栏。 随着DFM存储375像素的Height
,这留下343px的客户区。
你的表格“缩短了5个像素”。
您需要强制Delphi通过关闭AutoScroll
来将ClientWidth
和ClientHeight
存储在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;
但这对我来说是值得的。