AsuYuHomepage
トップページ サイトの説明 子供の成長記録 JM BAR Delphi リンク集
Home>>プログラミング>>Tips&Tricks>>VCL継承コンポーネントをインストールなしで使う
Delphi Tips
Delphi Win32API
ダウンロード

Delphi Tips & Tricks

VCL継承コンポーネントをインストールなしで使う

 基本的にコンポーネントはインストールして使うのですが、このコードを使えば、設計時に貼り付けておいた継承元のコントロールを実行時に継承コンポーネントに入れ替えることができます。 標準コントロールのウィンドウスタイルを変えたコンポーネントを使いたいときに重宝しそうです。便利そうなので紹介させていただきました。今回の例は標準でテキスト左寄せのTEditを右寄せテキストのTREditに入れ替えています。
 元ネタはDelFusaBlog コンポーネントをインストールせずに使う方法です。
//テキスト右寄せTEdit
type
  TREdit =class(TEdit)
   protected
     procedure CreateParams(var params :TCreateParams); override;
   public
     constructor CreateEX(Origin :TEdit);
   end;
-----------------------------------------------------------------------
constructor TREdit.CreateEX(Origin :TEdit);
var
  MS :TMemoryStream;
begin
  Create(Origin.Owner);
  Self.Parent :=Origin.Parent;

  MS :=TMemoryStream.Create;
   try
     //継承元の情報をメモリストリームに書き込む
     MS.WriteComponent(Origin);
      //継承元を解放
     Origin.Free;
     MS.Position :=0;
     //継承先コンポに継承元の情報を読み込む
     MS.ReadComponent(Self);
   finally
    MS.Free;
   end;
end;

procedure TREdit.CreateParams(var params :TCreateParams);
begin
 inherited CreateParams(params);
 //ES_RIGHTを加え右寄せにする
 params.Style :=params.Style or ES_RIGHT;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  //フォーム作成時に入れ替え
  Edit1 :=TREdit.CreateEX(Edit1);
end;

 継承コンポーネントを定義しておき、そのコンストラクタで継承元を破棄しそのコンポーネント情報を受け取っています。フォームのクリエイトイベントで継承元のコントロールを引数にとり、継承コンポーネントのインスタンスをつくればいいわけです。
 この方法なら少しだけイベントを追加したり、スタイルを変更したコンポーネント数多くインストールすることなく、使うことができます。DelFusaBlogでは他のマシンへの移行時などに便利だと記載してありました。
 テキストの表示スタイルは、ES_RIGHT(右寄せ)のほかにもES_CENTER(水平方向で中央寄せ)、ES_LEFT(左寄せ:デフォルト)があります。