Delphi - 为什么.DFM文件中会出现ExplicitWidth和ExplicitHeight,这是什么意思?

41
我们注意到在更新检查时,我们的.DFM文件会添加ExplicitWidth和ExplicitHeight属性,但我们不知道为什么。
我的问题是:
1.这些属性是用来干什么的? 2.为什么Delphi会自动添加它们?
下面是一个示例,显示了添加的ExplicitWidth属性:
object Splitter2: TcxSplitter
    Left = 0
    Top = 292
    Width = 566
    Height = 8
    Cursor = crVSplit
    HotZoneClassName = 'TcxXPTaskBarStyle'
    AlignSplitter = salBottom
    Control = BottomPanel
    Color = clBtnFace
    ExplicitWidth = 8
end

Delphi文档说了什么? :P - mjn
15
你是认真建议我去看说明书吗?那有什么乐趣可言呢?另外我要补充一下,我正在使用Delphi 2007,所以我仍在等待帮助文件加载。我想问Stack Overflow可能更快些! - Pauk
2
@Mjustin,帮助文档中写道:ExplicitWidth 是 Delphi 内部使用的只读属性。在应用程序中使用 Width,从而允许读写访问。 http://docwiki.embarcadero.com/VCL/en/Controls.TControl.ExplicitWidth - Rob Kennedy
3
我刚好确实看了那份文档。我得到的只有这样一句话:“这是 ExplicitWidth,属于 TControl 类的一个成员。”所以感谢 Rob。 :) - Disillusioned
2
经常情况下,RTFM就是一项解密模糊、写得很差的手册的练习。大公司会将这些分配给中国,所以你通常会看到一个英语很差的中国人打出这些手册。我在这里搜索同样的问题。我在办公室和家庭办公室都使用C++ Builder,当我来回复制代码时,也会发生这种情况。我没有改变锚点。一个IDE会把它们放进去,另一个会把它们拿出来。 - Eric
4个回答

40

10
我使用它并非出于兼容性原因,而是为了使我的DFM更小,源代码控制的差异更少。 - Uli Gerhardt
3
我喜欢这个,因为像Ulrich一样,它使源代码更新不再困扰我们。但愿我能把答案分成这个和JamesB的答案! - Pauk
问题在于,除非每个编辑 dfm 文件的人也安装了 DDevExtensions,并且打开了相应选项,否则每次保存文件时都会产生更多的差异。 - SoftDeveloper
完美解决方案。 已将扩展移至https://www.idefixpack.de/blog/ide-tools/ddevextensions/。 - ralfiii

31

从谷歌搜索....

原文在这里。

当Align或Anchor属性从其默认值更改时,Explicit属性会记住控件的先前边界。

仅当Align属性设置回其默认值alNone时,才不会编写Explicit属性。

这是控件实际上使用Explicit属性将其边界重置为以前的值的时候。


3
它们是您明确给出的尺寸,而不是由于对齐或锚定而隐含获取的尺寸。它们不一定是原始尺寸,因为您可能已经在创建控件和设置其对齐方式之间更改了它们。 - Rob Kennedy
14
这听起来很合理,但实际发生的情况并非如此:根据我的经验,在每次写入.dfm文件时,Delphi IDE会在Left/Right/Width/Height属性和它们的ExplicitXxx属性之间切换存储相同的值。这也适用于TComboBox的ItemHeight属性,其在0和13之间不断变化。当没有实际更改时,源代码控制在所有时间内都想提交对.dfm的更改,这变得非常烦人。 - dummzeuch
5
@dummzeuch,许多 Delphi 版本都表现出您提到的行为。这很烦人,因为它会使版本控制历史中的差异变得混乱。 - Jeroen Wiert Pluimers
是的,新的Explicit属性会自动被写入,无论我是否更改了Align或Anchor属性。它包含Explict = 0,版本控制历史记录现在显示无意义的更改。这正是使用Embarcadero令人讨厌的事情。 - Bizmarck

0

我遇到了很多噪音,这些噪音来自于这些东西的随机(消失)出现:

ExplicitLeft = 0
ExplicitTop = 0
ExplicitWidth = 0
ExplicitHeight = 0

所以我写了一个工具,只从DFM文件中删除这些(所有4个都存在且为0):

https://github.com/gonutz/dfm_clear_explicit_zeros


0
Delphi只有在已发布属性的值与默认值不同时,才会将其添加到DFM文件中,以增加其价值。
例如:
property ExplicitWidth: Integer read FExplicitWidth write FExplicitWidth default 1;

如果ExplicitWidth的值不为1,则会将其写入DFM文件中。 当“default”未定义时,任何值都将被写入DFM文件中。
TcxSplitter不是标准的Delphi组件,最好向其作者询问属性的目的。

6
我只是举了一个我手头有的例子,TcxSplitter。这种情况最常见的是在TForm中发生。 - Pauk

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