Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2005年12月29日] [更新 2015年09月10日] コンポーネントのインストール方法(登録方法)等
コンポーネントの登録方法等
概要



  • 2005年12月29日
  • [サンプルプログラム集] に記載していた記事を,このページに移動
  • 以降の履歴は省略




概要


コンポーネントの登録方法等の記事です.各々のコンポーネントのオンライン・マニュアルのページに記載していた内容を,[サンプルプログラム集] にまとめ,更にこちらに移動したものです.
当サイトでは,いくつかのコンポーネントを提供していますが,コンポーネントの開発そのものに関する記事はほとんどありません.


[備考]
コンポーネントと同時に配布されている,拡張子が .dcr のファイルにはコンポーネントのアイコンがビットマップ画像で格納されています.Delphi はこのアイコンをツールバーのコンポーネントパレットあるいはツールパレットに表示します..dcr ファイルの実体はリソースファイルです.拡張子を .res に変更すればリソースエディタでアイコン画像を見ることができます.
.dcr ファイルを添付していないコンポーネントもあります.




コンポーネントとクラス


Delphi では,設計時にフォームに配置して使用するものをコンポーネントと言っていますが,実体はフォーム等と同じようにクラスです.コンポーネントは,
  • コンポーネントパレットに登録できる
  • 設計時にオブジェクト・インスペクタでプロパティの設定ができる
  • そのために,ソースコードに Register 手続きがある

ということになります.
コンポーネントパレットへの登録用コードがないクラスも,コンポーネントと言っている場合があります.コンポーネントを直訳すると,部品あるいは構成要素ですから,あまり厳密に区別して考える必要はないのかも知れません.

サンプルプログラム集に [144] [04_画像表示機能付き縦横両用ラベルコンポーネント] というのがあります.そのコンポーネントには,以下の Register 手続きのコードがあります.
この Register 手続きは,コンポーネントの登録に必要な情報です.下のコードは,plXRAY というコンポーネントパレットのタブに,TplVertLabel という名前で登録することを意味します.もし,コンポーネントパレットに該当する名前のタブがない場合は,自動で作成されます.

この Register 手続きのコードがないコンポーネント (単にクラスと言った方が正確かも知れませんが) は,[160] [01_ボタンが1つだけの場合と実行時生成の基本] のように,実行時に生成して使用することになります.


リスト1
コンポーネントの登録用コード
//=============================================================================
//  コンポーネント登録情報
//=============================================================================
procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('plXRAY', [TplVertLabel]);
end;


[備考]
フォームは特別なクラスです.コンポーネントとしては登録できません.
フォーム自身を表示するコンポーネントは,TForm あるいは TForm の派生クラスから派生して作成することができますが,リソースが必要になります.リソースファイルはバイナリファイルです.Delphi のバージョンに依存する可能性があります.
フォームのリソースを使わないでフォームを実装するには,フォームを TForm 型のプロパティとして実装します.




「パスを通す」ということ


ここで言う「パス」は,ライブラリのパスのことです.
コンポーネントやプログラムのファイルは,パスの通ったフォルダにないと利用できません.
たとえ,uses 部に必要なユニット名が書いてあっても,パスが通っていないと,ファイルが「見つからない」「見つかりません」等のエラーが発生します.設定方法等は,パスを通すの各記事を参考にしてください.

パスとは,Delphi がファイルを探しに行く場所 (フォルダまたはディレクトリ) のことです.
パスの設定なしで使用できればいいのですが,そうすると,システム内,ネットワーク上の全てのフォルダ内を検索することを意味します.これは効率的ではありません.また,バックアップとして,同じ名前のファイルが別のフォルダに存在した場合,どちらを使用するかも問題となってしまいます.

XXX.pas というファイルをコンパイルすると,一般には拡張子が dcu の XXX.dcu という,コンパイル済みのファイルができます.Delphiは,この dcuフ ァイルを使用して実行ファイル,EXE を作成します.プロジェクトをコンパイルして EXE ファイルを作成する際,全ての pas ファイルをコンパイルすると時間がかかりますが,dcu を使用すれば時間の短縮になります.
したがって,コンポーネント類も,一度コンパイル済みの dcu ファイルを作成すれば,元の pas ファイルにパスが通ってなくても,この dcu ファイルにパスが通っていれば利用可能となります.

