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」out への呼び出しを最適化するためです。
- 実際、IsBarButton(bar.Buttons[i]) は IsBarButton 関数 (以下で定義) に対して false です。
- bar.Buttons[i].Name は、DFM で TPanel に付けた名前です
- デバッグで値 bar.Buttons[i] を調べる:
- 実際の TToolButton にはない「キャプション」プロパティがあります。
- 奇妙なことに、TToolButton.Indeterminate (=true) のように、TToolButton が持っているすべてのプロパティを持っています。
IsToolButton:
function IsToolButton(X : TObject) : boolean;
begin
Result := X is TToolButton;
end;
したがって、bar.Buttons[i] は TToolButton である場合とない場合があります...どうしたのですか?
(一番下の話は、自分の TPanel を本物の TToolButton と区別したいということです。これは多かれ少なかれハックな方法で行うことができます。ここでこの質問をすることで、ここで実際に何が起こっているのかをより完全に理解することが私の目標です。)
質問: 何が起こっていますか? サブ質問: TPanel を TToolBar に追加することは正当ですか?