Windowsデスクトップのアイコンを模倣するVCLコンポーネント、TGIconを作成しています.MouseEnterおよびMouseLeaveイベントをコンポーネントに追加することを決定するまで、正常に機能していました。私は次のガイドに従いました: Embarcadero Community
ここに私のコード(ヘッダー)があります:
class PACKAGE TGIcon : public TGraphicControl
{
private:
AnsiString FCaption;
TPngImage *FIcon, *FDIcon;
TFont *FFont;
TNotifyEvent FOnMouseEnter;
TNotifyEvent FOnMouseLeave;
void __fastcall CMMouseEnter(TMessage &Message);
void __fastcall CMMouseLeave(TMessage &Message);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(CM_MOUSEENTER, TMessage, CMMouseEnter)
MESSAGE_HANDLER(CM_MOUSELEAVE, TMessage, CMMouseLeave)
END_MESSAGE_MAP(TGIcon)
protected:
virtual void __fastcall Paint();
void __fastcall SetCaption(AnsiString value);
void __fastcall SetIcon(TPngImage *value);
void __fastcall SetFont(TFont *value);
public:
__fastcall TGIcon(TComponent* Owner);
__fastcall ~TGIcon();
void __fastcall MakeGray(void);
__published:
__property AnsiString Caption = {read=FCaption, write=SetCaption, nodefault};
__property TPngImage *Icon = {read=FIcon, write=SetIcon};
__property TFont *Font = {read=FFont, write=SetFont};
__property Parent;
__property Enabled;
__property OnClick;
__property TNotifyEvent OnMouseEnter = {read=FOnMouseEnter, write=FOnMouseEnter};
__property TNotifyEvent OnMouseLeave = {read=FOnMouseLeave, write=FOnMouseLeave};
};
コンポーネントをフォームに配置しようとすると、IDE (C++ Builder Starter) がデスクトップにクラッシュします。問題の原因が「BEGIN_MESSAGE_MAP...END_MESSAGE_MAP」の部分であることを突き止めました。その部分をコメントアウトすると、コンポーネントは正常に動作します。
以前は C++Builder XE5 (Professional) で同じコンポーネントが動作していましたが、それはもう使用していない会社が所有しているため、コンポーネントのバイナリがないため、ここに書き直す必要があります。 . 私が覚えている限り、私が行ったことは XE5 で書いたものとまったく同じです。これは機能しますが、これは IDE をクラッシュさせ、エラー メッセージもアクセス違反もなく、単純な CTD でした。
C++ Builder 10.1 (Berlin) Starter Edition でこれを機能させるために必要なことはありますか? これは C++Builder のバグですか、それとも Starter Edition では実行できず、「有料」版でしか実行できないのですか?? それとも、この方法はすでに時代遅れですか?もしそうなら、「近代化された」C++ Builder がどのようにそれを行うかを教えてください。
前もって感謝します。