使用DXE2,我编写了一个表单生成器,可以创建.pas和.dfm文件。我正在编写一个例程,允许我修改dfm中的不同属性,例如Font.Height和TabOrder。
当我在记事本中打开生成的文件时,一切看起来都与我期望的完全一样。当我在Delphi中打开它时,属性会发生变化!令人沮丧的是我使用最初在Delphi IDE中设计的表单作为我的模板。我不明白为什么德尔福不会尊重我的简单改变......
例如,原始的Font.Height是-11。我在dfm中读到,将其更改为-17,然后保存。在记事本中,它显示-17。当我在Delphi中打开它时,它显示为-21!
非常感谢任何想法/提示/建议!
答案 0 :(得分:16)
我的猜测是,您机器上的PixelsPerInch
与.dfm文件中存储的值不匹配。当Delphi读取.dfm文件时,它将根据.dfm文件PixelsPerInch
与您机器当前PixelsPerInch
的比例缩放任何维度。
PixelsPerInch
的典型值为96dpi和120dpi。请注意17*120/96 = 21
。
现在,对于TabOrder
,IDE将始终在连续值中写出表单顺序。因此,如果.dfm文件中缺少任何值,则IDE将写出TabOrder
值的不同版本。
请注意,您无法让Delphi单独保留.dfm文件。一旦您对设计空间进行任何修改并保存表单,Delphi将以其首选格式对其进行流式处理。
这实际上是.dfm文件处理方式的不可避免的后果。 IDE从不直接编辑.dfm文件,就像处理.pas文件一样。而是读取.dfm文件,创建在表单上定义的组件,并分配其属性。当需要再次保存.dfm文件时,会要求组件自行流出。因此,保存设置的基础模型是IDE拥有的TComponent
实例(通常是表单),而不是.dfm文件。
答案 1 :(得分:3)
我做的是让IDE进行它想要的更改,并使用Tortoise {HG,SVN等} + KDIFF3来审查(使用其合并功能)并仅提交我所做的更改,将那些更改转换为IDE让我不想保留。
步骤:
转到版本控制系统的提交对话框。
对于列表中的每个DFM,右键单击“View Diff”或“Visual Diff”或调用版本控制应用程序中的view-differences命令。
你的差异工具会出现。我使用KDIFF3,但有些人使用BeyondCompare。我点击“合并 - >合并当前文件”,然后我还原所有我不想要的更改。
保存合并结果。提交它。
相信我,DFM的疯狂是你会惊讶的。每次打开DFM并对其进行更改时,其中的每个TImageList都将被修改,为您在版本控制系统中提交产生差异,如果您的团队中有多个开发人员,那么您就可以保证“合并冲突“。开始练习“DFM卫生”,你以后会感谢自己。当您像这样进行手动合并时,您基本上决定保留或恢复将被提交到版本控制系统的增量的每个“大块”。下面显示的“冲突”实际上是“A或B选择”。按Ctrl + 1选择A,按Ctrl + 2选择B,然后继续。您可以快速完成大量意外更改,仅保留您打算进行的更改,然后提交您的DFM。