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.