一位拥有成功的 Delphi 7 应用程序的客户最近联系了一些更新。在从事该项目时,我再次注意到一些长期以来困扰我的事情。
通常,只需打开并查看 VCL 表单,就会在签入时显示 git 更改,如下所示:
- ItemHeight = 25
+ ItemHeight = 0
在其他时候,情况可能恰恰相反:
- ItemHeight = 0
+ ItemHeight = 19
通常
ItemHeight
字段没有变化。
这似乎只影响
TComboBox
控件。 Height
控件的TComboBox
由其字体的Height
和其他属性决定。据我所知,签入更改或恢复并不重要 - 在运行时显示完全相同的行为。恢复更改是我通常做的事情,但如果有数十个更改,这会很乏味。
对于是否会发生变化、在何处发生变化,以及变化将走向何方,没有明显的模式。通常,切换发生在区域中的
TComboBox
控件或从未查看过的 TTabSheet
页面上。
注意:IDE 中没有对表单进行任何实质性修改,除了奇怪的
TPageControl.ActivePage
属性或添加 TLabel
等微小更改。
我的问题相关:
有没有办法阻止历史中这些“噪音”的变化?
据我所知。
这是 Delphi 7 中的一个错误,但在更高版本的 Delphi 和 VCL 中已解决吗?
不。这是因为当没有分配句柄时,通过消息检索
ItemHeight
,该消息返回 0。这在来源中有记录:
function TCustomComboBox.GetItemHt: Integer;
begin
if FStyle in [csOwnerDrawFixed, csOwnerDrawVariable] then
Result := FItemHeight
else
Result := Perform(CB_GETITEMHEIGHT, 0, 0); // returns 0 if Handle = 0
end;
如果控件在设计过程中不可见(即因为它位于非活动选项卡上),则句柄很可能为 0。