コンポーネントの登録方法等
コンポーネントをインストールしないで利用・動作確認 |
動作確認等 |
- |
コンポーネントは多くの場合,実行時に生成して使用すれば,コンポーネントのインストール (登録) をする必要がありません.コンポーネントのソースをパスの通ったフォルダに置いて,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.
|