如何让Delphi不再修改我的DFM文件?

14
使用DXE2,我编写了一个窗体生成器,可以创建.pas和.dfm文件。 我正在开发一种例程,以允许我修改dfm中的不同属性,例如Font.Height 和 TabOrder。
当我在记事本中打开生成的文件时,所有内容都与我期望的完全相同。但是当我在Delphi中打开它时,属性会被更改!最令人沮丧的是,我使用的是 Delphi IDE 中设计的窗体作为我的模板。我不明白为什么Delphi不会尊重我的简单更改...
例如,原始Font.Height为-11。我从dfm中读取它,将其更改为-17,并保存。在记事本中,它显示为-17。但在Delphi中打开后,它显示为-21!
有任何想法/提示/建议将不胜感激!
2个回答

16

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

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

至于TabOrder,IDE将始终按连续的值编写表单顺序。因此,如果在.df文件中有任何缺失值,则IDE将编写TabOrder值的不同版本。

请注意,您无法让Delphi保持不对.df文件进行任何更改。一旦您对设计空间进行任何修改并保存表单,Delphi就会以其首选格式流式传输它。

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


ARRRGGG!!!所以,基本上,如果我要继续使用自己的表单,我应该完全不使用IDE? - skippix
2
即使您的“PixelsPerInch”匹配,流入流出的方法也会导致很多混乱。TImageList是最糟糕的罪犯,这种情况在MS Common Controls内部是不可避免的。最终,许多开发人员发现他们需要在每个版本控制提交之前进行DFM审查。(请参见我的答案)我想象一种工具来审查DFM更改并撤消意外更改,可以构建。也许我会建立一个。 - Warren P
1
@WarrenP 是的,我了解 .dfm 的困境。我总是在提交之前进行审查。对我来说,我发现当我的自定义组件被放置在框架内时,有时会丢失其属性,即在 .dfm 文件中继承关键字。 - David Heffernan

3
我所做的是让IDE进行任何想要的更改,然后使用Tortoise{HG,SVN,等} + KDIFF3进行审核(使用其合并功能),仅提交我所做的更改,撤销IDE所做但我不想保留的更改。
步骤:
1. 进入您版本控制系统的提交对话框。 2. 对于列表中的每个DFM,请右键单击“查看差异”或“可视化差异”,或者在您的版本控制应用程序中称为查看差异命令的选项。 3. 您的差异工具将出现。我使用KDIFF3,但有些人使用BeyondCompare。我点击“合并->合并当前文件”,然后我还原它所做的所有我不想要的更改。 4. 保存合并结果。提交它。
相信我,DFMs的疯狂程度会让你惊讶。每次打开DFM并进行更改时,其中的每个TImageList都将被修改,从而在您的版本控制系统中创建差异,并且如果您的团队中有多个开发人员,则几乎可以保证会出现“合并冲突”。开始练习“DFM卫生”,以后你会感谢自己。当您像这样进行手动合并时,基本上是决定保留或还原每个差异的“块”,这些差异将提交到您的版本控制系统中。下面显示的“冲突”实际上是“A或B选择”。按Ctrl + 1选择A,按Ctrl + 2选择B,然后继续。您可以快速浏览大量意外更改,仅保留您打算进行的更改,然后提交您的DFM。

3
谁会将他们的图像存储在.dfm文件中?资源是唯一可行的途径。 - David Heffernan
2
从资源中加载ImageLists是一个非常好的想法。我一直在转向使用这些东西,因为它有这样的优点。但是这会破坏你的设计时乐趣,不是吗?当在设计时还未加载图像时,如何设计和布局UI并选择图像呢?此外,在DFMs中硬编码SQL的TQuery类型组件真的很邪恶,应该用火烧死它们,除非是第0天,你只是原型制作。 - Warren P
5
这里使用的是使用资源名称的自定义图像列表,它运行良好并促进了在不同图像列表之间共享资源。不过,缺点是你需要自己制作图像列表编辑器(带有资源预览,因为你无法使用文件浏览器来确定你正在选择什么)。 - Eric Grange
2
Eric;这将是一篇很酷的博客文章。(自定义图像列表编辑器,带资源预览。)如果你有时间,请在你的博客或其他地方发布一个样例链接。 - Warren P
2
@EricGrange - 那个漫威的可下载版本在哪里可以找到? :-) - Leonardo Herrera
显示剩余12条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接