Delphi - 为啥 ExplicitWidth 和 ExplicitHeight 不断出现在 .DFM 文件中,它是啥?

Posted

技术标签:

【中文标题】Delphi - 为啥 ExplicitWidth 和 ExplicitHeight 不断出现在 .DFM 文件中,它是啥?【英文标题】:Delphi - Why does ExplicitWidth and ExplicitHeight keep appearing in .DFM files and what is it?Delphi - 为什么 ExplicitWidth 和 ExplicitHeight 不断出现在 .DFM 文件中,它是什么? 【发布时间】:2011-01-29 10:05:27 【问题描述】:

我们注意到,在签入更新时,我们的 .DFM 文件添加了 ExplicitWidthExplicitHeight 属性 - 但我们不知道为什么。

我的问题是:

这些属性有什么用? 为什么 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 你是认真地建议我 RTFM 吗?现在这其中的乐趣在哪里?我应该补充一下,我正在使用 Delphi 2007,所以我仍在 等待 等待 Help 加载。我认为在 Stack Overflow 上提问会更快! @Mjustin,帮助说明:ExplicitWidth 是 Delphi 在内部使用的只读属性。在应用程序中使用 Width,从而允许读写访问。 docwiki.embarcadero.com/VCL/en/Controls.TControl.ExplicitWidth 碰巧我做过 RTFM。我得到的只有以下内容:“这是 ExplicitWidth,TControl 类的成员。” 谢谢 Rob。 :) RTFM 常常是一种解读模糊、写得不好的手册的练习。大公司把它外包给中国,所以你经常有一个不懂英语的中国人来输入这些手册。我来这里是为了寻找同样的问题。我在办公室和家庭办公室使用 C++ Builder,当我来回复制代码时,这也发生在我身上。我不改变主播。一个 IDE 将它们放入,另一个将它们取出。 【参考方案1】:

使用 DDevExtensions,您可以禁用在 dfm 中存储这些属性:http://andy.jgknet.de/blog/?page_id=10

添加 Explicit* 属性移除器以保持 DFM 文件与旧版 Delphi 兼容

【讨论】:

+1。我不是出于兼容性原因使用它,只是为了让我的 DFM 更小,源代码控制差异更少。 我喜欢这个,因为和 Ulrich 一样,它消除了我们在源代码更新上的烦恼。希望我能把这个答案和 JamesB 的答案分开! 事情是,除非每个将编辑您的 dfm 的人都安装了 DDevExtensions,并且打开了该选项,否则每次他们保存文件时都会有更多差异。【参考方案2】:

来自谷歌搜索......

Original article can be found here.

显式属性记住 之前的控件边界 Align 或 Anchor 属性是 从他们的默认值改变。

唯一一次显式属性 不写是当Align 属性设置回其默认值 alNone 的值。

这是当显式属性 实际由控件使用 将其界限重置为原来的样子 以前。

【讨论】:

它们是您显式提供给它们的尺寸,而不是它们由于对齐或锚定而隐含获得的尺寸。它们不一定是原始维度,您可能在创建控件和设置对齐时间之间更改了这些维度。 这听起来似乎有道理,但实际情况并非如此:根据我的经验,每次表单获取时,Delphi IDE 都会在存储相同值的 Left/Right/Width/Height 和 ExplicitXxx 对应项之间切换写入.dfm。这同样适用于 TComboBox 的 ItemHeight 属性,该属性在 0 和 13 之间变化并一直返回。当我的源代码控制想要将更改发布到 .dfm 而实际上并没有发生任何变化时,这会变得非常烦人。 @dummzeuch 许多德尔福版本都表现出您提到的行为。这很烦人,因为它使版本控制历史中的差异变得混乱。 是的,无论我是否更改了 Align 或 Anchor 属性,都会自动写入新的 Explicit* 属性。它包含 Explicit* = 0,版本控制历史现在显示无意义的更改。这正是使用 Embarcadero 令人讨厌的事情。【参考方案3】:

Delphi 仅在其值与默认值不同时才将已发布属性的值添加到 DFM 文件中。

例如:

property ExplicitWidth: Integer read FExplicitWidth write FExplicitWidth default 1;

如果 ExplicitWidth 值不为 1,那么它将被写入 DFM。 如果未定义“默认值”,则任何值都将写入 DFM。

TcxSplitter 不是标准的 Delphi 组件,你最好问问它的作者关于属性的用途。

【讨论】:

我只是将 TcxSplitter 列为我必须提供的示例。它最常发生在 TForm 上。【参考方案4】:

我遇到了很多来自这些随机(不)出现的噪音:

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

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

https://github.com/gonutz/dfm_clear_explicit_zeros

【讨论】:

以上是关于Delphi - 为啥 ExplicitWidth 和 ExplicitHeight 不断出现在 .DFM 文件中,它是啥?的主要内容,如果未能解决你的问题,请参考以下文章

delphi 第三方控件

Delphi - 为啥使用 VarArrayPut?

为啥 Delphi 程序员会使用 Lazarus 作为 IDE 而不是使用 Delphi 的 IDE? [关闭]

delphi程序中为啥运行后程序窗口不显示,进程中有

为啥某些 Delphi 组件需要“AOwner: TComponent”来构造它们?

为啥我在delphi安装了第三方控件却不能用?