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