短版:所有形式的改变为AutoScroll = False
问题是窗体的AutoScroll
性质,以及它如何影响其形态大小存储在DFM。
如果AutoScroll
是真(默认值)的DFM将存储Width
和Height
:
object Form1: TForm1
Left = 192
Top = 114
Width = 544
Height = 375
Caption = 'Form1'
...
如果AutoScroll
是假(所述优选设定)DFM将存储ClientWidth
和ClientHeight
:
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存储一个Height
的375像素,这会为客户区留下343像素。
您的表格“缩短了5个像素”。
您需要强制德尔福将AutoScroll
关闭,以将ClientWidth
和ClientHeight
存储在DFM中。
现在,当您在Windows XP上创建348像素高的表单时,它将在客户区中继续保持348像素 - 然而,要有标题栏则需要额外的高度。
我走那么远,有一个OutputDebugString
和断点触发如果我的助手库代码发现任何形式的错误有AutoScroll
设置为真正。
编辑:因为我想做个优秀的开发人员,我让我的形式的尊重用户的字体偏好。在我的所有形式的OnCreate
我所说的StandardizeForm(Self)
功能:
- 缩放的形式来匹配用户的默认字体大小
- 变化上的所有控件的字体形式,以用户的喜好
- 问题消耗臭氧层物质,如果形式设置错误地设置为
Scaled
- 问题的ODS和断点如果
AutoScroll
真(并将其设置为false)
- 问题的ODS如果断点
ShowHint
是假的(上并开启)
- 等
你可以做类似的事情。是的,你必须补充:
procedure TCustomerEditForm.FormCreat(Sender: TObject);
begin
StandardizeForm(Self); //Pay your taxes!
...
end;
但它是值得的我。
还有别的东西你没有告诉我们。我最近从d6移植到d2010并且没有这种麻烦 – 2011-06-02 11:43:44
您或您是否尝试过使用Manifest?也许你可以指定XP兼容模式? – Tom 2011-06-02 11:57:36
@DavidHeffernan“这种邪恶的东西来了”。 只要碰壁,TForm.ClientWidth在Win8.x上返回一个完全疯狂的结果,无论DPI如何。 – 2017-03-28 09:56:32