当 Delphi (2006) 进入量子状态时:我有一个看起来既是 TToolBar 又是 TPanel 的“东西”,这取决于你如何观察它。我想了解发生了什么。
以下是如何创建它以及会发生什么:
在 DFM 中
- 添加一个名为 bar 的 TToolBar;
- 在那个 TToolBar 中,放一个 TPanel。
在代码中和运行时:
- 面板出现在按钮列表 bar.Buttons[] 中,假设在索引 i
- bar.Buttons[i],从编译器的角度来看,是一个 TToolButton
- bar.Buttons[i].ClassName = 'TPanel'
- (bar.Buttons[i] is TToolButton) = true,但这是编译器优化对“is”的调用;
- 确实 IsBarButton(bar.Buttons[i]) 对于函数 IsBarButton 是错误的(定义如下);
- bar.Buttons[i].Name 是我在 DFM 中给 TPanel 起的名字
- 在调试中检查值 bar.Buttons[i]:
- 它有一个真正的 TToolButton 没有的属性“Caption”
- 奇怪的是,它具有 TToolButton 的所有属性,例如 TToolButton.Indeterminate (=true)。
工具按钮:
function IsToolButton(X : TObject) : boolean;
begin
Result := X is TToolButton;
end;
所以 bar.Buttons[i] 既是又不是 TToolButton... 怎么了?
(底部的故事是我想将我的 TPanel 与真正的 TToolButton 区分开来。我可以用或多或少的黑客方式来做到这一点。我在这里提出这个问题的目的是更全面地了解这里真正发生的事情。)
问题:发生了什么?子问题:将 TPanel 添加到 TToolBar 是否合法?