VCL の概要
VCL コンポーネントを使用したアプリケーションの開発 への移動
このセクションでは、次の内容について説明します。
目次 |
VCL アーキテクチャ
VCL は、「Visual Component Library」の頭文字で、Delphi 言語で Windows アプリケーションを迅速に開発するための、ビジュアル コンポーネントのセットです。VCL には、ビジュアル クラス、非ビジュアル クラス、ユーティリティ クラスなど多様なクラスが含まれ、これらのクラスを Windows アプリケーション、Web アプリケーション、データベース アプリケーション、およびコンソール アプリケーションの構築などの作業に使用できます。 すべてのクラスが、TObject の下位クラスです。TObject には、作成、破棄、メッセージ処理などの基本動作を実装するメソッドが導入されています。
VCL コンポーネント
コンポーネントは、コンポーネント ライブラリのサブセットで、TComponent クラスから派生しています。 設計時にフォームやデータ モジュールにコンポーネントを配置して、操作することができます。 また、[オブジェクト インスペクタ]を使用すると、コードを記述しなくてもプロパティの値を設定できます。 大部分のコンポーネントは、実行時に表示されるかどうかによって、ビジュアル コンポーネントと非ビジュアル コンポーネントに分類されます。 一部のコンポーネントはコンポーネント パレットに表示されます。
ビジュアル コンポーネント
ビジュアル コンポーネント(TForm、TSpeedButton など)のことを「コントロール」と呼びます。コントロールは TControl から派生します。 コントロールは GUI アプリケーションで使われて、実行時にユーザーに表示されます。 TControl から派生するオブジェクトは各種のプロパティを持っています。プロパティ、コントロールのビジュアル属性(高さ、幅など)を指定する働きをします。
非ビジュアル コンポーネント
非ビジュアル コンポーネントはさまざまな作業に使用します。 たとえばデータベースに接続するアプリケーションを作成する場合、フォームに TDataSource コンポーネントを配置すると、あるコントロールと、そのコントロールが使用するデータセットとを接続できます。 この接続はユーザーの目には見えないので、TDataSource は非ビジュアル コンポーネントです。 設計時には、非ビジュアル コンポーネントはアイコンの形で表示されます。 そのため、そのプロパティやイベントは、ビジュアル コンポーネントの場合と同様に操作できます。
その他の VCL クラス
コンポーネントではないクラス(つまり TObject の派生クラスのうち TComponent の派生クラスではないもの)も、さまざまな作業に使用します。 これらのクラスは通常、システム オブジェクト(ファイルやクリップボードなど)へのアクセスや、一時的な作業(リストへのデータの格納など)に使用します。 これらのクラスのインスタンスは、設計時には作成できません。ただし、フォーム デザイナに追加したコンポーネントによって作成されることはあります。
コンポーネントの利用
IDE では、多くのビジュアル コンポーネントが コンポーネント パレット に用意されています。 コンポーネント パレット でコンポーネントを選択し、フォームやデータ モジュールに配置します。 ボタンやリスト ボックスなどのビジュアル コンポーネントをフォーム上に配置して、アプリケーションのユーザー インターフェイスを設計します。 データ アクセス コンポーネントなどの非ビジュアル コンポーネントも、フォームかデータ モジュールに配置できます。 Delphi のコンポーネントは一見すると、他のクラスとまったく区別が付きません。 しかし、Delphi のコンポーネントと、多くのプログラマが扱う標準クラスの階層構造との間には、いくつかの違いがあります。 次のような相違点があります:
- Delphi のコンポーネントはすべて TComponent クラスから派生しています。
- コンポーネントは、多くの場合そのままの形で使用されます。これらは、サブクラスを作成して機能を追加または変更する、基底クラスとして提供されるのではなく、プロパティを介して変更されます。コンポーネントの継承は通常、既存のイベント処理メンバ関数に特定のコードを追加する目的で行われます。
- コンポーネントは、スタックではなくヒープだけに割り当てることができます。
- コンポーネントのプロパティには、実行時の型情報が含まれます。
- コンポーネントは、IDE の コンポーネント パレット に追加し、フォームで操作できます。
Delphi のコンポーネントは、標準のクラスより高度なカプセル化を実現します。 例として、ボタンを持つダイアログ ボックスについて考えましょう。VCL コンポーネントを使って開発された Windows プログラムの場合、ユーザーがボタンをクリックすると、システムが WM_LBUTTONDOWN というメッセージを生成します。 プログラムは、このメッセージを受け取り(一般には switch 文、メッセージ マップ、および応答テーブルにより受け取り)、メッセージに応答して実行されるルーチンに送ります。 Windows メッセージ(VCL アプリケーション)の大部分は、Delphi のコンポーネントによって処理されます。 メッセージまたはシステム イベントに応答する処理を行うには、イベント ハンドラを記述するだけで済みます。
イベントの利用
記述するコードのほとんどは、イベントに応じて直接または間接的に実行されます。イベントとは、実行時の出来事(大抵はユーザーのアクション)を表す、特殊なプロパティです。イベントに直接応答するコードは、「イベント ハンドラ」と呼ばれ、Delphi のプロシージャです。
オブジェクト インスペクタの[イベント]ページには、指定されたコンポーネントに対して定義されている、すべてのイベントが表示されます。オブジェクト インスペクタでイベントをダブルクリックすると、イベント処理プロシージャのスケルトンが生成され、ここに、そのイベントに応答するコードを埋めていくことができます。イベントが定義されていないコンポーネントもあります。
デフォルト イベントを持つコンポーネントもあり、このイベントはコンポーネントで最も一般的に処理が必要となるものです。たとえば、ボタンのデフォルト イベントは OnClick です。フォーム デザイナで、デフォルト イベントのあるコンポーネントをダブルクリックすると、そのデフォルト イベントのためのイベント処理プロシージャのスケルトンが生成されます。
複数のイベントに応答するイベント ハンドラを記述しておくと、コードを再利用することができます。たとえば、多くのアプリケーションでは、ドロップダウン メニュー コマンドに相当する、ショートカット ボタンを用意しています。ボタンがメニュー コマンドと同じアクションを実行する場合には、イベント ハンドラを 1 つ記述し、それを、ボタンとメニュー項目の両方の OnClick イベントに対して割り当てます。それには、オブジェクト インスペクタで、応答したい両方のイベントに対して、イベント ハンドラを設定してください。
これが、イベント ハンドラを再利用する、最も簡単な方法です。しかしながら、アクション リスト、および VCL のアクション バンドでは、ユーザーのコマンドに応答するコードを一元管理する、強力なツールが提供されています。アクション リストは、クロスプラットフォーム アプリケーションでも使用できますが、アクション バンドはできません。
コンポーネントのプロパティの設定|コンポーネントのプロパティを設定する
設計時に公開プロパティを設定するには、[オブジェクト インスペクタ]を使用できます。場合により、プロパティ エディタも使用できます。 実行時にプロパティを設定するには、アプリケーションのソース コードで値を指定します。
設計時にコンポーネントを選択すると、オブジェクト インスペクタは、それの公開されているプロパティを表示し、場合によっては、それらを変更することもできます。
複数のコンポーネントを選択した場合、オブジェクト インスペクタは、選択されたコンポーネントで共有されている、すべてのプロパティ(Name プロパティを除く)を表示します。選択コンポーネント間で、共有されたプロパティの値が異なっている場合、オブジェクト インスペクタは、デフォルト値か、最初に選択されたコンポーネントの値を表示します。共有されたプロパティを変更すると、そn変更は選択されているすべてのコンポーネントに対して適用されます。
オブジェクト インスペクタで、イベント ハンドラの名前など、コード関係のプロパティを変更すると、対応するソース コードが自動的に変更されます。逆に、フォーム クラスの宣言部でイベント ハンドラのメソッド名を変更するなど、ソース コードを変更すると、それは直ちにオブジェクト インスペクタに反映されます。