1

TChromeTabs に奇妙な問題があります。簡単なものに違いないことはわかっていますが、修正するために何をする必要があるかわかりません。

最初に TChromeTabs コントロールをフォームにドロップすると、完全に透明になります。コントロールを切り取ってフォームに貼り付けると、内容が正しく表示されます。フォームを閉じてから再度開くと、内容も表示されます。

なぜこれが起こっているのかわからないので、実際にコードサンプルを提供することはできません. ただし、ソース コードはhttp://code.google.com/p/delphi-chrome-tabs/downloads/listからダウンロードできます。

4

1 に答える 1

4

ペイントを無効にしているため、コントロールはそれ自体をペイントしません。コンストラクター呼び出し、BeginUpdateメソッドが呼び出されるまで呼び出しませんEndUpdateLoaded。ただし、永続化された状態からコントロールをロードLoadedするときにのみ呼び出されます。通常、これはコントロールが DFM ファイルからロードされたときと考えられますが、IDE は同じ手法を使用してコントロールをクリップボードに配置できるようにします。

明らかに、事前に作成されたデモ プロジェクトを開いてコントロールをテストするだけなので、これに気付きませんでした。デモ プロジェクトの DFM ファイルにはコントロールがあるため、実行する唯一のコード パスは DFM ケースです。コントロールが最初にフォームにドロップされたとき、またはコントロールがコードで「動的に」作成されたときなど、コンストラクターが直接呼び出されるパスは実行しません。

これを修正するには、コンストラクターBeginUpdate呼び出しを取り除くことから始めます。代わりに、コントロールがまだ作成中かどうかを確認するには、 を確認してくださいcsCreating in ControlState

状態を取り除くこともできますstsLoading。Delphi はすでにそれを提供していcsLoadingますComponentState。また、 の場合と同じように、コンストラクターで設定するstsLoadingため、 の使用は間違っています。BeginUpdate

呼び出されることに依存する代わりに、特定のコードをメソッドLoadedに移動したい場合があります。AfterConstructionコンポーネントの作成後に実行する必要があるが、DFM (または他の永続化ソース) からのプロパティの読み込みとは関係のないコードをそこに配置します。あなたのメソッドに本当にそこに属するものがあるどうかはわかりません。Loadedそのほとんどすべてがコンストラクターで発生できるはずです。

CreateWndその方法も知っておく必要があります。コントロールのウィンドウ ハンドルが割り当てられたときに呼び出されます。ここで、ペイント操作の実行を許可する必要があります。ウィンドウ ハンドルがない場合は、何も描画できません。

于 2013-01-04T16:38:44.830 に答える