Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2010年03月17日] [更新 2010年03月17日] コンポーネントのインストール方法(登録方法)等
コンポーネントの登録方法等
コンポーネントをインストールしないで利用・動作確認
動作確認等 -







実行時に生成して使用する


コンポーネントは多くの場合,実行時に生成して使用すれば,コンポーネントのインストール (登録) をする必要がありません.コンポーネントのソースをパスの通ったフォルダに置いて,uses に追加します.実際の例はサンプル集の [160_コンポーネントの実行時生成] や印刷プレビュー制御コンポーネントの [コンポーネントの実行時生成] のコードを参考にしてください.
また,ネット上で提供されているコンポーネントの中には,パッケージに登録しないで,uses に追加して,実行時に生成することを前提にしたものもあります.

この方法は,派生元のコンポーネントにないイベントは,メソッドとして設定しないと利用できません.これは,オブジェクト・インスペクタでイベントを作成する方法が使えないためです.





コマンドラインコンパイラでコンパイルして動作確認


ネット上で提供されているコンポーネントの動作を確認したいが,インストール (登録) はしたくないことがあります.テストプログラムやデモプログラムの実行形式(EXE)ファイルが添付されていれば確認できますが,添付されていない場合,IDEを起動しなくても,コマンドラインコンパイラでコンパイルすると EXE ファイルを生成することができます.
コマンドラインコンパイラによるコンパイルについては,サンプルプログラム集の [000_コマンドラインコンパイラの実行] を参考にしてください.
ただし,この方法はリソースファイルがないとコンパイルできません.





派生元のコンポーネントと交換する方法


通常の実行時生成とは別に,コンポーネントのインストール,登録作業をしないで使用する方法があります.
[コンポーネントをインストールせずに使う方法] の記事にある関数を使用すると,フォームに配置したビジュアルなコンポーネントを,ユニット内で定義した別のコンポーネント,つまりクラス定義の内容を,実行時に情報を置き換えて使用できます.
サンプルプログラム集でも使用しています.ChangeComponent でサイト内を検索してみてください.

この方法は,実行時にコンポーネントを生成する方法と同じように,派生元のコンポーネントにないイベントは,メソッドとして設定しないと利用できません.これは,オブジェクト・インスペクタでイベントを作成する方法が使えないためです.
また,置き換えるコントロールを親 (Parent) にした別のコントロールを配置している場合はこの方法は利用できませんが,一度 Parent プロパティの値を nil にしてから再度 Parent プロパティを設定し直すという方法もあります.



リスト1
実行時にコンポーネント(クラス情報)を入れ替える関数.plChgCompo.pas の名前で保存する
unit plChgCompo;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, TypInfo;

function ChangeComponent(Original: TComponent; NewClass: TComponentClass):
  TComponent;

implementation

//=============================================================================
//  コンポーネントを交換する関数
//-----------------------------------------------------------------------------
//  【動作確認環境】
//
//  Delphi 2007 R-2 Pro, Delphi 2010 Pro, Delphi XE Pro
//=============================================================================
function ChangeComponent(Original: TComponent; NewClass: TComponentClass):
  TComponent;
var
  APropList   : TPropList;
  New         : TComponent;
  Stream      : TStream;
  Methods     : array of TMethod;
  MethodCount : Integer;
  i           : Integer;
begin
  MethodCount := GetPropList(Original.ClassInfo, [tkMethod], @APropList[0]);
  SetLength(Methods, MethodCount);

  for i := 0 to MethodCount - 1 do begin
    Methods[i] := GetMethodProp(Original, APropList[i]);
  end;

  Stream := TMemoryStream.Create;
  try
    Stream.WriteComponent(Original);
    New := NewClass.Create(Original.Owner);
    if New is TControl then TControl(New).Parent := TControl(Original).Parent;
    Original.Free;
    Stream.Position := 0;
    Stream.ReadComponent(New);
  finally
    Stream.free
  end;

  for i := 0 to MethodCount - 1 do begin
    SetMethodProp(New, APropList[i], Methods[i]);
  end;
  Result := New;
end;

end.