ペイントを無効にしているため、コントロールはそれ自体をペイントしません。コンストラクターで呼び出し、BeginUpdate
メソッドが呼び出されるまで呼び出しませんEndUpdate
Loaded
。ただし、永続化された状態からコントロールをロードLoaded
するときにのみ呼び出されます。通常、これはコントロールが DFM ファイルからロードされたときと考えられますが、IDE は同じ手法を使用してコントロールをクリップボードに配置できるようにします。
明らかに、事前に作成されたデモ プロジェクトを開いてコントロールをテストするだけなので、これに気付きませんでした。デモ プロジェクトの DFM ファイルにはコントロールがあるため、実行する唯一のコード パスは DFM ケースです。コントロールが最初にフォームにドロップされたとき、またはコントロールがコードで「動的に」作成されたときなど、コンストラクターが直接呼び出されるパスは実行しません。
これを修正するには、コンストラクターでBeginUpdate
呼び出しを取り除くことから始めます。代わりに、コントロールがまだ作成中かどうかを確認するには、 を確認してくださいcsCreating in ControlState
。
状態を取り除くこともできますstsLoading
。Delphi はすでにそれを提供していcsLoading
ますComponentState
。また、 の場合と同じように、コンストラクターで設定するstsLoading
ため、 の使用は間違っています。BeginUpdate
呼び出されることに依存する代わりに、特定のコードをメソッドLoaded
に移動したい場合があります。AfterConstruction
コンポーネントの作成後に実行する必要があるが、DFM (または他の永続化ソース) からのプロパティの読み込みとは関係のないコードをそこに配置します。あなたのメソッドに本当にそこに属するものがあるかどうかはわかりません。Loaded
そのほとんどすべてがコンストラクターで発生できるはずです。
CreateWnd
その方法も知っておく必要があります。コントロールのウィンドウ ハンドルが割り当てられたときに呼び出されます。ここで、ペイント操作の実行を許可する必要があります。ウィンドウ ハンドルがない場合は、何も描画できません。