Delphi が通常使用するいろいろな Classes.pas, Graphics.pas, Controls.pas 等のファイルには,デフォルトの状態ではライブラリのパスは通っていません.それらのコンパイル済みの dcu ファイルにパスが通っています.これは,pas ファイルの中身を編集してもその変更結果は,そのままでは,たとえ,再構築 (ビルド) しても,作成した EXE に反映されないことを意味しています.

ネット上で配布されているコンポーネント類は,pas ファイルまたは dcu,あるいはその両方が配布されいます.したがって,これらのファイルが存在するフォルダに,パスを通すことになります.
pas ファイルにパスが通っていると,プロジェクトの再構築(ビルド)の時,Delphi は,そのファイルをコンパイルして新しい dcu ファイルを作成し,それを使用します.
インストーラが付属しているコンポーネント類には,ライブラリパスの設定を自動的に実行してくれるものもあります.






ソースコードがないコンポーネントは他のバージョンでは使用不可


コンパイルした .dcu, .dcp, .bpl 等のファイルは,コンパイルした時の Delphi のバージョンだけで使用可能です.つまり,バージョンに依存します.したがって,.dcu, .bplファイルだけで提供されているコンポーネント類は,他のバージョンの Delphi では使用できません.






VCL のソースコードにはライブラリのパスを通さない


Delphi が提供している VCL のソースコードにライブラリパスを通すのは避けた方が無難です.
ここにライブラリバスを通すと,VCL のコンパイル済みファイルが,そのソースコードのフォルダ内にできてしまいます.ということは,コンパイル済みの .dcu ファイル,つまり,同じ名前のファイルがライブラリパスの通った複数の場所に存在することになります.これは,後述のように,トラブル発生の原因となる可能性があります.

VCL のソースコードを変更して,その結果を EXE あるいは DLL に反映したい場合は,以下のような作業を行う方が確実です.

  • (1) VCL のソースコードをプロジェクトのフォルダにコピーする
  • (2) コピーした VCL のソースコードを変更して,EXE または DLL を作成する
  • (3) コンパイル済みの VCL の .dcu ファイルを本来 .dcu があるべき場所にコピーする
  • (4) 変更した VCL のソースコードを元の場所にコピーする
  • (5) プロジェクトのフォルダ内の VCL のソースコードと .dcu ファイルは削除する

本来 .dcu ファイルがあるべき場所は [lib] フォルダの階層下にあります.
ビルド構成を [debug] でコンパイルした .dcu は [debug] 内に,ビルド構成を [release] でコンパイルした .dcu は [release] のフォルダ内にコピーします.
この両方を作成しておかないと,デバッグ版とリリース版とで動作が違ってしまいます.

もし,変更してコンパイルした VCL を,対象のプロジェクトだけで使用するのであれば,本来あるべき場所に .dcu ファイル,.pas ファイルをコピーする必要はありません.開発中のプロジェクト関係のフォルダに置いておくだけで十分です.





「パスの設定」と関係ファイル


「パスの設定」は,「ライブラリパスの設定」だけとは限りません.
プロジェクトを作成すると,いろいろな拡張子のファイルができます.これらのファイルの中には,ライブラリや,他のファイルへのパスの設定関係の情報が含まれている場合があります.
ここで言うプロジェクトとは,通常のアプリのプロジェクトだけではなく,例えば,パッケージ等のプロジェクトも同じです.

異なるバージョンの Delphi で使用するとか,異なるバージョンのパッケージを使用する際には,旧いバージョンの関係ファイルを削除する作業が必要になることがあります.場合によってはレジストリの設定を修正,または削除しなければならないこともあります.

この作業をしないと,ファイルが見つからないとか,修正前のファイルが使用されたりして,期待する結果が得られないことがあります.
また,「異なるバージョンによりコンパイルされています」や「既にプロジェクトに登録されています」等のエラーが発生し,コンパイルに失敗する場合もあります.

このような現象は,Delphi を再インストールした時も発生することがあります.クリーンなアンインストールが必要な場合があります.






ライブラリパスと検索パス


VCL のソースコードにはパスが通っていないと書きました.これはライブラリとしてのパスは通っていないと言うことです.
しかし,uses 部のユニットファイルは開いて表示することができます.これは [ブラウザ検索バス] の設定でパスが通っているからです.ライブラリのパスが設定されていなくても,検索パスに含まれていれば,そのフォルダ内のユニットは,IDE から開くことができます.





同じ名前のファイルを,別のパスの通ったフォルダに置かない


