TCustomControlを継承したコンポーネントを作成しています。
このコンポーネントは Graphics::TBitmapをプロパティとして持っています。
CustomControlのCanvasはこのBitmapをPaintメソッドで描画します。
実際にこのコンポーネントをフォームに貼り付け、Glyphに適当な画像を
読み込ませると、設計時にはビットマップがきちんと表示されていますが、
実行時に以下の例外が出ます。
例外クラス EReadError ( メッセージ '不正なプロパティのパスです' )を送出しました。
RoundButton1->Glyph.Data の読み込み中のエラー
そしてアプリケーションが終了してしまいます。
Glyphに画像を読み込ませていなければエラーにはならず起動します。
また、設計時Glyphに画像を設定した状態でBDSを終了させ、
再度BDSを起動しようとした時にも同じエラーが出ます。
エラーを無視して起動すると、Glyphの値は何も設定されてない状態になります。
TBitmapを__publishedなプロパティに持たせる場合、何か特別な処理が
必要なのでしょうか?
以下、必要そうなところのソースを抜粋しました。
何かあればご指摘願います。
--TRoundButton.h--
class PACKAGE TRoundButton : public TCustomControl
{
protected:
Graphics::TBitmap *FGlyph;
void __fastcall SetGlyph(Graphics::TBitmap *Value);
__property Graphics::TBitmap *Glyph = { read=FGlyph, write=SetGlyph };
};
--TRoundButton.cpp--
__fastcall TRoundButton::TRoundButton(TComponent* Owner)
: TCustomControl(Owner)
{
FGlyph = NULL;
}
void __fastcall TRoundButton::SetGlyph(Graphics::TBitmap *Value)
{
if( FGlyph == NULL )
{
FGlyph = new Graphics::TBitmap;
}
FGlyph->Assign( Value );
FGlyph->Transparent = FTransparent;
Paint();
}
昼から3時間以上悩んでいよいよMLに・・・と出した質問でしたが、
出した直後に自己解決できました(^^;)
原因はコンストラクタで FGlyphをnewしていない事でした。
デバッガでいろいろ追いかけててわかったのですが、
dfmからデータを自動で拾ってくる時はプロパティのreadは呼ばれず
もっと下のレベルで読み込みが行われていたんですね。
なのでSetGlyphを通らずおかしな事になっていたようでした。
お騒がせしました。