2011-06-02 40 views
6

我有一个用Delphi 6编写并在Windows XP上编译的应用程序。通常我会在控件和表单的边缘之间留出8px空闲空间。如何处理从Delphi 6和WinXP到Delphi 2007和Vista/Win7的表单大小问题

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

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

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

+2

还有别的东西你没有告诉我们。我最近从d6移植到d2010并且没有这种麻烦 – 2011-06-02 11:43:44

+0

您或您是否尝试过使用Manifest?也许你可以指定XP兼容模式? – Tom 2011-06-02 11:57:36

+0

@DavidHeffernan“这种邪恶的东西来了”。 只要碰壁,TForm.ClientWidth在Win8.x上返回一个完全疯狂的结果,无论DPI如何。 – 2017-03-28 09:56:32

回答

11

短版:所有形式的改变为AutoScroll = False


问题是窗体的AutoScroll性质,以及它如何影响其形态大小存储在DFM。

如果AutoScroll(默认值)的DFM将存储WidthHeight

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

如果AutoScroll(所述优选设定)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存储一个Height的375像素,这会为客户区留下343像素。

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

您需要强制德尔福将AutoScroll关闭,以将ClientWidthClientHeight存储在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; 

但它是值得的我。

+0

辉煌。谢谢。 – cja 2011-06-08 11:21:41

+0

另外,你为什么不拥有自己的免税表格课程? – cja 2011-06-08 11:22:34

+1

@cja:强制每个人都安装一个新的设计时间软件包几乎没有什么价值。这样做很容易。 – 2011-06-16 03:15:10

相关问题