既に述べたように,同じ名前のファイルを,パスの通った別のフォルダには置かないようにします.
別のフォルダに同じ名前のファイルがあると,それがコンポーネントのファイルだと,インストールできなかったり,インストールできても,正常に動作しなかったりします.
VCL のソースコードにライブラリのパスを通さないようにするのは,この意味もあります.

筆者の場合,同じ名前のファイルの使用を避けるために,パッケージで提供されているものや,多くのユニットで構成されているもの以外は,全て同じフォルダに置いて使用するようにしています.
そうすると,同名のファイルを検出できます.

コンポーネントの作者が,プリフィックスを付けて,同じような名前のコンポーネントと区別するようにするのも,それらのトラブルを回避するためです.

同じ名前のファイルというのは,ユニットファイルだけとは限りません.コンパイル済等のファイルも含めたファイルを意味します.





コンポーネントのインストール(パッケージへの登録)とは何か


「インストール」という用語が一般的に使用されていますが,実際には「パッケージへの登録」です.

Delphi ではパッケージというファイルで,同じような種類のコンポーネントを登録管理しています.
コンポーネントのインストール,登録というのは,このパッケージ(ファイル)にコンポーネントのパス名やコンポーネントパレットのアイコン等の情報を追加し,そのコンポーネントをコンパイルし,パッケージのプロジェクトをコンパイル (ビルドまたは再構築) することです.

下図は,Delphi XE Pro 版にインストールされている「パッケージ」の一覧の例です.このダイアログは,メニューの [コンポーネント] [パッケージのインストール] で表示できます.
コンポーネントパレットにあるボタン (TButton) 等のコンポーネントも,これらの,どれかのパッケージにインストール (登録) されています.


図1
パッケージ一覧
  • コンポーネントは,どれかのパッケージに登録されている
図2
パッケージの内容の例
  • [Embarcadero 標準コンポーネント] を選択して,[コンポーネント] ボタンをクリックしたところ
  • ボタン (TButton) 等がある

どのコンポーネントがどのパッケージに格納されているかは,下図のダイアログでも確認できます.
メニューの [ツール] [オプション] のダイアログで [コンポーネントツールバー] を選択します.このダイアログの [ページ] ペインで [すべて] を選択すると右のペインにインストール済みの全てのコンポーネントが一覧表示されます.ここで登録先のパッケージを確認できます.


図3
コンポーネントの一覧




パッケージの役割とコンポーネントの関係


パッケージをコンパイルすると拡張子が bpl と dcp 等のファイルができます.パッケージのプロジェクトファイルも作成されます.このパッケージを Delphi で認識するための作業がパッケージのインストールです.
dclusr.dpk というパッケージが Delphi に標準で用意されていますが,必ずしもインストール済みとは限りません.

パッケージで提供されているコンポーネント群は,そのパッケージにコンポーネントの情報が既に登録されています.したがって,そのパッケージをコンパイルしてインストールすれば,パッケージに収めてあるコンポーネント類が使用可能となります.
また,複数のパッケージが提供されている場合,それら全てのコンパイルは必要ですが,インストールは特定のパッケージだけでいい場合もあります.コンパイルやインストールは順番の指定があることもあります.これは,コンポーネントファイル等に依存関係がある場合です.

したがって,開発環境を他のコンピュータに移動した場合,拡張子が .dpk のパッケージを再構築またはビルドすればパッケージで定義されているコンポーネント類が使用可能となります.もちろん,これらのコンポーネント類が,ライブラリのパスが通ったフォルダ (ディレクトリ) になければならないことは言うまでもありません.必要であれば,.dpk 内の各コンポーネントのライブラリのパス名を手動で編集することもできます.

これは,パッケージで提供されているコンポーネントと同じ扱いです.特別なことではありません.パッケージ (名前) が違うだけのことです.
この意味も含めて,筆者は,自作のコンポーネントと他の方が提供しているコンポーネント (パッケージで提供されているものを除いて) 全てを dclusr.dpk というパッケージに登録しています.こうしておくことで,管理をしやすくしています.


[備考 1]
古い Delphi の .dpk ファイルは,そのバージョン専用となっていますが,最近の Delphi では汎用的になっています.そのため,パッケージ形式で提供されているコンポーネント類は,該当バージョンのパッケージがなくても,ソースコードがあれば,再構築することによって,ほとんどの場合インストールが可能となっています.

