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