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
文件添加了 ExplicitWidth
和 ExplicitHeight
属性 - 但我们不知道为什么。
我的问题是:
这些属性有什么用? 为什么 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 在内部使用的只读属性。在应用程序中使用宽度,从而允许读写访问。 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 程序员会使用 Lazarus 作为 IDE 而不是使用 Delphi 的 IDE? [关闭]