[備考 2]
コンパイル済みのパッケージの拡張子は .bpl です.
Delphi が標準で提供している .bpl ファイルは,Delphi のインストール先の [bin] フォルタにあります.Delphi が標準で提供しているパッケージには .dpk ファイルはありません.



リスト2
パッケージファイル dclusr.dpk の例 (Delphi XE Pro 用の一部)
この内容を直接編集してもいいが,いずれにしてもパッケージのビルドまたは再構築が必要
package dclusr;

{$R *.res}
{$R 'D:\XRAYpl\plSetPrinterReg.dcr'}
{$R 'D:\XRAYpl\plPrevReg.dcr'}
{$R 'D:\XRAYpl\plTackPrevReg.dcr'}
{$R 'D:\XRAYpl\plButton.dcr'}
{$R 'D:\XRAY\SaNumEdit.dcr'}
{$R 'C:\Users\Makoto\Documents\RAD Studio\8.0\Imports\AcroPDFLib_TLB.dcr'}
{$R 'C:\Users\Makoto\Documents\RAD Studio\8.0\Imports\Acrobat_TLB.dcr'}
{$R 'C:\Users\Makoto\Documents\RAD Studio\8.0\Imports\ADODB_TLB.dcr'}
{$ALIGN 8}
{ ASSERTIONS ON}
{$BOOLEVAL OFF}
{ DEBUGINFO OFF}
{$EXTENDEDSYNTAX ON}
{$IMPORTEDDATA ON}
{$IOCHECKS ON}
{ LOCALSYMBOLS OFF}
{$LONGSTRINGS ON}
{$OPENSTRINGS ON}
{$OPTIMIZATION OFF}
{$OVERFLOWCHECKS OFF}
{$RANGECHECKS OFF}
{$REFERENCEINFO ON}
{$SAFEDIVIDE OFF}
{ STACKFRAMES ON}
{$TYPEDADDRESS OFF}
{$VARSTRINGCHECKS ON}
{$WRITEABLECONST ON}
{$MINENUMSIZE 1}
{$IMAGEBASE $51000000}
{$DESCRIPTION 'Embarcadero User Components'}
{$LIBSUFFIX '150'}
{$DESIGNONLY}
{$IMPLICITBUILD ON}
{$DEFINE DEBUG}

requires
  rtl,
  vcl,
  designide,
  vclimg,
  vclactnband,
  vclx,
  xmlrtl,
  bdertl,
  VclSmp,
  vcldb;

contains
  plSetPrinterReg in 'D:\XRAYpl\plSetPrinterReg.pas',
  plPrevReg in 'D:\XRAYpl\plPrevReg.pas',
  plButton in 'D:\XRAYpl\plButton.pas',
  plTackPrevReg in 'D:\XRAYpl\plTackPrevReg.pas',
  SaNumEdit in 'D:\XRAY\SaNumEdit.pas',
  SevenZipVCL in 'D:\000_Delphi\SevenZipVCL_076\SevenZipVCL.pas',
  Acrobat_TLB in 'C:\Users\Makoto\Documents\RAD Studio\8.0\Imports\Acrobat_TLB.pas',
  ADODB_TLB in 'C:\Users\Makoto\Documents\RAD Studio\8.0\Imports\ADODB_TLB.pas';
  ADOX_TLB in 'C:\Users\Makoto\Documents\RAD tudio\8.0\Imports\ADOX_TLB.pas';

end.




コンポーネントの更新 ( バージョンアップ )


既にインストール (登録) 済のコンポーネントに変更があって,更新する場合,登録したパッケージのプロジェクトをビルドまたは再構築すれば,そのパッケージ内のコンポーネント全てが更新されます.

コンポーネントの更新作業が必要なのは,オブジェクト・インスペクタで表示される published なプロパティの変更か, Createメソッド等,生成時のコードを変更した場合だけです.実行時に実行されるコードの変更だけであれば,更新作業は必要ありません.自由に編集できます.

ただし,これは,コンポーネントのソースコードにライブラリのパスが通っている場合です.サードパーティのコンポーネントは,インストールしてもソースコードにライブラリのパスが通っていないものもあります.Delphi が標準で提供している VCL は,デフォルトの設定ではソースコードにはライブラリのパスが通っていません.したがって,ソースコードを変更しても反映されません.




コンポーネントとそのクラス名 - 同じ名前のは登録できない


