【実現したいこと】
C++BuilderでButtonクラスにColorプロパティを追加した自作コンポーネントを作成したい.
理由は背景色を変更したいからです.
【現在の状況・困っていること】
Buttonクラスを継承した「TDoorButton」クラスを作成後,「FColor」フィールドの追加,「Color」プロパティ(SetColor, GetColor)を追加したまではいいのですが,自作コンポーネントのテストでチェックボックスをクリックしたら,TDoorButtonクラスのボタンの背景色が変わるようにコーディングしたのですが,ボタンの背景色が変わらないくて困っています.なにか処理が足りないのでしょうか?それとも処理が間違っているのでしょうか?ご指導お願いいたします.
【試したこと】
各メソッドにブレークポイントをはって処理の流れは確認しました.
1.チェックボックスにチェックを入れる.
2.ClickCheckBoxClickイベントに処理が移り,チェックボックスの状態によりボタンのColorプロパティに色情報が設定される.(ClickCheckBoxClick)
3.Colorプロパティに色情報が設定されるとSetColorメソッドに処理が移り,ColorプロパティにTColorの色情報を設定する.(SetColor)
4.ボタンの背景色も変更する.
【変更箇所】
回答をいただき,プログラムを次のように変更.下記のように修正したのですが,ボタンの色が変更せず,何も動作しなくて困っています.
1.FColorフィールド,Colorプロパティを削除してFBrushフィールド,Brushプロパティ,GetBrushメソッドを追加した.
2.TButtonクラスのpublicプロパティにBrushプロパティがあることが分かったので,1で追加したBrushフィールドやプロパティ,メソッドをコメント化した.
3.ClickCheckBoxClickイベントでBrushプロパティのColorプロパティを変更するように修正.
【開発環境】
OS:Windows10 64bit
C++Builder10.2 Community Edition
フォーム画面には
・ボタン(Name:Button1),パネル(Name:Panel1),チェックボックス(Name:ClickCheckBox)コンポーネントを張り付けています.
ソースコードは次の通りです.
<Unit.cpp>
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "DoorButton.h" #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { DoorButton = new TDoorButton(this); DoorButton->Parent = this; DoorButton->Left = 32; DoorButton->Top = 140; DoorButton->Height = 40; DoorButton->Width = 100; DoorButton->Caption = "DoorButton"; Panel1->Color = clRed; } //--------------------------------------------------------------------------- void __fastcall TForm1::ClickCheckBoxClick(TObject *Sender) { if( ClickCheckBox->Checked == true ) { DoorButton->Brush->Color = clRed; } else { DoorButton->Brush->Color = clBtnFace; } } //---------------------------------------------------------------------------
<Unit.h>
//--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <System.Classes.hpp> #include <Vcl.Controls.hpp> #include <Vcl.StdCtrls.hpp> #include <Vcl.Forms.hpp> #include <Vcl.ExtCtrls.hpp> //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE で管理されるコンポーネント TButton *Button1; TPanel *Panel1; TCheckBox *ClickCheckBox; void __fastcall ClickCheckBoxClick(TObject *Sender); private: // ユーザー宣言 public: // ユーザー宣言 __fastcall TForm1(TComponent* Owner); TDoorButton *DoorButton; }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif
<DoorButton.cpp(TButtonクラスを継承した作成中のコンポーネント)>
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "DoorButton.h" #pragma package(smart_init) //--------------------------------------------------------------------------- // ValidCtrCheck は、作成したコンポーネントに純粋仮想関数が // ないことを確認するために使用します。 // static inline void ValidCtrCheck(TDoorButton *) { new TDoorButton(NULL); } //--------------------------------------------------------------------------- __fastcall TDoorButton::TDoorButton(TComponent* Owner) : TButton(Owner) { } //--------------------------------------------------------------------------- namespace Doorbutton { void __fastcall PACKAGE Register() { TComponentClass classes[1] = {__classid(TDoorButton)}; RegisterComponents(L"Samples", classes, 0); } } //--------------------------------------------------------------------------- /* TBrush* __fastcall TDoorButton::GetBrush() { return Brush; } */ //---------------------------------------------------------------------------
<DoorButton.h>
//--------------------------------------------------------------------------- #ifndef DoorButtonH #define DoorButtonH //--------------------------------------------------------------------------- #include <System.SysUtils.hpp> #include <System.Classes.hpp> #include <Vcl.Controls.hpp> #include <Vcl.StdCtrls.hpp> //--------------------------------------------------------------------------- class PACKAGE TDoorButton : public TButton { private: // TBrush *FBrush; // TBrush* __fastcall GetBrush(); protected: // void __fastcall CreateParams(Controls::TCreateParams & Params); public: __fastcall TDoorButton(TComponent* Owner); __published: // __property TBrush *Brush = { read=GetBrush }; }; //--------------------------------------------------------------------------- #endif
回答1件
あなたの回答
tips
プレビュー