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

cja*_*cja 6 forms windows delphi size border

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

当这个应用程序在Vista或Win 7上运行时,这个差距更小或根本不存在.我认为这可能是因为这些版本的Windows具有较厚的表单边框.

现在我将应用程序移动到Delphi 2007.在表单设计器中,表单已经失去了底部和右侧的差距.

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

Ian*_*oyd 11

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


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

如果AutoScrolltrue(默认值),DFM将存储Width并且Height:

object Form1: TForm1
  Left = 192
  Top = 114
  Width = 544
  Height = 375
  Caption = 'Form1'
  ...
Run Code Online (Sandbox Code Playgroud)

如果AutoScrollfalse(首选设置),DFM将存储ClientWidth并且ClientHeight:

object frmSplash: TfrmSplash
  Left = 192
  Top = 114
  ClientWidth = 536
  ClientHeight = 348
  Caption = 'Form1'
Run Code Online (Sandbox Code Playgroud)

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

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

Windows 2000有一个4像素的边框,带有23像素的标题栏.使用存储Height375 的DFM ,这为表单客户区留下了348px.

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

你的表格"缩短了5个像素".

您需要强制Delphi 通过关闭来存储ClientWidth和存储ClientHeight在DFM中AutoScroll.

现在,当您在Windows XP上创建348px高的表单时,它将在客户端区域中继续保留348像素 - 但是需要超高才能拥有标题栏.

OutputDebugString如果我的帮助库代码找到任何错误AutoScroll设置为true的表单,我甚至会有一个和一个断点触发器.


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

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

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

procedure TCustomerEditForm.FormCreat(Sender: TObject);
begin
   StandardizeForm(Self); //Pay your taxes!
   ...
end;
Run Code Online (Sandbox Code Playgroud)

但这对我来说是值得的.