例えば,TButton に機能を追加したボタンを作成する時,Ex (Express) をつけて,TButtonEx とすることがあります.他の方も同じことを考えて,TButtonEx というクラス名を付けた場合,この二つのコンポーネント両方を登録して利用することはできません.

これを避けるため,拙作コンポーネントのクラス名の先頭には,公開当初から pl (ピーエル) というプリフィックスを付加しています.同様に,コンポーネント内で使用する他のクラス名も,重複をさけるために,極力 pl というプリフィックスを付けるようにしています.
つまり,拙作コンポーネント類は,ピーエルシリーズということになります.
これは,コンポーネントの作者がよく用いている方法です.なお,誤解のないように説明しておきますが,筆者は PL 学園とは何の関係もありません.




タイプライブラリの取り込みとは何か


[タイプライブラリ] は,COM オブジェクトがどんなメソッドやプロパティ,イベントなどを持っているか,そしてそれらがどういう働きをするかについて記述したものです.

タイプライブラリの実体は DLL です.
OS あるいはアプリケーションの DLL や OCX ファイルがタイプライブラリ,あるいはタイプライブラリ情報を提供していると,[タイプライブラリの取り込み] または [ActiveX コントロールの取り込み] を行うことにより,ユニットあるいは,コンポーネントにして利用できるようになります.

逆に,DLL や OCX (ActiveX コントロール) を作成する際,そのような情報を追加しておくと,[タイプライブラリの取り込み] または [ActiveX コントロールの取り込み] を行うことにより,DLL 内の関数等をコンポーネントやクラスとして,他の方が利用できるようになります.
こうしたタイプライブラリは,他の開発言語からも利用できます.

したがって,全ての DLL からコンポーネントやユニットファイルが作成できるわけではありません.
また,作成したコンポーネントなりユニットの使用方法等がなければ,OCX (ActiveX コントロール) や DLL 提供者の資料,ネット上や MSDN 等の資料で調べる必要があります.あるいは,自分自身でテストして動作を確認していく作業も必要です.

[タイプライブラリの取り込み] あるいは [ActiveX コントロールの取り込み] を行っても,実行環境のシステムに DLL や OCX が登録されていないと動作しません.既に Windows に登録されている DLL の場合は,その DLL を改めてシステムに登録する必要はありません.



[備考]
COM, OLE, ActvieX 等の用語には,少し混乱があるようです.
これは,マイクロソフトが,その用語の定義を変更してきたという歴史的な経過も関係しているのかも知れません.例えば [ActiveX テクノロジの概要] の記事は 2005年 当時のものですが,これに関連する記事の内容は,年代によって少し違います.





リポジトリへの登録とは何か - 継承フォームの作成


コンポーネントで言えばインストール (登録) に相当します.
例えば,TButton をフォームに配置して使用する場合,TButton を継承した Button1 という名前のボタンを使うことになります.
カスタマイズしたフォームも同様に継承して利用することができます.フォームはコンポーネントパレットに登録できません.そのかわりにリポジトリに登録します.ただし,追加したプロパティやイベントはオブジェクト・インスペクタには表示できません.これが,他のコントロール (コンポーネント) と違うところです.

コンポーネントをを実行時に生成,つまり,実行時に継承したそのコンポーネントを使用する場合は,コンポーネントパレットに登録していなくても利用できます.同様に,拙作の印刷プレビュー制御フォームやワード操作フォームも,実行時に生成するのであれば,リポジトリに登録しなくても利用できます.

継承フォームは [ファイル] [新規作成] でも作成できます.
下図は Delphi XE(UP1) Pro の例です.まず,継承元のフォーム,または継承元のフォームを含むプロジェクトを IDE で開きます.そして [ファイル] [新規作成] から,そのフォームの継承フォームを作成して保存します.必要に応じて継承フォームの Name プロパティの値も変更します.
保存した継承フォームを他のプロジェクトで使用する場合は,ライブラリパスの通った場所に継承元のフォームのファイル (*.dfm, *.pas ファイル) が必要です.



図4
継承元のフォームを開く
  • このフォームを継承した別のフォームを作成する
  • この TForm1 も元は TForm を継承したフォーム
図5
継承フォームの作成
  • [ファイル]
  • [新規作成]
  • [その他]
  • 左ペインの [継承可能フォーム] から継承元のフォームを選択
  • 継承元のフォームを選択
  • [継承] のラジオボタンを選択して [OK]
図6
継承フォームができる
  • 継承元は TForm1
  • 名前を付けて保存する