[cbuilder:40050] TBitmapプロパティのデータ保存、読み込みの方法

11 views
Skip to first unread message

Mifuji

unread,
Nov 21, 2008, 2:04:51 AM11/21/08
to cbui...@sfdata.ne.jp
こんにちわ、三藤です。

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();
}


Mifuji

unread,
Nov 21, 2008, 2:52:24 AM11/21/08
to cbui...@sfdata.ne.jp
こんにちわ、三藤です。

昼から3時間以上悩んでいよいよMLに・・・と出した質問でしたが、
出した直後に自己解決できました(^^;)

原因はコンストラクタで FGlyphをnewしていない事でした。
デバッガでいろいろ追いかけててわかったのですが、
dfmからデータを自動で拾ってくる時はプロパティのreadは呼ばれず
もっと下のレベルで読み込みが行われていたんですね。
なのでSetGlyphを通らずおかしな事になっていたようでした。

お騒がせしました。


Reply all
Reply to author
Forward
0 new messages