Delphi 我如何让德尔福离开我的DFM?

Delphi 我如何让德尔福离开我的DFM?,delphi,delphi-xe2,Delphi,Delphi Xe2,使用DXE2,我编写了一个表单生成器,可以创建.pas和.dfm文件。我正在开发一个例程,它允许我修改dfm中的不同属性,例如Font.Height和TabOrder 当我在记事本中打开生成的文件时,一切看起来都和我期望的一样。当我在Delphi中打开它时,属性就改变了!令人沮丧的是,我使用了一个最初在DelphiIDE中设计的表单作为模板。我不明白为什么Delphi不尊重我的简单更改 例如,原始字体高度为-11。我读入dfm,将其更改为-17,然后保存它。在记事本中,它显示-17。当我在Del

使用DXE2,我编写了一个表单生成器,可以创建.pas和.dfm文件。我正在开发一个例程,它允许我修改dfm中的不同属性,例如Font.Height和TabOrder

当我在记事本中打开生成的文件时,一切看起来都和我期望的一样。当我在Delphi中打开它时,属性就改变了!令人沮丧的是,我使用了一个最初在DelphiIDE中设计的表单作为模板。我不明白为什么Delphi不尊重我的简单更改

例如,原始字体高度为-11。我读入dfm,将其更改为-17,然后保存它。在记事本中,它显示-17。当我在Delphi中打开它时,它显示为-21


如有任何想法/提示/建议,将不胜感激

我的猜测是,您机器上的
pixelsprench
与.dfm文件中存储的值不匹配。当Delphi读取.dfm文件时,它将根据.dfm文件
PixelsPerInch
和您机器当前的
PixelsPerInch
的比率缩放任何尺寸

PixelsPerInch
的典型值为96dpi和120dpi。请注意
17*120/96=21

现在,对于
TabOrder
,IDE将始终以连续值写出表单顺序。因此,如果.dfm文件中缺少任何值,那么IDE将写出不同版本的
TabOrder

请注意,您无法让Delphi单独保留.dfm文件。对设计空间进行任何修改并保存表单后,Delphi将以其首选格式将其导出


这实际上是处理.dfm文件的方式不可避免的后果。IDE从未像对.pas文件那样直接编辑.dfm文件。相反,它在中读取.dfm文件,创建表单上定义的组件,并分配它们的属性。当需要再次保存.dfm文件时,将要求组件流式输出它们自己。因此保存设置的底层模型是IDE拥有的一个
TComponent
实例(通常是一个表单),而不是.dfm文件。

我要做的是让IDE做它想做的更改,并使用Tortoise{HG,SVN,etc}+KDIFF3来查看(使用它的合并功能)并只提交我所做的更改,逆转IDE制造的那些我不想保留的东西

步骤:

  • 转到版本控制系统的“提交”对话框

  • 对于列表中的每个DFM,右键单击并“查看差异”或“视觉差异”或版本控制应用程序中调用的“查看差异”命令

  • 您的diff工具将出现。我使用KDIFF3,但有些人使用BeyondCompare。我单击“合并->合并当前文件”,然后还原它所做的所有我不想要的更改

  • 保存合并结果。承诺吧

  • 相信我,DFMs的疯狂会让你大吃一惊。每次打开DFM并对其进行更改时,其中的每一个TImageList都将被修改,从而为您在版本控制系统中的提交创造了差异,如果您的团队中有超过1名开发人员,您几乎可以保证“合并冲突”。开始练习“DFM卫生”,你以后会感谢自己的。当您执行类似这样的手动合并时,您基本上决定保留或还原将提交到您的版本控制系统中的每个“大块”增量。下面显示的“冲突”实际上是“A或B选择”。按Ctrl+1选择A,按Ctrl+2选择B,然后继续。您可以快速完成大量意外更改,只保留您打算进行的更改,然后提交DFM


    arrggg!!!因此,基本上,如果我要继续滚动我自己的表单,我应该完全不使用IDE?即使当你的
    PixelsPerInch
    匹配时,这种流入流出的方法也会造成很多混乱
    TImageList
    是最严重的违规者,由于MS Common Control内部的原因,这是不可避免的。最终,许多开发人员发现,在提交每个版本控制之前,他们需要DFM审查。(见我的答案)我设想可以建立一个工具来审查DFM更改并恢复意外更改。也许我会造一个。@WarrenP是的,我知道所有关于。dfm地狱。我总是在提交前进行回顾。对我来说,我发现我的自定义组件有时会丢失其属性,当它位于一个框架内时,即.dfm文件中的继承关键字。谁将它们的图像保存在.dfm文件中?资源是唯一的选择。从资源加载ImageList是一个非常好的主意。出于这样的原因,我一直在过渡到使用它们。但这确实扼杀了你的设计时间乐趣,不是吗?如果在设计时尚未加载图像,您将如何设计和布局UI并直观地选择图像?此外,在DFMs中使用SQL硬编码的TQuery类型组件确实是邪恶的,应该用火杀死,除非是第0天,您只是在进行原型设计。我们在这里使用的是使用资源名称的自定义图像列表,它工作得很好,并促进跨图像列表共享资源。另一方面,这意味着您还需要制作自己的图像列表编辑器(带有资源预览,因为您无法使用文件资源管理器了解所选内容);那将是一篇很酷的博客文章。(带有资源预览的自定义图像列表编辑器。)如果您有时间,请在您的博客或其他地方发布一个带有示例的链接。@EricGrange-可以从其他地方下载marvel吗?:-)