統合開発環境

Delphi を起動すると,IDE と呼ばれる統合開発環境が開始されます。この環境には,アプリケーションの設計,開発,テスト,デバッグ,および配布に必要なすべてのツールが用意されています。 

Delphi 開発環境を構成する主な要素は,ビジュアルフォームデザイナ,オブジェクトインスペクタ,オブジェクトツリー,コンポーネントパレット,プロジェクトマネージャ,ソースコードエディタ,およびデバッガです。製品のバージョンによっては,一部のツールが付属していない場合があります。フォームデザイナ上で視覚的に表現されたオブジェクトに関して,オブジェクトインスペクタに移動してオブジェクトの実行時の状態を編集したり,ソースコードエディタに移動してオブジェクトの実行ロジックを記述したりできます。オブジェクトインスペクタを使ってイベントハンドラの名前などコード関連のプロパティを変更すると,ソースコードの対応部分が自動的に変更されます。逆に,ソースコードを変更すると(たとえば,フォームクラスの宣言部でイベントハンドラのメソッドの名前を変更する)など,その変更はオブジェクトインスペクタに即時に反映されます。

IDE は,設計から配布に至る製品ライフサイクルのあらゆる段階を通じてアプリケーション開発をサポートします。IDE のツールを使用すると,プロトタイプを短期間に作成でき,開発期間を短縮できます。

開発環境に関する概要説明については,製品に付属する『クイックスタート』マニュアルを参照してください。 



アプリケーションの設計

Delphi には,以下のようにアプリケーションの設計に必要なすべてのツールが用意されています。

・フォーム: 最初は空白のウィンドウであり,ここにアプリケーションのユーザーインターフェースを設計する
・大規模なクラスライブラリ: 再利用可能なオブジェクトが数多く用意されている
・オブジェクトインスペクタ: オブジェクトの特性を調べたり変更したりする
・コードエディタ: アプリケーションの基礎をなすプログラムロジックに直接アクセスできる
・プロジェクトマネージャ: 1 つ以上のプロジェクトで構成されるファイル群を管理する

・イメージエディタや統合デバッガなど,IDE でのアプリケーション開発をサポートするツール群
・コマンドラインツール: コンパイラやリンカなどのユーティリティ

Delphi を使うと,汎用のユーティリティから洗練されたデータアクセスプログラム,分散アプリケーションに至るまで,あらゆる種類の 32 ビットアプリケーションを設計できます。Delphi のデータベースツールやデータベース対応コンポーネントを使うと,パワフルなデスクトップデータベースやクライアント/サーバーアプリケーションを短期間で開発できます。また,データベース対応コントロールを利用して,アプリケーション設計時に最新のデータを参照したり,データベースへの問い合わせの結果やアプリケーションインターフェースに加えられた変更などを即時に見ることができます。

各種アプリケーションに対する Delphi のサポートについては,アプリケーションの作成を参照してください。

クラスライブラリに用意されたオブジェクトの多くは,IDE のコンポーネントパレットからアクセスできます。 コンポーネントパレットには,フォーム上に配置できるすべてのコントロール(ビジュアルコントロールと非ビジュアルコントロール)が表示されます。コンポーネントは,機能別のタブにグループ化されています。慣例的に,クラスライブラリのオブジェクト名は TStatusBar のように T で始まります。

Delphi では,画期的機能の 1 つとして,Object Pacal を使ってプログラマ独自のコンポーネントを作成することができます。Delphi に用意されているコンポーネントは,ほとんどが Object Pascal で記述されています。プログラマは,自分で作成したコンポーネントをコンポーネントパレットに追加し,必要であれば新しいタブを追加できます。

また,CLX を使うと,Linux と Windows のクロスプラットフォーム開発ができます。VCL のかわりに CLX のクラスを使うことにより,Windows と Linux の間でプログラムを移植することができます。 



コンポーネントライブラリの使い方

VCL と CLX は,オブジェクトで構成されるクラスライブラリです。オブジェクトの一部はコンポーネントやコントロールであり,こうしたコンポーネントやコントロールを使ってアプリケーションを開発します。VCL と CLX は非常によく似ていて,どちらにも同じオブジェクトが多数含まれています。VCL のオブジェクトには,Windows でしか使用できない機能を実装したオブジェクトが一部含まれています。具体的には,コンポーネントパレットの[ADO],[BDE],[QReport],[COM+],[Web Services],[Servers]の各ページに表示されるオブジェクトなどが Windows 専用のオブジェクトです。CLX オブジェクトは,ほとんどすべてが Windows,Linux の両方で使用できます。

VCL オブジェクトと CLX オブジェクトは,必要なデータおよび「メソッド」(データを変更するコード)をすべて格納するアクティブなエンティティです。データは,オブジェクトのフィールドとプロパティに保存されます。フィールド値とプロパティ値に作用するメソッドで構成したものがコードです。各オブジェクトは「クラス」として宣言されます。Object Pascal を使ってプログラマ自身が作成するオブジェクトを含め,VCL オブジェクトと CLX オブジェクトはすべて,上位オブジェクトである TObject から派生しています。

オブジェクトの下位セットがコンポーネントです。コンポーネントとは,フォームやモジュールに配置して,設計時に操作できるオブジェクトのことです。コンポーネントはコンポーネントパレットに表示されます。コンポーネントのプロパティを指定するとき,コードを書く必要はありません。VCL コンポーネントと CLX コンポーネントは,すべて TComponent というオブジェクトから派生しています。 

コンポーネントは,以下の働きをする,オブジェクト指向プログラミング(OOP)における真の意味でのオブジェクトです。

・データとデータアクセス関数のまとまりをカプセル化する
・派生元のオブジェクトからデータと動作を継承する
・共通の上位オブジェクトから派生した別のオブジェクトとの間で,多態性と呼ばれる概念を通じて動作の互換性を保つ

オブジェクトは,大部分のコンポーネントと異なり,コンポーネントパレットに表示されません。そのかわりに,オブジェクトのユニットでデフォルトのインスタンス変数が宣言されるか,あるいはプログラマ自身がインスタンス変数を宣言します。

コントロールはコンポーネントの一種で,実行時にユーザーが見ることのできるコンポーネントです。コントロールはコンポーネントの下位セットです。コントロールとは,アプリケーションが動作しているときにユーザーの目に見えるビジュアルコンポートです。どのコントロールも,高さ,幅などのビジュアル属性を指定する共通のプロパティを持っています。コントロールが共通して持っているプロパティ,メソッド,イベントは,すべて TControl から派生しています。

クロスプラットフォームプログラミングに関する詳細および Windows 環境と Linux 環境の違いについては,クロスプラットフォーム開発を参照してください。 

Kylix を使ってクロスプラットフォームアプリケーションを開発する場合は,Linux 環境向けに記述されている Kylix の『開発者ガイド』を参照してください。Kylix でも,印刷されたマニュアルとオンラインヘルプの両方を参照できます。



プロパティ,メソッド,イベント

VCL,CLX はそれぞれオブジェクト階層を構成し,Delphi IDE と連携してアプリケーションの迅速な開発を可能にします。VCL オブジェクトと CLX オブジェクトは,どちらもプロパティ,メソッド,およびイベントを基本としています。各オブジェクトには,データメンバー(プロパティ),データに作用する関数(メソッド),およびクラスのユーザーとの対話方法(イベント)が含まれています。VCL が Object Pascal で記述されているのに対し,CLX は Qt(C++ クラスライブラリ)をベースにしています。

プロパティ

プロパティとは,コンポーネントの特性のことです。プロパティはオブジェクトの可視動作または操作に影響を与えます。たとえば Visible プロパティは,オブジェクトをアプリケーションのインターフェースに表示するか非表示にするかを指定します。プロパティを適切に設計すれば,ユーザーにとっては使いやすく,開発者にとっては保守しやすいコンポーネントが作成できます。

プロパティの有用な機能をいくつか紹介します。

・メソッドは実行時でなければ使用できませんが,プロパティは設計時に表示,変更ができ,変更の結果はすぐに IDE を通してコンポーネントに反映されます。
・オブジェクトインスペクタからプロパティにアクセスでき,オブジェクトの値をビジュアルに変更できます。コードを記述するより,設計時にプロパティを設定する方が簡単です。コードの保守も簡単になります。 
・データはカプセル化されるので,プロテクトされ,実際のオブジェクトに対してプライベートになります。 

・値を取得,設定するための実際の呼び出しを行うのはメソッドです。このため,オブジェクトのユーザーの目に見えない特殊な処理を実行できます。たとえば,テーブルにデータがあっても,プログラマに対しては通常のデータメンバーとして表示するなどが可能です。 
・プロパティのアクセス中にイベントを発生させたり他のデータを変更するロジックを実装できます。たとえば,あるプロパティの値を変更するとき,別のプロパティも変更する必要が生じることがあります。その場合,目的のプロパティのメソッドに変更を加えることができます。 

・プロパティを仮想プロパティとすることもできます。 
・1 つのプロパティを複数のオブジェクトに適用することもできます。オブジェクトのプロパティを 1 つ変更するだけで,複数のオブジェクトを変更することもできます。たとえば,ラジオボタン 1 つの Checked プロパティを設定するだけで,同じグループ内のラジオボタン全体に影響を与えることが可能です。 

メソッド

メソッドは,常にクラスと関連している手続きです。メソッドはオブジェクトの動作を定義します。クラスメソッドは同じクラスの public プロパティ,protected プロパティ,private プロパティ,およびデータメンバーのすべてにアクセスできます。一般に,クラスメソッドのことを「メンバー関数」と呼びます。

イベント

イベントとは,プログラムにより検出されるアクションまたは出来事のことです。最近のアプリケーションは,ほとんどが「イベントドリブン」であると言われます。これは,イベントに応答するように設計されているからです。プログラムを作成するとき,プログラマは,ユーザーがどんな順序で操作するのか予想できません。メニュー項目を選択する,ボタンをクリックする,テキストの一部を強調表示するなど,ユーザーはさまざまな操作をします。プログラマは,常に一定の順序で実行されるコードを記述するのでなく,発生しそうなイベントに対処できるコードを記述することができます。

イベント名を問わず何かイベントが発生すると,Delphi は,そのイベントを処理するコードがあるかどうかを確認します。何かコードが記述されていれば,そのコードを実行します。記述されていなければ,デフォルトのイベント処理動作を発生させます。



イベントの種類

発生し得るイベントは,大きく分けて次の 2 種類があります。

・ユーザーイベント
・システムイベント

イベント名を問わず何かイベントが発生すると,Delphi は,そのイベントを処理するコードがあるかどうかを確認します。何かコードが記述されていればそのコードを実行し,そうでなければ何も実行しません。

ユーザーイベント

ユーザーイベントとは,ユーザーが開始するアクションのことです。ユーザーイベントの例としては,OnClick イベント(マウスをクリックする),OnKeyPress イベント(キーボードのキーを押す),OnDblClick イベント(マウスをダブルクリックする)などがあります。ユーザーイベントは,常にユーザーのアクションと結びついています。

システムイベント

システムイベントとは,オペレーティングシステムがユーザーにかわって発生させるイベントのことです。システムイベントの例としては,OnTimer イベント(一定の時間が経過すると,Timer コンポーネントがシステムイベントを発行する),OnCreate イベント(コンポーネントが作成される),OnPaint イベント(コンポーネントやウィンドウを再描画する必要が生じる)などがあります。システムイベントは,通常,ユーザーのアクションと直接関係せずに開始します。



Object Pascal とクラスライブラリ

Object Pascal とは,標準の Pascal を拡張してオブジェクト指向プログラミングが行えるようにしたものです。Delphi は Object Pascal を言語として使用しています。Delphi のコンポーネントパレットとオブジェクトインスペクタを使うと,コードを記述せずに VCL コンポーネントまたは CLX コンポーネントをフォームに配置し,各コンポーネントのプロパティを設定できます。

オブジェクトはすべて TObject から派生しています。TObject とは,作成,破棄,メッセージ処理などの基本動作をカプセル化するメソッドだけを持つ抽象クラスです。TObject から多くの単純なクラスが直接派生します。

VCL と CLX のコンポーネントはすべて,抽象クラス TComponent から派生しています。コンポーネントとは,設計時にフォーム上で操作できるオブジェクトのことです。ビジュアルコンポーネント(TForm や TSpeedButton など,実行時に画面に表示されるコンポーネント)はコントロールとも呼ばれ,TControl から派生します。

ビジュアルコンポーネントのほかに,コンポーネントライブラリには非ビジュアルオブジェクトも多数含まれています。IDE が用意されているので,フォームにドロップするだけで簡単に非ビジュアルコンポーネントをプログラムに追加できます。たとえば,あるテーブルに関連するデータベースアプリケーションを記述する場合に,TDataSource コンポーネントをフォームに配置します。TDataSource は非ビジュアルコンポーネントですが,フォーム上にアイコンが表示されます(実行時は非表示)。TDataSource は,ビジュアルコントロールと同様に,オブジェクトインスペクタを使ってプロパティやイベントを操作できます。

Object Pascal で独自のクラスを作成するには,使用するクラスライブラリの TObject からクラスを派生させます。Windows アプリケーションを作成する場合は VCL を使用し,クロスプラットフォームアプリケーションを作成する場合は CLX を使用してください。適切な基本クラス(またはその下位クラス)から派生させると,新しいクラスにも基本機能が提供されるので,確実にクラスライブラリ内の他のクラスに作用させることができます。



オブジェクトモデルの使い方

オブジェクト指向プログラミングとは,構造化プログラミングを拡張したものです。コードを再利用し,機能を保ったままデータをカプセル化することが特徴です。作成したオブジェクト(正式にはクラス)はアプリケーション間で再利用できます。ほかのプログラマも別のアプリケーションで再利用できるので,開発時間を短縮でき,生産性を高めることができます。

新しいコンポーネントを作成してコンポーネントパレットに追加する方法については,コンポーネント作成の概要を参照してください。

アプリケーションでのオブジェクトの使い方について,以下のトピックで説明しています。

・オブジェクトとは 
・オブジェクトからのデータとコードの継承 
・スコープと限定子 
・オブジェクト変数の使い方 
・オブジェクトの作成,インスタンス化,破棄 



オブジェクトとは

オブジェクト(すなわちクラス)とは,データと操作を 1 つのユニットにまとめたデータ型です。オブジェクト指向プログラミングが出現するまでは,データと操作(機能)は個別の要素として扱われていました。

Object Pascal のレコードまたは C 言語の構造体を理解すると,Object Pascal のオブジェクトが理解しやすくなります。レコードはデータを保持するフィールドから成り,各フィールドは固有のデータ型を持ちます。レコードを使用すると,さまざまなデータ要素の集合を簡単に取り扱えます。

オブジェクトもデータ要素の集合であり,独自のデータ型を持つフィールドで構成されます。オブジェクトがレコードと異なる点は,フィールド内のデータに作用する手続きと関数が含まれていることです。このような手続きや関数をメソッドと呼びます。

オブジェクト内のデータにアクセスするには,プロパティを使います。VCL と CLX では,オブジェクトのプロパティにデフォルト値が設定されています。このデフォルト値は,コードを記述せずに設計時に変更できます。また,わずかなコードを記述するだけで,実行時にプロパティ値を変更することもできます。

データと機能を 1 つの単位にまとめることをカプセル化といいます。オブジェクト指向プログラミングの特徴は,カプセル化,継承,そして多態性です。継承とは,オブジェクトがその派生元(上位オブジェクト)から機能を引き継ぐことを意味します。引き継いだ動作は後で修正できます。多態性とは,同じ上位オブジェクトから派生した複数のオブジェクトが,同じメソッド,同じプロパティのインターフェースをサポートすることを意味します。これらは,相互に呼び出すこともあります。



Delphi のオブジェクトの概要

新規プロジェクトを作成すると,Delphi は新規フォームを表示してカスタマイズできるようにします。コードエディタには,このフォームの新しいクラス型が宣言され,新規フォームインスタンスを作成するコードが生成されます。新規の Windows アプリケーションで生成されるコードの例を下に示します。

unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Forms, Controls, Dialogs;
type
TForm1 = class(TForm) { フォームの型宣言の始まり }
private
{ Private 宣言 }
public
{ Public 宣言 }
end; { フォームの型宣言の終わり }
var
Form1: TForm1;
implementation { 実現部の始まり }
{$R *.DFM}

end. { 実現部とユニットの終わり }

上記の例では,クラス型 TForm から新しい別のクラス型 TForm1 を派生させています。

前述のように,クラスはデータフィールドを持つという点でレコードと共通していますが,メソッドも持つという点でレコードと異なります。メソッドはオブジェクトのデータに作用するコードです。しかし,上記の例で TForm1 にはデータフィールドもメソッドも示されていません。この理由は,フォームにコンポーネント(新しいオブジェクトのフィールド)やイベントハンドラ(新しいオブジェクトのメソッド)を作成していないためです。型宣言には示されていませんが,TForm1 にはデータフィールドもメソッドもあります。

変数宣言で,新しい型である TForm1 の変数として Form1 を宣言しています。

var
Form1: TForm1;

Form1 は,クラス型 TForm1 のインスタンス(オブジェクト)を表します。同じクラス型の複数のインスタンスを宣言することもできます。たとえば,MDI(マルチドキュメントインターフェース)アプリケーションで複数の子ウィンドウを作成する場合などです。この場合,インスタンスごとに独自のデータを持ちますが,どのインスタンスも同じコードを使ってメソッドを実行します。

コンポーネントの追加もコードの記述も行っていないフォームであっても,独立した Delphi アプリケーションとしてコンパイル,実行できます。この場合,空のフォームを表示するだけのアプリケーションになります。

このフォームにボタンコンポーネントと OnClick イベントハンドラを追加し,ユーザーがボタンをクリックしたときにフォームの色を変更するとします。結果は次のようになります。

単純なフォーム

ユーザーがボタンをクリックすると,フォームの色は緑色に変わります。このボタンの OnClick イベントハンドラのコードは次のとおりです。

procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.Color := clGreen;
end;

オブジェクトの中に,データフィールドとして別のオブジェクトを入れることができます。フォームにコンポーネントを配置すると,そのつどフォームの型宣言に新しいフィールドが追加されます。上記のようにアプリケーションを作成してコードエディタを開くと,次のようなコードが表示されています。

unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Forms, Controls;
type
TForm1 = class(TForm)
Button1: TButton; { 新しいデータフィールド }
procedure Button1Click(Sender: TObject); { 新しいメソッドの宣言 }
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation

{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject); { 新しいメソッドのコード }
begin
Form1.Color := clGreen;
end;
end.

TForm1 に,フォームに追加したボタンを示すフィールド Button1 が挿入されています。TButton はクラス型なので,Button1 はオブジェクトを指しています。

Delphi で記述するすべてのイベントハンドラは,フォームオブジェクトのメソッドです。イベントハンドラを作成するごとに,フォームオブジェクト型ではメソッドが宣言されます。TForm1 の型宣言では,TForm1 型の新しいメソッドとして手続き Button1Click が宣言されています。 ユニットの implementation 部には,Button1Click メソッドを実装するコードが挿入されています。



コンポーネント名の変更

コンポーネントの名前を変更するには,必ずオブジェクトインスペクタを使用します。たとえば,フォームのデフォルト名 Form1 を ColorBox のようなわかりやすい名前に変更するとします。コンポーネント名を変えるには,オブジェクトインスペクタで Name プロパティの値を変更します。Name プロパティを変更すると,フォームの .dfm ファイルまたは .xfm ファイル(通常,手作業では変更しないファイル)と,Delphi の生成する Object Pascal ソースコードの両方が自動的に更新されます。

unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Forms, Controls;
type
TColorBox = class(TForm) { Form1 から TColorBox に変わった }
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
ColorBox: TColorBox; { Form1 から ColorBox に変わった }

implementation
{$R *.DFM}
procedure TColorBox.Button1Click(Sender: TObject);
begin
Form1.Color := clGreen; { Form1 への参照は変わっていない! }
end;
end.

ボタンの OnClick イベントハンドラに書かれたコードが変わってない点に注意してください。これは,コードを手作業で記述したためです。手作業で記述したコードは手作業で更新しなければなりません。

procedure TColorBox.Button1Click(Sender: TObject);
begin
ColorBox.Color := clGreen;
end;



オブジェクトからのデータとコードの継承

Delphi オブジェクトの概要に示したオブジェクト TForm1 は非常に単純なものに見えます。TForm1 には 1 つのデータフィールド Button1 と 1 つのメソッド Button1Click だけが記述され,プロパティは記述されていません。ところが,このアプリケーションでは,フォームの表示と非表示,サイズ変更,最大表示ボタンやアイコン化ボタンの追加と削除,MDI アプリケーションに組み込むためのフォームの設定などができます。それは,コンポーネント TForm のプロパティとメソッドをすべて継承しているからです。プロジェクトに新しいフォームを追加する場合は,TForm から始まります。その後,コンポーネントの追加,プロパティ値の変更,イベントハンドラの記述を行うことで TForm をカスタマイズしていきます。どのオブジェクトをカスタマイズする場合でも,最初に既存のオブジェクトから新しいオブジェクトを派生させます。プロジェクトに新しいフォームが追加されると,Delphi は自動的に TForm 型から新しいフォームを派生させます。

TForm1 = class(TForm)

派生したオブジェクトは,派生元オブジェクトのプロパティ,イベント,メソッドをすべて継承しています。派生先のオブジェクトを下位オブジェクトと呼び,派生元のオブジェクトを上位オブジェクトと呼びます。オンラインヘルプで「TForm」を調べると,上位オブジェクトから継承される要素を含め,TForm のすべてのプロパティ,メソッド,イベントのリストを確認できます。オブジェクトは直接の上位オブジェクトを 1 つしか持てませんが,すぐ下には複数の下位オブジェクトを持つことができます。



スコープと限定子

スコープによって,オブジェクトのフィールド,プロパティ,およびメソッドのアクセス可能性が決まります。オブジェクト内で宣言されたメンバーは,そのオブジェクトと下位オブジェクトで利用可能です。メソッドの実装コードはオブジェクト宣言の外にありますが,オブジェクト宣言の中でメソッドが宣言されるので,やはりメソッドもそのオブジェクトのスコープ内にあります。

オブジェクトのプロパティ,メソッド,またはフィールドを参照するメソッドの実装コードを書く場合,そのメソッドが宣言されているオブジェクト内の各識別子の前にオブジェクト名を指定する必要はありません。たとえば,新しいフォームにボタンを 1 つ挿入したとすると,このボタンの OnClick イベントのイベントハンドラは次のように記述できます。

procedure TForm1.Button1Click(Sender: TObject);
begin
Color := clFuchsia;
Button1.Color := clLime;
end;

上の 1 番目の文は次の文と同等です。

Form1.Color := clFuchsia

Color プロパティの前に限定子 Form1 を置く必要はありません。Button1Click メソッドは TForm1 オブジェクトのスコープ内にあるからです。つまり,呼び出したメソッド本体の中にある限定子は,TForm1 インスタンスのスコープの範囲内にあります。これに対し,2 番目の文はボタンオブジェクトの色(イベントハンドラを宣言したフォームの色ではない)を参照しているので,限定子を付ける必要があります。

Delphi は,各フォームごとに個別のユニット(ソースコード)ファイルを作成します。あるフォームのユニットファイルから別のフォームにアクセスする場合は,次の例に示すように,コンポーネント名に限定子を付ける必要があります。

Form2.Edit1.Color := clLime;

同じ方法で,ほかのフォームからもコンポーネントのメソッドにアクセスできます。次に例を示します。

Form2.Edit1.Clear;

Form1 のユニットファイルから Form2 のコンポーネントにアクセスするには,Form1 ユニットの uses 節に Form2 のユニットを追加します。

オブジェクトのスコープは,そのオブジェクトの下位オブジェクトに及びます。ただし,下位オブジェクトの中でフィールド,プロパティ,またはメソッドを再宣言することもできます。下位オブジェクトの中で再宣言すると,継承したメンバーが隠蔽またはオーバーライドされます。

スコープについての詳細は,ブロックとスコープを参照してください。uses 節の使い方については,ユニット参照と uses 節を参照してください。継承メンバーの隠蔽とオーバーライドについては,アクションリストについての詳細は,クラスとオブジェクトを参照してください。



private 宣言,protected 宣言,public 宣言,published 宣言

フィールド,プロパティ,またはメソッドを宣言すると,その新しいメンバーは何らかの可視性を持ちます。可視性は,private,protected,public,published のいずれかのキーワードで示します。メンバーの可視性を指定することにより,ほかのオブジェクトやユニットからどうアクセスできるかが決まります。

プライベートメンバーは,プライベートメンバーが宣言されているユニットの中でしかアクセスできません。一般に,クラス内でプライベートメンバーを使用して,ほかの(
public または published の)メソッドとプロパティを実装します。
プロテクトメンバーは,そのクラスが宣言されているユニットの中だけでなく,下位クラスからもアクセスできます。下位クラスがどのユニットに属しているかは関係ありません。
パブリックメンバーは,パブリックメンバーが属しているオブジェクトにアクセス可能な場所であれば,どこからでもアクセスできます。つまり,クラス宣言の入ったユニットからアクセスできるだけでなく,そのユニットを使用する別のユニットからもアクセスできます。

パブリッシュメンバーの可視性はパブリックメンバーと同じです。パブリックメンバーとの違いは,コンパイラにより実行時型情報が生成されるという点です。設計時は,オブジェクトインスペクタにパブリッシュプロパティが表示されます。

可視性の詳細については,クラスメンバーの可視性を参照してください。



オブジェクト変数の使い方

オブジェクト変数は,同じ型か代入互換性のある型の別のオブジェクト変数に代入できます。特に,値を代入するオブジェクト変数の型が上位と下位の関係にある場合,代入先が上位であれば代入できます。たとえば,次のような TDataForm 型宣言(VCL のみ)と変数宣言部があるとします。変数宣言部には AForm と DataForm の 2 つの変数が宣言されています。

type
TDataForm = class(TForm)
Button1: TButton;
Edit1: TEdit;
DataGrid1: TDataGrid;
Database1: TDatabase;
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
AForm: TForm;
DataForm: TDataForm;

AForm は TForm 型に属し,DataForm は TDataForm 型に属します。TDataForm は TForm の下位オブジェクトなので,次の代入文は有効です。

AForm := DataForm;

ボタンの OnClick イベントのイベントハンドラを記述したとします。ボタンをクリックすると,この OnClick のイベントハンドラが呼び出されます。どのイベントハンドラにも TObject 型の Sender パラメータがあります。

procedure TForm1.Button1Click(Sender: TObject);
begin
...
end;

Sender 型が TObject に属しているため,Sender には任意のオブジェクトを割り当てられます。Sender の値は常に,発生したイベントに応答するコントロールやコンポーネントを指しています。予約語 is を使用して Sender を調べると,イベントハンドラを呼び出したコンポーネントやコントロールの型がわかります。次に例を示します。

if Sender is TEdit then
DoSomething
else
DoSomethingElse;



オブジェクトの作成,インスタンス化,破棄

ボタンや編集ボックスなど,Delphi で使用するオブジェクトの多くは設計時と実行時の両方で表示されます。一方,コモンダイアログボックスなど,実行時にしか表示されないオブジェクトもいくつかあります。また,タイマーやデータソースコンポーネントなど,実行時にはビジュアルな表現手段をいっさい持たないオブジェクトもあります。

独自のオブジェクトを作成することもできます。たとえば,Name,Title,HourlyPayRate の各プロパティを持つ TEmployee オブジェクトを作成するとします。さらに,HourlyPayRate フィールドのデータを使用する CalculatePay メソッドを追加して,給与額を計算するとします。この場合,TEmployee 型は次のように宣言できます。

type
TEmployee = class(TObject)
private
FName: string;
FTitle: string;
FHourlyPayRate: Double;
public
property Name: string read FName write FName;
property Title: string read FTitle write FTitle;
property HourlyPayRate: Double read FHourlyPayRate 
write FHourlyPayRate;
function CalculatePay: Double;

end;

上で定義したフィールド,プロパティ,メソッドだけでなく,TEmployee は TObject のメソッドをすべて継承しています。この例のような型宣言をユニットの interface 部か implementation 部に置き,次に,Create メソッド(TEmployee が TObject から継承したメソッド)を呼び出して新しいクラスのインスタンスを作成します。

var
Employee: TEmployee;
begin
Employee := TEmployee.Create;
end;

Create メソッドをコンストラクタと呼びます。コンストラクタは新しいインスタンスオブジェクトにメモリを割り当て,そのオブジェクトへの参照を返します。

フォーム上のコンポーネントは Delphi により自動的に作成,破棄されます。ただし,オブジェクトをインスタンス化する独自のコードを記述した場合は,オブジェクトの破棄処理も自分で書かなければなりません。どのオブジェクトも TObject から Destroy メソッド(デストラクタという)を継承しますが,オブジェクトを破棄するには Free メソッドを使うようにしてください。Free メソッドを使うと,Destroy を呼び出す前に nil 参照かどうかをチェックすることができます。なお,Free メソッドも TObject から継承されています。次に例を示します。

Employee.Free

上の例では,Employee オブジェクトを破棄して,メモリの割り当てを解除しています。



コンポーネントとオーナー

Delphi に組み込まれているメモリ管理メカニズムにより,あるコンポーネントが別のコンポーネントを解放することを前提として考えられるようになっています。解放する側のコンポーネントをオーナーと呼び,オーナーは解放される側のコンポーネントを「所有している」と表現します。オーナーのメモリが解放されると,所有されている側のコンポーネントのメモリも自動的に解放されます。コンポーネントのオーナー(すなわち Owner プロパティの値)は,コンポーネントの作成時にコンストラクタに渡されるパラメータによって決まります。デフォルトでは,フォームはフォーム上のコンポーネントを所有し,アプリケーションはフォームを所有します。したがって,アプリケーションが終了すると,フォームおよびフォーム上の全コンポーネントのメモリも解放されます。

所有関係は,TComponent とその下位オブジェクトにのみ適用されます。たとえば,TStringList オブジェクトや TCollection オブジェクトを作成した場合には,フォームに関連付けているかどうかに関わらず,プログラマ自身でオブジェクトを解放しなければなりません。

メモ コンポーネントのオーナーとは異なるので,混同しないように注意してください



オブジェクト,コンポーネント,コントロール

次の図は,継承の階層を単純化した図です。オブジェクト,コンポーネント,コントロール間の関係を示しています。 

オブジェクト,コンポーネント,コントロール

どのオブジェクトも TObject から派生し,多くのオブジェクトが TComponent から派生します。コントロールは TControl から要素を継承するオブジェクトで,実行時にコントロール自身を表示する能力を持ちます。TCheckBox のようなコントロールの場合,TObject,TComponent,TControl の全機能を継承するだけでなく,独自の特殊機能も持っています。

下の図は VCL(ビジュアルコンポーネントライブラリ)の構造を簡単に表したもので,継承ツリーの中の主要ブランチを示しています。この図のレベルでは,CLX(クロスプラットフォーム用コンポーネントライブラリ)と VCL はほとんど同じです。ただし,VCL の TWinControl は CLX では TWidgetControl になります。

単純化した階層図

上の図はいくつかの基本クラスを示しています。各基本クラスの説明を下の表に示します。

クラス 説明
TObject VCL または CLX のあらゆるクラスの最上位に位置する基本クラス。オブジェクトのインスタンスの作成,保守,破棄などの基本機能を実行するメソッドを導入する。これにより,すべての VCL/CLX オブジェクトに共通する基本動作をカプセル化する
Exception 例外に関連するクラスの基本クラス。エラー条件に対する一貫したインターフェースを提供し,アプリケーションが的確にエラーを処理できるようにする
TPersistent プロパティを実装するオブジェクトの基本クラス。TPersistent に属するクラスは,ストリームへのデータ送信を処理し,クラスの割り当てを可能にする
TComponent 非ビジュアルコンポーネント(TApplication など)の基本クラス。TComponent は,すべてのコンポーネントに共通する上位クラスである。TComponent クラスでは,コンポーネントをコンポーネントパレットに表示でき,コンポーネント自身がほかのコンポーネントを所有できる。また,フォーム上で直接コンポーネントを操作できる 
TControl 実行時に表示されるコントロールの基本クラス。TControl はすべてのビジュアルコンポーネントに共通する上位クラスであり,位置やカーソルのような標準のビジュアルコントロールを提供する。加えて,マウスアクションに応答するイベントも提供する 
TWinControl ユーザーインターフェースオブジェクト(CLX ではウィジェットとも呼ばれる)の基本クラス。TWinControl に属するコントロールは,キーボード入力を受け取ることのできるウィンドウコントロールであるCLX では,TWidgetControl が TWinControl の代わりになります。
VCL オブジェクト階層の全体図については,本製品に同梱されている VCL Object Hierarchy(階層図)を参照してください。



TObject ブランチ

TObject ブランチは TObject から派生したオブジェクトで構成されます。ただし,TPersistent から派生したオブジェクトは含まれません。VCL オブジェクトと CLX オブジェクトはすべて TObject から派生しています。TObject とは,作成,破棄,メッセージ処理,システムイベント処理などの基本動作を定義するメソッドだけを持つ抽象クラスです。VCL オブジェクトおよび CLX オブジェクトの強力な機能の多くは,TObject が導入するメソッドによって実装されています。TObject は,以下の機能を提供するメソッドを導入して,VCL と CLX の全オブジェクトに共通する基本動作をカプセル化します。

オブジェクトのインスタンスが作成/破棄されたときに応答できる
オブジェクトのクラス型とインスタンス情報,およびパブリッシュプロパティに関する実行時型情報(RTTI: Runtime Type Information)を提供する
メッセージ処理をサポートする(VCL のみ)

TObject から多くの単純なクラスが直接派生します。TObject ブランチに含まれるクラスには,重要な共通特性が 1 つあります。それは,どのクラスも一時的だということです。TObject ブランチに属するクラスは,破棄される前の状態を保存するメソッドを持っていません。すなわち持続性がありません。

その代表的な例が Exception クラスです。Exception クラスは,大規模な一連の組み込みの例外クラスを提供して,ゼロ除算,ファイル入出力エラー,無効な型キャスト,その他の例外条件を自動的に処理します。

TObject ブランチには,次のようにデータ構造をカプセル化するクラスもいくつかあります。

TBits: 論理値の「配列」を格納するクラス
TList: リストとリンクするクラス
TStack: ポインタの後入れ先出し配列を管理するクラス
TQueue: ポインタの先入れ先出し配列を管理するクラス

VCL には,TPrinter や TRegistry といった,外部オブジェクトのラッパーもあります。TPrinter は,Windows のプリンタインターフェースをカプセル化します。TRegistry は,システムレジストリおよびその操作を行う関数向けの低レベルのラッパーです。これらは Windows 環境に固有のものです。

このほか,TObject ブランチには,TStream のようなクラスもあります。TStream は,ディスクファイルやダイナミックメモリなどの各種の記憶媒体に対して読み書きのできる,ストリームオブジェクトの基本となるクラス型です。

このように,TObject には,アプリケーション開発に役立つ多種多様なクラスがあります。



TPersistent ブランチ

VCL/CLX の TPersistent ブランチは,TPersistent から派生したオブジェクトで構成されます。ただし,TComponent から派生したオブジェクトは含まれません。TPersistent はオブジェクトに持続性を与えます。持続性によって,フォームファイルまたはデータモジュールとともに何が保存されるか,またメモリから取り出されるときにフォームファイルまたはデータモジュールに読み出すものを決定できます。 

TPersistent ブランチに属するオブジェクトは,コンポーネントのプロパティを実装しています。フォームと一緒にプロパティの読み込みと保存をするには,プロパティのオーナーが存在していなければなりません。プロパティのオーナーとは,何らかのコンポーネントです。TPersistent ブランチから GetOwner 関数が導入されるので,この関数を使ってプロパティのオーナーを決定できます。

また,TPersistent ブランチ以降は published 部を持てるため,プロパティの読み込みと保存を自動的に行うことができます。また,DefineProperties メソッドを使うと,プロパティの読み込み方法と保存方法を指定できます。

このほか,TPersistent ブランチには以下のクラスもあります。

・TGraphicsObject: グラフィックオブジェクト(TBrush,TFont,TPen など)の抽象基本クラス 
・TGraphic: アイコン,ビットマップなどのビジュアルイメージを保存,表示するオブジェクト(TBitmap,TIcon,TMetafile など)(TMetafile は Windows のみ)の抽象基本クラス
・TStrings: 文字列リストを表すオブジェクトの基本クラス
・TClipboard: アプリケーションでカットまたはコピーしたテキストやグラフィックを格納するクラス
・TCollection,TOwnedCollection,TCollectionItem: 特別に定義した項目のインデックス付きコレクションを管理するクラス



TComponent ブランチ

TComponent ブランチは TComponent から派生したオブジェクトで構成されます。ただし,TControl から派生したオブジェクトは含まれません。TComponent に属するオブジェクトは,設計時にフォーム上で操作できるコンポーネントです。TComponent オブジェクトは,以下の機能を持つ持続的なオブジェクトです。

コンポーネントパレットに表示され,フォームデザイナ内で操作できる
コンポーネント自身がほかのコンポーネントを所有/管理できる
コンポーネント自身の読み込みと保存ができる

TComponent には,コンポーネントの動作を設計時に指示するメソッドや,コンポーネントと一緒に保存すべき情報を指示するメソッドがいくつかあります。ストリーミングが導入されるのは VCL および CLX の TComponent ブランチからです。Delphi は,ほとんどのストリーミング操作を自動的に処理します。パブリッシュに設定されたプロパティは持続性を持ち,自動的にストリーミングされます。 

また,VCL と CLX で広く使われている所有関係という考え方も TComponent から導入されます。所有関係をサポートするプロパティは,Owner プロパティと Components プロパティです。各コンポーネントに Owner プロパティがあります。Owner プロパティは別のコンポーネントをオーナーとして参照します。1 つのコンポーネントが複数のコンポーネントを所有することもあります。その場合,所有されている側のコンポーネントはすべて,所有する側のコンポーネントの Array プロパティで参照されます。

コンポーネントのコンストラクタはパラメータを 1 つ取り,そのパラメータを使って新規コンポーネントのオーナーを指定します。すでにオーナーが渡されていれば,そのオーナーのコンポーネントリストに新規コンポーネントが追加されます。Owner プロパティは,コンポーネントリストを使って被所有コンポーネントを参照するだけでなく,被所有コンポーネントを自動的に破棄する働きもします。オーナーを持つコンポーネントであれば,オーナーが破棄された時点でコンポーネントも破棄されます。たとえば,TForm は TComponent の下位オブジェクトなので,フォームが破棄されると,フォームが所有していたコンポーネントもすべて破棄され,そのメモリも解放されます。ここでは,デストラクタが呼び出されたとき,フォーム上のすべてのコンポーネントが自分自身を適切にクリーンアップすることを前提としています。 

プロパティ型が TComponent またはその下位オブジェクトの場合,ストリームシステムは,読み出しをするときにその型のインスタンスを作成します。プロパティ型が TComponent でなく TPersistent の場合,ストリームシステムは,プロパティを通じて使用可能な既存のインスタンスを使ってインスタンスのプロパティ値を読み込みます。

フォームファイル(フォーム上のコンポーネントに関する情報を保存するファイル)を作成する段階になると,フォームデザイナはコンポーネント配列内をループして,フォーム上のすべてのコンポーネントを保存します。どのコンポーネントも,各自のプロパティに加えられた変更内容をストリーム(この場合はテキストファイル)に書き出す方法を知っています。逆に,フォームファイルからコンポーネントのプロパティを読み込むときは,コンポーネント配列内をループして各コンポーネントを読み込みます。 

TComponent ブランチには以下のクラスがあります。

TMainMenu: フォームのメニューバーとそれに付随するドロップダウンメニューを提供するクラス 
TTimer: タイマー関数を持つクラス
TOpenDialog,TSaveDialog,TFontDialog,TFindDialog,TColorDialog など: 共通して使われるダイアログボックスを提供する
TActionList: コンポーネントやコントロール(メニュー項目,ボタンなど)と一緒に使われるアクションリストを管理するクラス
TScreen: アプリケーションによってインスタンス化されたフォームとデータモジュール,アクティブなフォームおよびフォーム内でアクティブなコントロール,画面のサイズと解像度,およびアプリケーションで使えるカーソルとフォントを追跡するクラス

ビジュアルインターフェースが不要なコンポーネントを作成するには,TComponent から直接派生させます。TTimer デバイスなどのツールを作成する場合は,TComponent から派生させます。この種のコンポーネントはコンポーネントパレットにありますが,実行時にユーザーインターフェースとして目に見える形で現れるのでなく,コードでアクセスされる内部関数を実行する働きをします。

CLX の TComponent ブランチには,THandleComponent というクラスもあります。THandleComponent は,アプリケーションの基礎を成す Qt オブジェクト(ダイアログ,メニューなど)へのハンドルを必要とする非ビジュアルコンポーネントの基本クラスです。



TControl ブランチ

TControl ブランチは,TControl から派生したコンポーネントで構成されます。ただし,TWinControl(CLX の TWidgetControl)から派生したコンポーネントは含まれません。TControl ブランチに属するオブジェクトはコントロールです。コントロールとは,実行時にユーザーが見たり操作したりできるビジュアルオブジェクトです。どのコントロールも,コントロールの表示に関係するプロパティ,メソッド,およびイベントを持っています。たとえば,コントロールの位置,コントロールのウィンドウ(CLX のウィジェット)に関連付けられているカーソル,コントロールをペイントしたり移動したりするメソッド,マウス動作に応答するイベントなどを持っています。コントロールはキーボード入力を受け付けません。

TComponent がコンポーネントの動作を定義するのに対し,TControl はビジュアルコントロールの動作を定義します。具体的には,描画ルーチン,標準イベント,包含関係などを定義します。 

コントロールは大きく分けて次の 2 種類があります。

自分自身のウィンドウ(またはウィジェット)を持つコントロール
自分の「親」のウィンドウ(またはウィジェット)を使用するコントロール

自分自身のウィンドウを持つコントロールのことを,VCL では「ウィンドウコントロール」,CLX では「ウィジェットベースのコントロール」と呼びます。この種のコントロールは TWinControl(CLX では TWidgetControl)から派生します。ボタン,チェックボックスなどがこのクラスのコントロールです。詳細については,TWinControl ブランチを参照してください。

親のウィンドウ(またはウィジェット)を使用するコントロールは「グラフィックコントロール」と呼ばれます。この種のコントロールは TGraphicControl から派生します。イメージコントロール,ラベルコントロールなどがグラフィックコントロールです。VCL では,ウィンドウコントロールとグラフィックコントロールの一番大きな違いは,グラフィックコントロールがウィンドウハンドルを保持しないことです。したがって,グラフィックコントロールは入力フォーカスを受け取ることができません。CLX では,両者の一番大きな違いはグラフィックコントロールが関連ウィジェットを持たないことです。このため,グラフィックコントロールは入力フォーカスを受け取れず,ほかのコントロールを格納することもできません。グラフィックコントロールはハンドルが不要なので,必要とするシステムリソースも少なくなります。よって,ウィジェットベースのコントロールをペイントするより,グラフィックコントロールをペイントする方が高速です。

TGraphicControl は自身を描画するコントロールです。具体的には以下のコントロールがあります。

コントロール 説明
TImage グラフィックイメージを表示する
TLabel フォーム上にテキストを表示する
TBevel ベベルのアウトラインを表す
TPaintBox アプリケーションがイメージを描画するのに使うキャンバスを提供する
これらのコントロールには共通のペイントルーチン(Repaint,Invalidate など)が含まれていますが,これらのルーチンはフォーカスを受け取る必要がありません。 



TWinControl ブランチ

TWinControl ブランチ(CLX では TWidgetControl ブランチ)は,TWinControl から派生したコントロールで構成されます。 TWinControl は,すべてのウィンドウコントール(アプリケーションのインターフェースで使用するアイテムの多くを含む)の基本クラスです。 

TWidgetControl は,ウィジェットベースのコントロール(またはウィジェット自体)の基本クラスです。「ウィジェット」という語は,「ウィンドウ」と「ガジェット」を組み合わせてできた語です。アプリケーションのユーザーインターフェースで使用する部品のほとんどが「ウィジェット」です。たとえば,ボタン,ラベル,スクロールバーなどです。

ウィンドウコントロールおよびウィジェットベースのコントロールの特徴は次のとおりです。

・どちらもアプリケーションの実行時にフォーカスを受け取ることができる
・他のコントロールもデータを表示できるが,ユーザーがキーボードを使って対話できるのはウィンドウコントロールおよびウィジェットベースのコントロールだけである
・ウィンドウコントロールもウィジェットベースのコントロールも,他のコントロールを格納することができる
・他のコントロールを格納する側を「親」コントロールと呼ぶ。ウィンドウコントロールとウィジェットベースのコントロールは,1 つ以上の子コントロールの親になることができる(他のコントロールはできない)
・ウィンドウコントロールはウィンドウハンドルを持つウィジェットベースのコントロールは,関連のウィジェットを持っている

TWinControl(CLX の TWidgetControl) から派生したコントロールは,フォーカスを受け取ることができます。すなわち,アプリケーションユーザーのキーボード入力を受け付けます。言い換えれば,より多くの標準イベントをウィジェットベースのコントロールに適用することができます。

このブランチには,自動的に描画されるコントロール(TEdit,TListBox,TComboBox,TPageControl など)と,Delphi が描画すべきカスタムコントロール(TDBNavigator,TMediaPlayer(VCL のみ),TGauge(VCL のみ)など)の両方があります。TWinControl(CLX の TWidgetControl)から直接派生するオブジェクトは,一般に標準コントロール(編集フィールド,コンボボックス,リストボックス,ページコントロールなど)を実装することが多いため,ペイントの仕方はすでにわかっています。 

ウィンドウハンドルを必要とするコンポーネントのうち,自身を再描画する機能を持つ標準コントロールをカプセル化しないコンポーネントに対しては,TCustomControl というクラスが用意されています。しかし,コントロールの描画やイベント応答に関する実装の細かいことを心配する必要はありません。プログラマにかわって Delphi が完全にカプセル化してくれます。



TControl に共通するプロパティ

すべてのビジュアルコントロール(TControl の下位オブジェクト)には,以下に挙げるような共通プロパティがいくつかあります。

アクションプロパティ 
位置,サイズ,位置揃えのプロパティ 
表示プロパティ 
親プロパティ 
移動プロパティ 
ドラッグアンドドロッププロパティ 
ドラッグアンドドックプロパティ (VCL のみ)

上に挙げたプロパティは TControl から継承され,オブジェクトインスペクタに表示されますが,該当するコンポーネント以外にはパブリッシュされません。たとえば,TImage の色は表示するグラフィックによって決まるので,TImage は Color プロパティをパブリッシュしません。



TControl: アクションプロパティ

Action プロパティを使うと,アクションを実行するための共通コードを共有し(ツールバーボタンとメニュー項目に同じことをさせるときなど),アプリケーションの状態に応じてアクションを使用可/使用不可にする作業を一元化できます。

・Action プロパティは,コントロールに関連付けられているアクションを指定する
・ActionLink プロパティは,コントロールに関連付けられているアクションリンクオブジェクトを格納する



TControl: 位置,サイズ,位置揃えのプロパティ

以下に挙げるプロパティは,親コントロール上に配置されているコントロールの位置とサイズを定義します。

・ Height プロパティは,垂直方向(高さ)のサイズを設定する
Width プロパティは,水平方向(幅)のサイズを設定する
・ Top プロパティは,上端の位置を決める
・ Left プロパティは,左端の位置を決める
・ AutoSize プロパティは,コントロールのサイズがコントロールの中身に合わせて自動的に変わるかどうかを指定する
・ Align プロパティは,コンテナ(親コントロール)内でコントロールを揃える方法を指定する
・ Anchors プロパティは,コントロールが親に対してどのようにアンカー設定されるかを指定する(VCL のみ)

以下に示すプロパティは,コントロールのクライアント領域の高さ,幅,および全体サイズを指定します。

・ ClientHeight プロパティは,コントロールのクライアント領域の高さをピクセル数で指定する
・ ClientWidth プロパティは,コントロールのクライアント領域の水平方向のサイズをピクセル数で指定する

これらのプロパティは,非ビジュアルコンポーネントではアクセスできません。ただし,フォームに追加したコンポーネントアイコンの位置は Delphi に記録されています。設計時間のほとんどは,フォーム上のコントロールのイメージを操作したり位置合わせパレットを使ってこれらのプロパティを設定/変更することに費やされます。しかし,これらのプロパティは実行時にも変更できます。



TControl: 表示プロパティ

コントロールの外観を制御するプロパティは次のとおりです。

・ Color は,コントロールの背景色を変更する
・ Font は,テキストの色,フォントの種類,スタイルまたはサイズを変更する。
・ Cursor プロパティは,コントロールの対象領域上にマウスがあるときにマウスカーソルの表示に使うイメージを指定する 
・ DesktopFont プロパティは,コントロールがテキストを表示するときに Windows アイコンフォントを使うかどうかを指定する(VCL のみ)



TControl: 親プロパティ

アプリケーション全体の外観を統一するには,コントロールの親プロパティ(ParentXXX)を True に設定して,コントロールの外観をそのコンテナ(親)に合わせます。 

・ ParentColor プロパティは,コントロールの色情報を親に合わせるかどうかを決める
・ ParentFont プロパティは,コントロールのフォント情報を親に合わせるかどうかを決める

・ ParentShowHint プロパティは,ヘルプヒントの表示を親に合わせるかどうかを決める



TControl: 移動プロパティ

フォームのコントロール間をユーザーが移動する方法を決めるプロパティは次のとおりです。

・Caption プロパティは,コンポーネントに付けるラベルのテキスト文字列を保持する。文字列の文字に下線を付けるには,文字の前に &(アンド記号)を付ける。このような文字をアクセラレータキーという。ユーザーは,〔Alt〕を押しながら下線付き文字を入力して,コントロールまたはメニュー項目を選択できる 



TControl: ドラッグアンドドロッププロパティ

ドラッグアンドドロップ動作を制御するコンポーネントプロパティは 2 つあります。

・ DragMode プロパティは,ドラッグの開始方法を決める。デフォルト値は dmManual であり,この場合,ドラッグを開始するにはアプリケーションが BeginDrag メソッドを呼び出す必要がある。DragMode の値が dmAutomatic の場合は,マウスボタンを押すとすぐにドラッグが始まる
・ DragCursor プロパティは,ドラッグ可能なコンポーネントの上にマウスポインタが来たときのポインタの形状を決める(VCL のみ)



TControl: ドラッグアンドドックプロパティ(VCL のみ)

TWinControl および TWidgetControl でドラッグアンドドック動作を制御するプロパティには以下のものがあります。

・ Floating プロパティは,コントロールがフローティングウィンドウかどうかを示す
・ DragKind プロパティは,コントロールを通常どおりにドラッグするか,それともドラッグアンドドック操作するかを指定する
・ DragMode プロパティは,コントロールがドラッグアンドドロップ操作またはドラッグアンドドック操作をどのように開始するかを決める
・ FloatingDockSiteClass プロパティは,コントロールがフローティングウィンドウ状態の時にコントロールを収容する一時的なコントロールのクラスを指定する
・ DragCursor プロパティは,コントロールがドラッグされているときに表示するカーソルを示す
・ DockOrientation プロパティは,同じ親にドッキングされている他のコントロールに対して,コントロールがどのようにドッキングされるかを指定する
・ HostDockSite プロパティは,コントロールのドッキング先となるコントロールを指定する
・ LRDockWidth プロパティは,水平方向にドッキングされるときのコントロールの幅を指定する
・ TBDockHeight プロパティは,垂直方向にドッキングされるときのコントロールの高さを指定する

・ UnDockHeight プロパティは,フロート状態のときのコントロールの高さを指定する
・ UnDockWidth プロパティは,フロート状態のときのコントロールの幅を指定する

詳細については,ドラッグアンドドックのコントロールへの実装を参照してください。



TControl に共通する標準イベント

VCL には,VCL コンポーネント用の標準イベント一式が定義されています。以下に挙げるイベントは TControl クラスの一部として宣言されるので,TControl から派生するすべてのクラスで使用できます。

・OnClick イベントは,ユーザーがコントロールをクリックしたときに発生する
・OnContextPopup イベントは,ユーザーがコントロールを右クリックしたとき,あるいはポップアップメニューを呼び出したとき(キーボードの使用時など)に発生する
・OnCanResize イベントは,コントロールのサイズを変更しようとしたときに発生する
・OnResize イベントは,コントロールのサイズが変更された直後に発生する
・OnConstrainedResize イベントは,OnCanResize イベントの直後に発生する
・OnStartDock イベントは,DragKind が dkDock に設定されているコントロールをユーザーがドラッグし始めたときに発生する(VCL のみ)
・OnEndDock イベントは,オブジェクトのドッキングまたはドラッグの取り消しによって,オブジェクトのドラッグが終了したときに発生する(VCL のみ)
・OnStartDrag イベントは,ユーザーがコントロール上でコントロールまたはコントロール内のオブジェクトを左クリックしてドラッグを開始したときに発生する
・OnEndDrag イベントは,オブジェクトのドロップまたはドラッグの取り消しによって,オブジェクトのドラッグが終了したときに発生する
・OnDragDrop イベントは,ドラッグ中のオブジェクトをドロップしたときに発生する
・OnMouseMove イベントは,ユーザーがマウスポインタをコントロール上に置いてマウスポインタを移動したときに発生する
・OnDblClick イベントは,マウスポインタがコントロール上にあるとき,ユーザーがマウスの左ボタンをダブルクリックすると発生する
・OnDragOver イベントは,ユーザーがコントロール上にオブジェクトをドラッグしたときに発生する
・OnMouseDown イベントは,ユーザーがマウスポインタをコントロール上に置いてマウスボタンを押したときに発生する
・OnMouseUp イベントは,ユーザーがコンポーネント上にマウスポインタを置いてマウスボタンを押し,指を離したときに発生する



TWinControl と TWidgetControl に共通するプロパティ

どのウィンドウコントロール(VCL では TWinControl の下位オブジェクト,CLX では TWidgetControl の下位オブジェクト)も,以下の種類のプロパティを持っています。

・ コントロールに関する情報 
・ 境界スタイル表示プロパティ 
・ 移動プロパティ 
・ ドラッグアンドドックプロパティ (VCL のみ)

上に挙げたプロパティは TWinControl および TWidgetControl から継承され,オブジェクトインスペクタに表示されますが,該当するコントロール以外にはパブリッシュされません。 



TWinControl: 一般情報プロパティ

一般情報プロパティとは,TWinControl と TWidgetControl の外観に関する情報,クライアント領域のサイズと起点,Windows が割り当てる情報,およびヘルプコンテキスト情報を格納するプロパティです。

・ ClientOrigin プロパティは,コントロールのクライアント領域の左上隅の画面座標(ピクセル単位)を指定する。TWinControl でなく TControl から派生したコントロールの画面座標は,コントロールの親の画面座標に Left および Top プロパティ値を加えた値になる
・ ClientRect プロパティは,Top プロパティと Left プロパティを 0,Bottom プロパティと Right プロパティをそれぞれコントロールの Height と Width に設定した長方形を返す。ClientRect は Rect(0, 0, ClientWidth, ClientHeight) に相当する
・ Brush プロパティは,コントロールの背景を塗りつぶす色と模様を指定する
・ HelpContext プロパティは,状況感知型のヘルプの呼び出しに使うコンテキスト番号を指定する
・ Handle プロパティは,コントロールのウィンドウハンドルへのアクセスを提供する



TWinControl: 境界スタイル表示プロパティ

以下のベベルプロパティを使うと,フォーム上のベベル線,ベベルボックス,ベベル枠の外観,およびアプリケーション内のウィンドウコントロールの外観を調節できます。

VCL は,CLX と比べて多くのオブジェクトが境界スタイル表示プロパティをパブリッシュしています。これに対し,CLX はオブジェクトの数も少ないため,境界スタイル表示プロパティをパブリッシュするオブジェクトの数も VCL より少なくなっています。

・ BevelInner は,内部ベベルの形状(もり上がる,へこむ,または平ら)を指定する(VCL のみ)
・ BevelKind は,コントロールの端をベベル状にする場合のベベルの種類を指定する(VCL のみ)
・ BevelOuter プロパティは,外部ベベルの形状(もり上がる,へこむ,または平ら)を指定する
・ BevelWidth プロパティは,内部ベベルと外部ベベルの幅をピクセル単位で指定する
・ BorderWidth プロパティは,コントロールの境界の幅を取得または設定する
・ BevelEdges プロパティは,ベベル状にするコントロールの端を取得または設定する



TWinControl: 移動プロパティ

フォームのコントロール間をユーザーが移動する方法を決めるプロパティは 2 つあります。

・ TabOrder プロパティは,親のタブ順でのコントロールの位置,つまり,ユーザーが〔Tab〕を押したときにコントロールがフォーカスを受け取る順序を示す。最初はコンポーネントをフォームに追加した順序がタブ順になっているが,TabOrder を変更すればタブ順を変更できる。TabOrder が有効なのは,TabStop が True の場合のみ
・ TabStop プロパティは,ユーザーが〔Tab〕キーを使ってコントロールに移動できるかどうかを決める。TabStop を True に設定すると,コントロールはタブ順に入る(コントロールに〔Tab〕キーを使って移動できる)



TWinControl: ドラッグアンドドックプロパティ(VCL のみ)

VCL オブジェクトのドラッグアンドドック動作を管理するプロパティには以下のものがあります。

・ UseDockManager プロパティは,ドラッグアンドドック操作でドックマネージャが使用されるかどうかを指定する
・ DockClientCount プロパティは,ウィンドウコントロールにドッキングされているコントロールの数を指定する
・ VisibleDockClientCount プロパティは,ウィンドウコントロールにドッキングされている可視のコントロールの数を指定する
・ DockManager プロパティは,コントロールのドックマネージャインターフェースを指定する
・ DockClients プロパティは,ウィンドウコントロールにドッキングされているコントロールをリストする
・ DockSite プロパティは,コントロールがドラッグアンドドック操作の対象にできるかどうかを指定する

詳細については,ドラッグアンドドックのコントロールへの実装および TControl: ドラッグアンドドックプロパティ参照してください。



TWinControl と TWidgetControl に共通する標準イベント

VCL の TWinControl から派生するコントロールと,CLX の TWidgetControl から派生するコントロールに共通して存在するイベントは次のとおりです。なお,Windows で定義されているコントロールもすべて TWinControl に含まれます。すべてのコントロールに共通するイベントに加えて,以下のイベントがあります。

・OnEnter イベントは,コントロールがフォーカスを受け取ったときに発生する
・OnKeyDown イベントは,ユーザーが任意のキーを押すと発生する
・OnKeyPressイベントは,ユーザーが単一の文字キーを押したときに発生する
・OnKeyUp イベントは,ユーザーがキーを押した後,指を離したときに発生する
・OnExit イベントは,入力フォーカスがコントロールから別のコントロールへ移ったときに発生する
・OnMouseWheel イベントは,マウスホイールが回転したときに発生する
・OnMouseWheelDown イベントは,マウスホイールが下に回転したときに発生する
・OnMouseWheelUp イベントは,マウスホイールが上に回転したときに発生する

ドッキングに関連するイベントは次のとおりです。すべて VCL でのみ使用できます。

・OnUnDock イベントは,ウィンドウコントロールにドッキングされているコントロールをアプリケーションがドッキング解除しようとしたときに発生する(VCL のみ)
・OnDockDrop イベントは,コントロールに別のコントロールがドッキングされたときに発生する(VCL のみ)
・OnDockOver イベントは,コントロールの上に別のコントロールがドラッグされたときに発生する(VCL のみ)
・OnGetSiteInfo イベントは,コントロールのドッキング情報を返す(VCL のみ)



Delphi コンポーネントの使い方

Delphi の開発環境では,多くのビジュアルコンポーネントがコンポーネントパレットに用意されています。Delphi では,視覚的な設計作業はすべてフォームの中で行います。Delphi を起動するか,新規プロジェクトの作成を開始すると,空白のフォームが画面に表示されます。コンポーネントパレットからコンポーネントを選択し,フォームにドロップします。ボタンやリストボックスなどのビジュアルコンポーネントをフォーム上に配置して,アプリケーションのユーザーインターフェースの表示方法や操作方法を設計します。次に,配置したコンポーネントの位置,大きさなどの設計時プロパティを設定します。このときアプリケーションの基礎となるプログラムコードが,Delphi によって自動的に記述されます。

Delphi のコンポーネントは,機能に応じてコンポーネントパレットの各ページに分類されています。たとえば,メニュー,編集ボックス,またはボタンなど,さまざまな種類のアプリケーションに共通して使われるコンポーネントは,コンポーネントパレットの[Standard]ページにあります。タイマー,ペイントボックス,メディアプレーヤー,および OLE コンテナなどの便利な VCL コントロールは[System]ページにあります。

Delphi のコンポーネントは一見すると,他のクラスとまったく区別が付きません。しかし,Delphi のコンポーネントと,多くのプログラマが扱う標準クラスの階層構造との間には,いくつかの違いがあります。主な相違点は次のとおりです。

・Delphi のコンポーネントはすべて TComponent クラスから派生している 
・コンポーネントは,機能を追加または変更してサブクラス化するための「基底クラス」としての役目を果たすよりもむしろ,たいていの場合そのままの形で利用され,プロパティを介して変更される。コンポーネントの継承は通常,既存のイベント処理メンバー関数に特定のコードを追加する目的で行われる
・ コンポーネントは,スタックではなくヒープにのみ割り当てることができる
・ コンポーネントの重要なプロパティとして,実行時の型情報が組み込まれている
・ コンポーネントは,Delphi のユーザーインターフェースであるコンポーネントパレットに追加でき,コンポーネントパレットからフォームに追加できる

Delphi のコンポーネントは,標準のクラスよりも高度なカプセル化を実現します。たとえば,プッシュボタンを持つダイアログを使うと仮定します。VCL コンポーネントを使って開発された Windows プログラムの場合,ユーザーがボタンをクリックすると,システムが WM_LBUTTONDOWN というメッセージを生成します。プログラムは,このメッセージを受け取り(一般的には switch 文,メッセージマップ,および応答テーブルにより受け取り),メッセージに応答して実行されるルーチンにディスパッチします。 

Windows メッセージ(VCL)とシステムイベント(CLX)の大部分は,Delphi のコンポーネントによって処理されます。メッセージに応答する処理を行うには,イベントハンドラを記述するだけですみます。



コンポーネントのプロパティの設定

パブリッシュに設定されているプロパティは,オブジェクトインスペクタを使って設計時に設定できます。専用のプロパティエディタを使う場合もあります。

実行時にプロパティを設定するには,アプリケーションのソースコードで新しい値を指定します。

各コンポーネントのプロパティについての詳細は,オンラインヘルプを参照してください。



オブジェクトインスペクタの使い方

フォーム上でコンポーネントを選択すると,そのプロパティがオブジェクトインスペクタに表示されます。プログラマは,適宜オブジェクトインスペクタでプロパティを変更できます。〔Tab〕キーを押すと,値列とプロパティ列の間でカーソルの位置が切り替わります。カーソルがプロパティ列にあるとき,プロパティ名の最初の文字を入力すると,目的のプロパティにすばやく移動できます。論理型か列挙型のプロパティの場合,値列にあるドロップダウンリストから目的の値を選択します。ダブルクリックして表示値を切り替えることもできます。 

プロパティ名の隣に正符号(+)が表示されている場合,正符号をクリックするか,プロパティにフォーカスがあるときに「+」を入力すると,そのプロパティの下位項目が表示されます。同様に,プロパティ名の隣に負符号(-)が表示されている場合,負符号をクリックするか「-」を入力すると,そのプロパティの下位項目は非表示になります。

デフォルトでは,[旧式]に分類されるプロパティは表示されません。表示フィルタを変更するには,オブジェクトインスペクタで右クリックして[表示する項目]を選択します。詳細については,オブジェクトインスペクタのプロパティカテゴリを参照してください。

フォームで複数のコンポーネントを選択すると,オブジェクトインスペクタには,選択したコンポーネントのすべてで共有されるプロパティが表示されます(Name プロパティを除く)。選択したコンポーネントの共有プロパティの値が同一でない場合は,デフォルト値か,最初に選択したコンポーネントの値が表示されます。共有プロパティの値を変更すると,選択したコンポーネントの値がすべて変更されます。



プロパティエディタの使い方

Font プロパティなど,一部のプロパティには専用のプロパティエディタがあります。プロパティエディタを持つプロパティの場合,オブジェクトインスペクタでそのプロパティを選択すると,値列の隣に省略記号(...)が表示されます。プロパティエディタを開くには,値をダブルクリックするか,省略記号(...)をクリックするか,あるいはプロパティ名または値にフォーカスがあるときに〔Ctrl〕+〔Enter〕を押します。また,コンポーネントによっては,フォーム上でコンポーネントをダブルクリックしてもプロパティエディタが表示される場合があります。

プロパティエディタを使うと,ダイアログボックス 1 つで複雑なプロパティを簡単に設定できます。プロパティエディタは入力内容を検証し,多くの場合,プロパティの設定結果をプレビュー表示します。



実行時のプロパティの設定

設計時に設定できるプロパティは,ソースコードを使って実行時にも設定できます。たとえば,フォームのキャプションを次のように動的に割り当てることができます。

Form1.Caption := MyString;



メソッドの呼び出し

メソッドの呼び出しは,通常の手続きや関数と同じように行われます。たとえば,ビジュアルコントロールの Repaint メソッドで画面上のコントロールのイメージを再描画するとします。この場合,次のように描画グリッドオブジェクトの中で Repaint メソッドを呼び出します。

DrawGrid1.Repaint;

プロパティと同様に,限定子が必要かどうかはメソッド名のスコープによって決まります。たとえば,フォームの子コントロールのイベントハンドラの範囲内でフォームを再描画する場合には,メソッド呼び出しの前にフォーム名を付加する必要はありません。

procedure TForm1.Button1Click(Sender: TObject);
begin
Repaint;
end;

スコープについての詳細は,ブロックとスコープを参照してください。



イベント/イベントハンドラでの作業

Delphi では,記述するコードのほとんどはイベントに応じて直接または間接に実行されます。イベントとは,実行時の出来事(たいていはユーザーのアクション)を表す一種のプロパティです。イベントに直接応答するコードをイベントハンドラといいます。イベントハンドラは Object Pascal で記述された手続きです。このセクションでは,以下の内容を解説します。

・ 新規イベントハンドラの生成 
・ コンポーネントのデフォルトイベントハンドラの生成 
・ イベントハンドラの検索 
・ イベントと既存のイベントハンドラの関連付け 
・ メニューイベントとイベントハンドラの関連付け 
・ イベントハンドラの削除 



新規イベントハンドラの生成

Delphi は,フォームなどのコンポーネント用にスケルトンのイベントハンドラを生成できます。イベントハンドラを作成する方法は次のとおりです。

1 コンポーネントを選択します。
2 オブジェクトインスペクタの[イベント]タブをクリックします。オブジェクトインスペクタの[イベント]ページに,選択したコンポーネントに定義されているイベントが一覧表示されます。
3 目的のイベントを選択し,値列をダブルクリックするか,または〔Ctrl〕+〔Enter〕を押します。Delphi はコードエディタにイベントハンドラを生成し,begin..end ブロックの中にカーソルを配置します。
4 begin..end ブロックの中に,イベントが起きたときに実行するコードを入力します。



コンポーネントのデフォルトイベントハンドラの生成

一部のコンポーネントはデフォルトのイベントを持っています。デフォルトのイベントとは,そのコンポーネントで処理する頻度がもっとも高いイベントです。たとえば,ボタンのデフォルトイベントは OnClick です。デフォルトイベントハンドラを作成するには,フォームデザイナで目的のコンポーネントをダブルクリックします。スケルトンのイベント処理手続きが生成され,コードエディタが開きます。コードエディタでは,すでに手続き本文の中にカーソルが置かれているので,簡単にコードを追加することができます。

デフォルトイベントを持たないコンポーネントもあります。TBevel など一部のコンポーネントは,どのイベントにも応答しません。フォーム上でコンポーネントをダブルクリックしても,コードエディタが表示されず,別の応答をする場合もあります。たとえば,設計時にコンポーネントをダブルクリックすると,デフォルトのプロパティエディタなどのダイアログが表示されることがあります。



イベントハンドラの検索

フォームでコンポーネントをダブルクリックして,デフォルトイベントハンドラを生成した場合,同じ方法で検索することができます。コンポーネントをダブルクリックするとコードエディタが開き,イベントハンドラ本体の先頭にカーソルが配置されます。

デフォルト以外のイベントハンドラを検索する手順は次のとおりです。

1 フォーム上で,検索するイベントハンドラに対応するコンポーネントを選択します。
2 オブジェクトインスペクタで[イベント]タブを選択します。
3 目的のイベントを選択し,その値列をダブルクリックします。コードエディタが開き,イベントハンドラ本体の先頭にカーソルが配置されます。



イベントと既存のイベントハンドラの関連付け

複数のイベントに応答するイベントハンドラを記述しておくと,コードを再利用できます。たとえば,多くのアプリケーションはドロップダウンメニューのコマンドに相当するスピードボタンを提供します。ボタンとメニューコマンドが同じアクションを起動する場合,イベントハンドラを 1 つ書いておけば,ボタンとメニュー項目の両方の OnClick イベントに割り当てることができます。

既存のイベントハンドラとイベントを関連付ける方法は次のとおりです。

1 イベントハンドラと関連付けるコンポーネントをフォーム上で選択します。
2 オブジェクトインスペクタの[イベント]ページを表示し,イベントハンドラと結び付けるイベントを選択します。
3 値列にあるイベント値の横の下矢印をクリックし,既存のイベントハンドラのリストを開きます(リストには,同じフォームの中で,同じ名前のイベントについて書かれたイベントハンドラだけが表示されます)。リストのイベントハンドラ名をクリックして選択します。

このように関連付けすると,イベントハンドラを簡単に再利用できます。なお,アクションリストおよび VCL のアクションバンドはこれ以上にパワフルなツールです。これらを使うと,ユーザーコマンドに応答するコードを一元管理できます。クロスプラットフォームアプリケーションの場合,アクションリストは使用できますが,アクションバンドは使用できません。 



Sender パラメータの使い方

イベントハンドラの Sender パラメータは,どのコンポーネントがイベントを受け取ったか,つまり,どのコンポーネントがハンドラを呼び出したかを表します。複数のコンポーネントに同じイベントハンドラを共有させ,呼び出し元のコンポーネントに応じて異なる操作をさせたいとき,Sender パラメータを使うと便利です。その場合,if...then...else 文の中で Sender パラメータを使います。以下のコードは,Button1 が OnClick イベントを受け取ったときだけダイアログボックスのキャプションをアプリケーションタイトルに表示するように記述しています。

procedure TMainForm.Button1Click(Sender: TObject);
begin
if Sender = Button1 then 
AboutBox.Caption := 'About ' + Application.Title 
else 
AboutBox.Caption := '';
AboutBox.ShowModal;
end;



共通のイベントを表示してコードを書く

複数のコンポーネントの間に共通のイベントがある場合,その共通イベントもオブジェクトインスペクタに表示できます。まず,フォーム上で目的のコンポーネントをすべて選択(〔Shift〕を押しながらクリック)し,オブジェクトインスペクタの[イベント]ページを選択します。次に,オブジェクトインスペクタの値列を選択します。これで,共有イベントに新しいイベントハンドラを作成するか,または既存のイベントハンドラに共有イベントを割り当てることが可能になります。



メニューイベントとイベントハンドラの関連付け

メニューデザイナと MainMenu,PopupMenu の各コンポーネントを組み合わせて使うと,簡単にドロップダウンメニューやポップアップメニューを設計できます。ただし,メニューを使えるようにするには,ユーザーがメニュー項目を選択するか,アクセラレータキーまたはショートカットキーを押したとき,各メニュー項目が OnClick イベントに応答しなければなりません。このトピックでは,イベントハンドラをメニュー項目と関連付ける方法について説明します。メニューデザイナおよび関連コンポーネントに関する詳細は,メニューの作成と管理を参照してください。

メニュー項目のイベントハンドラを作成する手順は次のとおりです。

1 MainMenu オブジェクトか PopupMenu オブジェクトをダブルクリックしてメニューデザイナを開きます。
2 メニューデザイナでメニュー項目を選択します。オブジェクトインスペクタで,このメニュー項目の Name プロパティに値が設定されていることを確認します。
3 メニューデザイナに戻り,このメニュー項目をダブルクリックします。Delphi はコードエディタにイベントハンドラを生成し,begin..end ブロックの中にカーソルを配置します。
4 begin..end ブロック内に,ユーザーがこのメニューコマンドを選択したときに実行するコードを入力します。

メニュー項目に既存の OnClick イベントハンドラを関連付ける手順は次のとおりです。

1 MainMenu オブジェクトか PopupMenu オブジェクトをダブルクリックしてメニューデザイナを開きます。
2 メニューデザイナでメニュー項目を選択します。オブジェクトインスペクタで,このメニュー項目の Name プロパティに値が設定されていることを確認します。
3 オブジェクトインスペクタの[イベント]ページで,値列の OnClick の横にある下矢印をクリックして,以前に作成したイベントハンドラのリストを表示します(リストには,このフォームの OnClick イベントに作成したイベントハンドラだけが表示されます)。リストのイベントハンドラ名をクリックして選択します。



イベントハンドラの削除

フォームデザイナでコンポーネントを削除すると,Delphi はフォームの型宣言からそのコンポーネントを除去します。ただし,コンポーネントを削除しても,関連付けられたメソッドはユニットファイルから削除されずに残っています。フォーム上のほかのコンポーネントに呼び出される可能性があるからです。イベントハンドラなどのメソッドを手作業で削除することはできますが,その場合,メソッドの forward 宣言(ユニットの interface
部の中)と実現部(implementation 部の中)の両方を削除してください。両方を削除しないと,プロジェクト構築時にコンパイラエラーになります。



VCL コンポーネントと CLX コンポーネント

コンポーネントパレットには,さまざまなプログラミングタスクを処理するコンポーネントが多数用意されています。パレットにコンポーネントを追加したり,パレット上のコンポーネントを削除,再配置したりできます。また,コンポーネントテンプレートとフレームを作成して,コンポーネントをグループ化することもできます。

パレット上のコンポーネントは,目的と機能別に複数のページにグループ化されています。デフォルトのページ構成は Delphi のバージョンによって異なります。次の表に,標準のデフォルトページと,アプリケーション作成で使用するコンポーネントの一覧を示します。ページおよびコンポーネントの一部はクロスプラットフォームではありません。クロスプラットフォームかどうかについても下の表に明示しています。VCL 固有の非ビジュアルコンポーネントを使って Windows 専用の CLX アプリケーションを作成することも可能ですが,その場合,そのアプリケーションをクロスプラットフォームにするには,コードの Windows 専用部分を分離する必要があります。 

ページ名 説明 クロスプラットフォームか?
Standard 標準のコントロール,メニュー Yes
Additional 特殊コントロール Yes。ただし ApplicationEvents と CustomizeDlg は除く
Win32 Windows のコモンコントロール CLX アプリケーションを作成すると,かわりに[Common Controls]ページが現れ,このページに同じコンポーネントが多数表示される。RichEdit,UpDown,HotKey,Animate,DataTimePicker,MonthCalendar,Coolbar,PageScroller,ComboBoxEx はクロスプラットフォームでない
System システムレベルのアクセス用コンポーネントおよびコントロール。タイマー,マルチメディア,および DDE を含む Timer はクロスプラットフォームだが,PaintBox,MediaPlayer,OleContainer,Dde はクロスプラットフォームでない
Data Access 特定のデータアクセスメカニズムと連携しないデータベースデータを操作するコンポーネント Yes
Data Controls ビジュアルなデータベース対応コントロール Yes。ただし DBRichEdit,DBCtrlGrid,DBChart は除く
dbExpress dbExpress(クロスプラットフォーム対応で,データベースに依存しないレイヤ。動的に SQL を処理する方法を提供する)を使用するデータベースコントロール。SQL サーバーにアクセスするための共通のインターフェースを定義する Yes
DataSnap 多層データベースアプリケーションの作成に使用するコンポーネント No。ただし Windows CLX アプリケーションで使用できる
BDE ボーランドデータベースエンジンを介してデータアクセスを提供するコンポーネント No。ただし Windows CLX アプリケーションで使用できる
ADO ADO フレームワークを通じてデータアクセスを提供するコンポーネント No。ただし Windows CLX アプリケーションで使用できる
InterBase InterBase へのダイレクトアクセスを提供するコンポーネント Yes
InternetExpress Web サーバーアプリケーションと同時に多層データベースアプリケーションのクライアントとなるコンポーネント No。ただし Windows CLX アプリケーションで使用できる
Internet インターネット通信プロトコルおよび Web アプリケーション用コンポーネント Yes。ただし ClientSocket,ServerSocket,QueryTableProducer,XMLDoc,WebBrowser は除く
WebSnap Web サーバーアプリケーションを構築するためのコンポーネント No。ただし Windows CLX アプリケーションで使用できる
FastNet NetMasters インターネットコントロール No。ただし Windows CLX アプリケーションで使用できる
QReport 組み込みのレポートを作成する QuickReport コンポーネント No。ただし Windows CLX アプリケーションで使用できる
Dialogs 一般に使われるダイアログボックス Yes。ただし OpenPictureDialog,SavePictureDialog,PrinterSetup-Dialog,PageSetupDialog を除く
Win 3.1 Win 3.1 用の旧式コンポーネント No
Samples カスタムコンポーネントのサンプル No
ActiveX ActiveX サンプルコントロール。Microsoft のドキュメントを参照(msdn.microsoft.com) No
COM+ COM+ イベントを処理するためのコンポーネント No。ただし Windows CLX アプリケーションで使用できる
WebServices SOAP ベースの Web サービスを実装/使用するアプリケーションを記述するためのコンポーネント No。ただし Windows CLX アプリケーションで使用できる
Servers Microsoft Excel や Word 用の COM サーバー例(Microsoft MSDN ドキュメントを参照) No。ただし Windows CLX アプリケーションで使用できる
Indy Clients クライアント用のクロスプラットフォームインターネットコンポーネント(オープンソース Winshoes インターネットコンポーネント) Yes
Indy Servers サーバー用のクロスプラットフォームインターネットコンポーネント(オープンソース Winshoes インターネットコンポーネント) Yes
Indy Misc その他のクロスプラットフォームインターネットコンポーネント(オープンソース Winshoes インターネットコンポーネント) Yes
コンポーネントパレットに表示される各コンポーネントに関する情報は,ヘルプを参照してください。ただし,[ActiveX]ページ,[Servers]ページ,[Samples]ページの一部のコンポーネントはサンプルとしてのみ提供されており,詳しいマニュアルは付属していません。



コンポーネントパレットへのカスタムコンポーネントの追加

カスタムコンポーネント(独自に作成するコンポーネントまたはサードパーティ製のコンポーネント)をコンポーネントパレットにインストールして,アプリケーションで使用することができます。コンポーネントの作成については,コンポーネント作成の概要を参照してください。既存コンポーネントのインストール方法については,コンポーネントパッケージのインストールを参照してください。



テキストコントロール

多くのアプリケーションは,実行時にテキストを表示したり,ユーザーにテキストを入力させたりします。情報のサイズと形式に応じて数種類のテキストコントロールがあります。

コンポーネント 用途
TEdit 単一行テキストの編集
TMemo 複数行テキストの編集
TMaskEdit 郵便番号や電話番号のような特定の書式を持つテキストの編集
TRichEdit リッチテキスト形式の複数行テキストの編集(VCL のみ)
TEdit と TMaskEdit は,単一行テキストの編集ボックスを持つシンプルなテキストコントロールです。この編集ボックスにユーザーが情報を入力します。編集ボックスがフォーカスを受け取ると,挿入ポイントが点滅します。 
編集ボックスにテキストを入れるには,編集ボックスの Text プロパティに文字列値を割り当てます。編集ボックスに入れたテキストの外観を変えるには,Font プロパティに値を割り当てます。フォントは,書体,サイズ,色,属性を指定できます。指定したフォント属性は,編集ボックス内のテキスト全体に影響します。個別の文字ごとにフォント属性を変えることはできません。 

フォントサイズに応じてサイズが変わる編集ボックスを設計することもできます。フォントサイズによって編集ボックスのサイズが変わるようにするには,AutoSize プロパティを True に設定します。編集ボックスに入る文字の数を制限するには,MaxLength プロパティに値を割り当てます。
TMaskEdit は,テキストがとりうる有効な形式にコード化したマスクに対して入力テキストを検証する特殊な編集コントロールです。このマスクは,ユーザーに表示するテキストの形式を設定することもできます。
TMemo は,複数行のテキストを追加できるコンポーネントです。



テキストコントロールのプロパティ

テキストコントロールの主なプロパティは次のとおりです。

プロパティ 説明
Text 編集ボックスやメモコントロールに表示されるテキストを指定する
Font 編集ボックスやメモコントロールに入力されたテキストの属性を制御する
AutoSize 現在選択されているフォントに応じて,編集ボックスの高さを動的に変化させる
ReadOnly ユーザーがテキストを変更できるかどうか指定する
MaxLength 簡易テキストコントロール内の文字数を制限する



メモコントロールとリッチテキストコントロールのプロパティ

メモコントロールとリッチテキストコントロールには,複数行のテキストを扱うという共通点があります。このほかにも,共通のプロパティがいくつかあります。リッチテキストコントロールはクロスプラットフォームではないので注意してください。

TMemo も編集ボックスの一種ですが,TEdit と違って複数行のテキストを処理できます。メモコントロールでは,テキスト行が編集ボックスの右端を超えることが可能です。あるいは,超えた分を次の行に折り返すこともできます。次の行に折り返すかどうかを指定するには,WordWrap プロパティを使います。

このほか,メモコントロールとリッチテキストコントロールには以下のプロパティもあります。

・ Alignment プロパティ: コンポーネント内でのテキストの揃え方(左揃え,右揃え,中央揃え)を指定します。
・ Text プロパティ: コントロール内にテキストを保持します。Modified プロパティを使用すると,テキストが変更されたかどうかをアプリケーションで判定できます。
・ Lines プロパティ: テキストを文字列リストとして保持します。
・ OEMConvert プロパティは,コントロールに入力されたテキストを一時的に ANSI から OEM に変換するかどうかを指定します。ファイル名を検証するのに便利です(VCL のみ)。
・ WordWrap プロパティ: 右マージンでテキストをワードラップするかどうかを指定します。
・ WantReturns プロパティ: ユーザーがテキストに改行文字を挿入できるかどうかを指定します。
・ WantTabs プロパティ: ユーザーがテキストにタブを挿入できるかどうかを指定します。
・ AutoSelect は,オブジェクトがアクティブになったときにテキストを自動的に選択する(強調表示する)かどうかを指定します。
・ SelText プロパティ: 現在選択されている(強調表示している)テキスト部分を保持します。
・ SelStart プロパティと SelLength プロパティ: 選択されているテキスト部分の位置と長さを指示します。

SelectAll メソッドを使うと,実行時にメモ内のすべてのテキストを選択できます。



リッチテキストコントロール(VCL のみ)

リッチテキストコンポーネント(TRichEdit)は,リッチテキストの書式設定,印刷,検索,ドラッグアンドドロップをサポートするメモコントロールです。フォント属性,位置揃え,タブ,インデント,およびナンバリングについて設定できます。



特殊入力コントロール

特殊な入力を扱う以下のコンポーネントが使えます。

コンポーネント 用途
TScrollBar 連続した範囲内の値を選択する
TTrackBar 連続した範囲内の値を選択する(ScrollBar よりも視覚効果が高い)
TUpDown Edit コンポーネントに結び付けた増減ボタンを使って値を選択する(VCL のみ)
THotKey 〔Ctrl〕,〔Shift〕,〔Alt〕のキーシーケンスを入力する(VCL のみ)
TSpinEdit スピンウィジェットから値を選択する(CLX のみ)



スクロールバー

ScrollBar コンポーネントはスクロールバーを作成します。スクロールバーを使うと,ウィンドウ,フォーム,コントロールの内容をスクロールできます。ユーザーがスクロールバーを動かしたときに応答するコントロールの動作を指定するコードは,OnScroll イベントハンドラに作成します。

多くのビジュアルコンポーネントには,コードを追加せずに使える独自のスクロールバーがあります。このため,ScrollBar コンポーネントはさほど頻繁に使われません。たとえば TForm の VertScrollBar プロパティと HorzScrollBar プロパティを使うと,スクロールバーが自動的にフォームに配置されます。フォーム内にスクロール可能な領域を作成するには,TScrollBox を使います。



トラックバー

トラックバーを使うと,連続した範囲の整数値を設定できます。ボリュームや明るさなどの調整に使える便利なコントロールです。ユーザーが値を調整するには,スライドインジケータを特定の位置までドラッグするか,トラックバーの内側をクリックします。

・ トラックバーの範囲の上端と下端を設定するには,Max プロパティと Min プロパティを使います。
・ 選択範囲を強調表示するには,SelEnd プロパティと SelStart プロパティを使います 
・ トラックバーの向きを水平または垂直に設定するには,Orientation プロパティを使います。
・ デフォルトでは,トラックバーの下に 1 行の目盛りが表示されます。目盛りの位置を変えるには,TickMarks プロパティを使います。目盛りの間隔を制御するには,TickStyle プロパティと SetTick メソッドを使います。

トラックバーコンポーネントの 3 つの例

・ Position プロパティはトラックバーのデフォルトの位置を設定します。実行時にユーザーが選択した値の追跡も行います。
・ デフォルトでは,ユーザーが上下の矢印キーを押すと 1 目盛りずつ移動できます。1 回の移動分を変更するには,LineSize プロパティを設定します。
・ ユーザーが〔PageUp〕と〔PageDown〕を押したときに移動する刻みの数を指定するには,PageSize プロパティを設定します。



アップダウンコントロール(VCL のみ)

アップダウンコントロール(TUpDown)は上下の矢印ボタンから成り,一定の値ごとに整数値を増減させます。現在の値は Value プロパティで設定し,増減値(デフォルトは 1)は Increment プロパティで指定します。アップダウンコントロールを別のコンポーネント(テキストコントロールなど)と結び付けるには,Associate プロパティを使います。



スピンエディットコントロール(CLX のみ)

スピンエディットコントロール(TSpinEdit)は,「アップダウンウィジェット」,「リトルアローウィジェット」,「スピンボタン」とも呼ばれます。スピンエディットコントロールは,一定の値ごとに整数値を増減させます。実際に値を変えるには,アプリケーションのユーザーが上下の矢印ボタンをクリックして値を増減させるか,スピンボックスに直接値を入力します。 

現在の値は Value プロパティで設定し,増減値(デフォルトは 1)は Increment プロパティで指定します。



ホットキーコントロール(VCL のみ)

コンポーネントにフォーカスを移動するキーボードショートカットを指定するには,ホットキーコンポーネント(THotKey)を使います。HotKey プロパティは現在のキーの組み合わせを保持します。Modifiers プロパティは,HotKey に使用できるキーを決定します。

ホットキーは,メニュー項目の ShortCut プロパティとして割り当てることもできます。HotKey プロパティと Modifier プロパティでキーの組み合わせを指定しておくと,ユーザーがそのキーを使ったとき,Windows が目的のメニュー項目を起動します。 



スプリッタコントロール

位置を揃えた 2 つのコントロールの間にスプリッタ(TSplitter)を追加すると,ユーザーがその 2 つのコントロールのサイズを変更できるようになります。パネルやグループボックスなどのコンポーネントと一緒にスプリッタを使うと,フォームを複数のペインに分割し,各ペインに複数のコントロールを置くことができます。

フォームにパネルなどのコントロールを置いてから,そのコントロールと同じ位置合わせ(Align プロパティ)が設定されたスプリッタを配置します。最後に配置したコントロールの Align プロパティはクライアント基準(alClient)にします。これにより,ほかのコントロールをサイズ変更したとき,最後のコントロールが残りの領域を占めるようになります。たとえば,まずフォームの左端にパネルを置き,その Align を alLeft に設定します。次に,パネルの右にスプリッタを置き,これも alLeft に位置揃えします。最後に,スプリッタの右に別のパネルを置き,alLeft か alClient に設定します。 

MinSize プロパティは,隣り合うコントロールのサイズが変更されたときに,スプリッタの表示を残さなければならない最小サイズを指定します。Beveled プロパティを True に設定すると,スプリッタの端に 3D の外観が付加されます。



ボタンおよび類似のコントロール

アプリケーションでコマンドを起動するときは,メニューから選択するかわりにボタンを使うのが一般的方法です。Delphi にはボタンコントロールが用意されています。

コンポーネント 用途
TButton テキストを使ってコマンドの選択肢を表す
TBitBtn テキストとグリフを使ってコマンドの選択肢を表す
TSpeedButton グループ化されたツールバーボタンを作成する
TCheckBox オン/オフのオプションを表す
TRadioButton 相互に排他的な(同時に 1 つしか選べない)選択肢を表す
TToolBar ツールボタンとその他のコントロールを横一列に配置し,サイズと位置を自動的に調整する
TCoolBar 移動可能,サイズ変更可能なバンド内にウィンドウコントロールを表示する(VCL のみ)



ボタンコントロール

ユーザーはボタンコントロールをクリックして操作を開始できます。TButton コンポーネントにアクションを割り当てるには,そのアクションの OnClick イベントハンドラを作成します。設計時にボタンをダブルクリックすると,そのボタンの OnClick イベントハンドラがコードエディタに表示され編集できる状態になります。

・ ユーザーが〔Esc〕を押したときにボタンの OnClick イベントを発生させるようにするには,Cancel プロパティを True に設定します。
・ ユーザーが〔Enter〕を押したときにボタンの OnClick イベントを発生させるようにするには,Default プロパティを True に設定します。



ビットマップボタン

ビットマップボタンコンポーネント(BitBtn)は,ボタン面にビットマップのイメージを表示するボタンコントロールです。

・ ボタン用のビットマップを選ぶには,Glyph プロパティを設定します。
・ ボタンのグリフとデフォルト動作を自動的に設定するには,Kind プロパティを使います。
・ デフォルトでは,グリフはテキストの左側に表示される。位置を移動するには,Layout プロパティを使います。
・ グリフとテキストは自動的にボタンの中央に揃えられる。この位置を移動するには,Margin プロパティを使います。Margin プロパティは,イメージの端とボタンの端のピクセル数を設定します。
・ デフォルトでは,イメージとテキストは 4 ピクセルだけ離れています。この距離を増減するには,Spacing プロパティを使います。
・ ビットマップボタンには,上がった状態,下がった(押された)状態,使用不可の状態の 3 つがあります。状態ごとに異なるビットマップイメージを表示するには,NumGlyphs プロパティを 3 に設定します。



スピードボタン

スピードボタンは,通常,ボタン面にイメージが表示されたボタンです。グループとして動作させることができるという特性があります。通常は,パネルと一緒に使ってツールバーを作成します。

・ 複数のスピードボタンをグループにまとめるには,グループ内のすべてのボタンの GroupIndex プロパティを 0 以外の同じ値に設定します。
・ デフォルトでは,スピードボタンは上がった(選択されていない)状態で表示されます。最初からスピードボタンを選択した状態で表示するには,Down プロパティを True に設定します。
・ AllowAllUp プロパティが True の場合,同じグループのすべてのスピードボタンは選択されていない状態になります。ラジオグループのように動作するボタングループとして使いたい場合は,AllowAllUp を False に設定します。



チェックボックス

チェックボックスを作成すると,ユーザーはオン,オフのどちらかの状態を選択できます。オンが選択されると,チェックボックスをチェックした状態になります。オンが選択されなければ,チェックボックスはブランクになります。チェックボックスを作成するには,TCheckBox を使います。

・ デフォルトでチェックボックスをチェックした状態にするには,Checked プロパティを True に設定します。
・ チェックボックスの状態を 3 種類(チェックマークが付く,チェックマークが付かない,淡色表示)にするには,AllowGrayed プロパティを True に設定します。
・ State プロパティは,チェックボックスにチェックマークが付いているか(cbChecked),付いていないか(cbUnchecked),それとも淡色表示されているか(cbGrayed)を表します。

メモ チェックボックスコントロールは,2 つのバイナリ状態のどちらか一方を表示します。ほかの設定の関係でチェックボックスの現在値を決定できないときは,不確定の状態を使用します。



ラジオボタン

ラジオボタンは,相互に排他的な(一度に 1 つしか選べない)選択肢の集合です。単独のラジオボタンを作成するには,TRadioButton を使います。ラジオグループコンポーネント TRadioGroup を使うと,ラジオボタンのグループが自動的に配置されます。ラジオボタンをグループ化しておけば,ユーザーはいくつかのラジオボタンの中から選択できます。詳細は,コンポーネントのグループ化を参照してください。

ラジオボタンが選択されると,円の中央が塗りつぶされた状態になります。ラジオボタンが非選択であれば,空白の円になります。ラジオボタンの表示状態を変更するには,Checked プロパティの値を True または False にします。



ツールバー

ツールバーを使うと,ビジュアルコントロールの配置と管理を簡単に行うことができます。ツールバーは ToolBar 使って作成します。パネルコンポーネントとスピードボタンを組み合わせて作ることもできます。ToolBar コンポーネントを使う場合は,右クリックして[ボタン新規作成]を選択すと,ボタンをツールバーに追加できます。

TToolBar コンポーネントにはいくつか利点があります。ToolBar を使うと,ツールバー上のボタンは一定のサイズと間隔を保ち,その他のコントロールは相対的な位置と高さを保ちます。また,コントロールがツールバーの横幅に収まらない場合は自動的に次の行に折り返します。さらに TToolBar は,透過性,ポップアップボーダー,スペースなどの表示オプションのほか,コントロールをグループ化するディバイダなども提供します。

アクションリストアクションバンドを使えば,一連のアクションを使ってツールバーとメニューを一元管理できます。 

ツールバーは,別のコントロール(編集ボックス,コンボボックスなど)の親になることもできます。



クールバー(VCL のみ)

クールバーには,個別に移動とサイズ変更が行える子コントロールが配置されます。各コントロールはそれぞれのバンド上に常駐します。ユーザーは,各バンドの左側のサイズ変更グリップをドラッグして位置を設定できます。

クールバーを使用するためには,設計時および実行時にバージョン 4.70 以上の COMCTL32.DLL(通常は Windows\System または Windows\System32 ディレクトリに格納されている)が必要です。クールバーは,クロスプラットフォームアプリケーションでは使用できません。

Bands プロパティは TCoolBand オブジェクトの集合を保持する。設計時には,バンドエディタを使ってバンドの追加,削除,変更が行える。バンドエディタを開くには,オブジェクトインスペクタで Bands プロパティを選択して右側の欄をダブルクリックするか,省略記号(...)ボタンをクリックする。または,スピードメニューの[バンドの設定]を選択する。バンドの作成は,パレットから新しいウィンドウコントロールを追加することによっても行える
・ FixedOrder プロパティは,ユーザーがバンドの順序を変更できるかどうかを指定する
・ FixedSize プロパティは,バンドを統一した高さに保つかどうかを指定する



リストの処理

リストは,選択する項目の集合をユーザーに表示します。リストを表示するコンポーネントは以下のとおりです。

コンポーネント 表示内容
TListBox テキスト文字列のリスト
TCheckListBox 各項目の前にチェックボックスの付いたリスト
TComboBox スクロール可能なドロップダウンリストを持つ編集ボックス
TTreeView 階層状のリスト
TListView オプションでアイコン,カラム,見出しの付いた(ドラッグ可能な)項目のリスト
TDateTimePicker 日付または時刻入力用のリストボックス(VCL のみ)
TMonthCalendar 日付を選択するためのカレンダー(VCL のみ)
文字列リストとイメージリストを管理するには,非ビジュアルコンポーネントの TStringList と TImageList を使います。文字列リストについての詳細は,文字列リストの操作を参照してください。



リストボックス/チェックリストボックス

リストボックス(TListBox)とチェックリストボックスは,ユーザーが選択できる項目の一覧を表示します。

・ Items プロパティは,TStrings オブジェクトを使ってコントロールに値を入れます。
・ ItemIndex プロパティは,リストのどの項目が選択されているかを表します。
・ MultiSelect プロパティは,ユーザーが一度に複数の項目を選択できるかどうかを指定します。
・ Sorted プロパティは,リストをアルファベット順に並べるかどうかを決定します。
・ Columns プロパティは,リストコントロール内の列数を指定します。
・ IntegralHeight プロパティは,リストボックスの縦のスペースに完全に入る項目だけを表示するかどうか指定する(VCL のみ)
・ ItemHeight プロパティは,各項目の高さをピクセル単位で指定します。Style プロパティの設定によっては,ItemHeight の値が無視されることがあります。
・ Style プロパティは,リストコントロールに項目を表示する方法を指定します。デフォルトでは,項目は文字列として表示されます。Style プロパティの値を変更すると,オーナー描画リストボックスを作成できます。つまり,項目をグラフィックにしたり高さを可変にしたりできます。オーナー描画コントロールについての詳細は,コントロールへのグラフィックの追加を参照してください。

単純なリストボックスを作成する手順は次のとおりです。

1 プロジェクトを作成し,コンポーネントパレットにあるリストボックスコンポーネントをフォームにドラッグします。
2 必要に応じてリストボックスのサイズと位置揃えを設定します。
3 Items プロパティの右側をダブルクリックするか省略記号ボタンをクリックして,文字列リストエディタを表示します。
4 文字列リストエディタを使って,リストボックスに表示する自由形式テキストを入力し,順に並べます。 
5 [OK]をクリックします。

ユーザーがリストボックス内の複数の項目を選択できるようにするには,ExtendedSelect プロパティと MultiSelect プロパティを使います。



コンボボックス

コンボボックス(TComboBox)は,スクロール可能なリストと編集ボックスを組み合わせたものです。テキストを入力するかリストの項目を選択してユーザーがコントロールにデータを入力すると,Text プロパティの値が変化します。AutoComplete を有効にした場合,アプリケーションは,ユーザーが入力したデータにもっとも近いものをリストから探して表示します(AutoComplete プロパティは SBCS 文字に対してのみ有効です)。

3 種類のコンボボックスがあります(標準,ドロップダウン,ドロップダウンリスト)。デフォルトはドロップダウンです。

・ コンボボックスの種類を選択するには,Style プロパティを使います。
・ 編集ボックス付きのドロップダウンリストを作成するには,csDropdown を使う。編集ボックスを読み出し専用にする(ユーザーに強制的にリストから選択させる)には,csDropDownList を使います。リストに表示する項目の数を変えるには,DropDownCount プロパティを設定します。
・ リストが閉じない編集ボックスを作成するには csSimple を使う。リスト項目が表示されるようにコンボボックスのサイズを調整すること
・ オーナー描画コンボボックスを作成して項目をグラフィカル表示にするか高さを可変にするには,csOwnerDrawFixed または csOwnerDrawVariable を使います。オーナー描画コントロールについての詳細は,コントロールへのグラフィックの追加を参照してください。

実行時,CLX と VCL ではコンボボックスの動作が異なります。CLX では,コンボボックスの編集フィールドにテキストを入力して〔Enter〕を押すと,ドロップダウンリストに項目を追加できます(VCL のコンボボックスではできません)。InsertMode を ciNone に設定すれば,この機能がオフになります。コンボボックスのリストには,空の(文字列のない)項目を追加することもできます。また,〔↓〕を押し続けるとコンボボックスのリストの最後の項目では止まらず,一番上に戻ります。



ツリービュー

ツリービュー(TTreeView)は,項目の全体構造をインデントして表示します。このコントロールは,ノードを展開するボタンと折りたたむボタンを提供します。各項目のテキストラベルが付いたアイコンを入れられるので,ノードが展開しているか折りたたんでいるかをアイコンで表示できます。チェックボックスなどのグラフィックを入れて,項目の状態を示すこともできます。

・ Indent プロパティは,親項目と項目を水平方向で分割するときの距離をピクセル数で設定する
・ ShowButtons プロパティは,項目が展開可能かどうかを示す[+]ボタンと[-]ボタンを表示させる
・ ShowLines プロパティは,階層関係を示す接続線を表示するかどうかを指定する(VCL のみ)
・ ShowRoot プロパティは,最上位項目を接続する線を表示するかどうか指定する(VCL のみ)

設計時にツリービューコントロールに項目を追加するには,コントロール上をダブルクリックして,ツリービュー項目エディタを表示します。ここで追加した項目が Items プロパティの値になります。実行時に項目を変更するには,Items プロパティ(TTreeNodes 型のオブジェクト)のメソッドを使います。TTreeNodes には,ツリービュー内で項目を追加,削除,移動するメソッドがあります。



リストビュー

リストビューを使うと,さまざまな形式でリストを表示できます。リストビューを作成するには TListView を使います。リストの種類を選択するには,ViewStyle プロパティを使います。以下に ViewStyle の設定値を示します。

・ vsIcon と vsSmallIcon は,各項目をラベル付きアイコンとして表示する。ユーザーはリストビューウィンドウ内で項目をドラッグできる(VCL のみ)
・ vsList は,項目をラベル付きアイコンとして表示します。項目をドラッグすることはできません。
・ vsReport は,各項目に 1 行を割り当て,列形式で情報を配置します。一番左の列に小さいアイコンとラベルを表示し,それに続く列にアプリケーションで指定した下位項目を入れます。列にヘッダーを表示するには,ShowColumnHeaders プロパティを使う



DateTimePicker と MonthCalendar(VCL のみ)

DateTimePicker コンポーネントは,日付または時刻を入力するためのリストボックスを表示します。MonthCalendar コンポーネントは,日付または日付の範囲を入力するためのカレンダーを表示します。これらのコンポーネントを使用するには,設計時および実行時にバージョン 4.70 以上の COMCTL32.DLL(通常は Windows\System または Windows\System32 ディレクトリに格納)が必要です。DateTimePicker と MonthCalendar は,クロスプラットフォームアプリケーションでは使用できません。



コンポーネントのグループ化

関連のあるコントロールと情報をグループに分けて表示すると,グラフィカルインターフェースがいっそう使いやすくなります。Delphi には,コンポーネントをグループ化するコンポーネントがいくつかあります。

コンポーネント 用途
TGroupBox タイトルが付いた標準のグループボックスを作成する
TRadioGroup ラジオボタンだけの単純なグループを作成する
TPanel 視覚的に融通のきくコントロールグループを作成する
TScrollBox コントロールを入れるスクロール可能領域を作成する
TTabControl 互いに排他的なノートブックスタイルのタブを作成する
TPageControl 互いに排他的なノートブックスタイルのタブとそれに対応するページを作成して各ページにほかのコントロールを入れる
THeaderControl 列ヘッダーのサイズを変更する



グループボックス/ラジオグループ

グループボックス(TGroupBox)は,関連のコントロールをフォーム上に並べるコンポーネントです。一般に,複数のラジオボタンをグループボックスにまとめます。最初にグループボックスを配置し,その後でコンポーネントパレットからコンポーネントを選択し,グループボックスに貼り付けます。Caption プロパティで,実行時に表示するグループボックスのラベルを指定します。

ラジオグループコンポーネント(TRadioGroup)を使うと,ラジオボタンのグループ化とそのグループに協調動作をさせる処理を簡略化できます。ラジオグループにボタンを追加するには,オブジェクトインスペクタで Items プロパティを編集します。Items に入力した文字列がキャプションとなり,ラジオグループボックスにラジオボタンとキャプションが表示されます。ItemIndex プロパティの値は,現在どのボタンが選択されているかを示します。Columns プロパティは,ラジオボタンを何列で表示するかを指定します。ボタンの間隔を変更するには,ラジオグループコンポーネントのサイズを変更します。



パネル

TPanel は,ほかのコントロールの汎用コンテナになるコンポーネントです。一般に,複数のコンポーネントを視覚的にグループ化してフォームに配置するときにパネルを使います。フォームと位置合わせできるので,フォームのサイズを変更してもパネルの相対的な位置を維持できます。パネル回りの境界線の幅を指定するには,BorderWidth プロパティを使ってピクセル数で設定します。 

パネルの中に複数のコントロールを格納できます。Align プロパティを使えば,グループ内のコントロールの位置を適切に保つことができます。パネルの Align プロパティを alTop に設定すると,フォームのサイズを変えてもパネルの位置は適正に維持されます。

パネルの外観を変える(もり上がった形かへこんだ形にする)には,BevelOuter プロパティと BevelInner プロパティを使います。これらのプロパティの値を変えると,3D のさまざまな視覚効果が得られます。ただし,単にベベルをもり上がった形かへこんだ形のどちらかにする場合には,TBevel を使った方が少量のリソースですみます。

また,1 つ以上のパネルを使って,さまざまなステータスバーや情報表示エリアを構築することもできます。



スクロールボックス

スクロールボックス(TScrollBox)は,フォームの中にスクロール領域を作成します。アプリケーションでは,特定領域に収まらない情報を表示する必要が生じることがよくあります。一部のコントロール(リストボックス,メモ,フォーム自身など)では,自動的に中身をスクロールできます。 

スクロールボックスには別の使い方もあります。たとえば,同じウィンドウに複数のスクロール領域(ビュー)を作成することができます。一般に,市販のワードプロセッサ,スプレッドシート,プロジェクト管理アプリケーションなどでビューがよく使われています。スクロールボックスを使うと,より柔軟にフォーム内に任意のスクロール領域を定義できます。

パネルやグループボックスと同様に,スクロールボックス内に別のコントロール(TButton,TCheckBox など)を配置することができます。ただし,通常は,スクロールボックスは表示されません。しかし,スクロールボックスの可視領域にコントロールが表示しきれなくなると,自動的にスクロールバーが表示されます。

スクロールボックスには別の使い方もあります。たとえば,ウィンドウ内のツールバーやステータスバーなどの領域(TPanel コンポーネント)でスクロールを制限することができます。ツールバーとステータスバーがスクロールしないようにするには,スクロールバーを非表示にしてから,ウィンドウ内のツールバーとステータスバーの間のクライアント領域にスクロールボックスを置きます。このスクロールボックスに関連付けられたスクロールバーは,ウィンドウに属しているように見えますが,スクロールボックスの内部でしかスクロールしません。



タブコントロール

タブコントロールコンポーネント(TTabControl)は,ノートの仕切りに似たタブを作成します。オブジェクトインスペクタで Tabs プロパティに文字列を追加するごとに,新しいタブが作成されます。タブコントロールとは,パネル上にひとまとまりのコンポーネントが入った単一のパネルです。タブをクリックしたときの外観を変えるには,OnChange イベントハンドラを記述する必要があります。複数ページのダイアログボックスを作成するには,タブコントロールでなくページコントロールを使います。



ページコントロール

PageControl コンポーネント(TPageControl)は,複数ページのダイアログボックスを作成するのに適したページセットです。1 つのページコントロールに,複数の重なり合ったページ(TTabSheet オブジェクト)が表示されます。ユーザーインターフェースでページを選択するには,コントロールの上部に表示されたタブをクリックします。

設計時にページコントロールに新しいページを作成するには,ページコントロールを右クリックして[ページ新規作成]を選択します。実行時に新規ページを追加するには,新規ページのオブジェクトを作成し,その PageControl プロパティを設定します。

NewTabSheet = TTabSheet.Create(PageControl1);
NewTabSheet.PageControl := PageControl1;

コードでアクティブページにアクセスするには,ActivePage プロパティを使います。プログラミングによってアクティブページを変更するには,ActivePage プロパティか ActivePageIndex プロパティを設定します。



ヘッダーコントロール

ヘッダーコントロール(THeaderControl)は列ヘッダーをまとめたものです。実行時には,ユーザーはヘッダーの選択とサイズ変更ができます。ヘッダーを追加,修正するには,Sections プロパティを使います。列やフィールドの上にヘッダーセクションを置きます。たとえば,リストボックス(TListBox)の上にヘッダーセクションを置くことがあります。 



情報の表示

ユーザーにアプリケーションの状態を知らせる方法は多数あります。たとえば,一部のコンポーネント(TForm を含む)が持っている Caption プロパティは,実行時にも設定できます。また,メッセージを表示するダイアログボックスを作成することもできます。特に,以下のコンポーネントは実行時に情報を表示する便利な方法です。

コンポーネントとプロパティ 用途
TLabel と TStaticText 編集不能のテキストを表示する
TStatusBar ステータス領域を表示する(通常はウィンドウ下部に表示)
TProgressBar 特定の作業の進行状況を表示する
Hint と ShowHint ヘルプヒントをアクティブにする
HelpContext と HelpFile 状況感知型オンラインヘルプにリンクする



ラベル/スタティックテキスト

ラベル(TLabel)は,テキストを表示するコンポーネントです。通常はほかのコントロールの隣に置きます。編集ボックスなどのコンポーネントを識別したり注釈を付けたりする場合や,フォームにテキストを表示したい場合,フォームにラベルを配置します。標準のラベルコンポーネント TLabel は非ウィンドウコントロール(CLX では非ウィジェットベース)なので,フォーカスを受け取ることができません。ウィンドウハンドルを持つラベルを作成するには,TLabel ではなく TStaticText を使います。 

ラベルの主なプロパティは次のとおりです。

・ Caption プロパティ: ラベルのテキスト文字列を保持します。
・ Font プロパティ,Color プロパティなどのプロパティ: ラベルの外観を決定します。各ラベルに設定できる書体,サイズ,色はそれぞれ 1 種類です。
・ FocusControl プロパティ: ラベルをフォーム上の別のコントロールとリンクさせます。キャプションにアクセラレータキーが含まれる場合,ユーザーがアクセラレータキーを使うとFocusControl プロパティで指定したコントロールにフォーカスが移動します。
・ ShowAccelChar プロパティは,下線付きアクセラレータ文字をラベルに表示するかどうかを指定する。ShowAccelChar を True にすると,&(アンド記号)で始まる文字に下線が表示され,有効なアクセラレータ文字になる
・ Transparent プロパティ: ラベルの下に重なっている項目(グラフィックなど)が隠れないように表示するかどうかを指定します。

通常,ラベルは読み出し専用の静的テキストとして表示されるので,アプリケーションのユーザーはラベルを変更できません。アプリケーションの実行時にラベルのテキストを変更するには,Caption プロパティに別の値を割り当てます。ユーザーがスクロールしたり編集できるテキストオブジェクトをフォームに追加する場合は,TEdit を使います。



ステータスバー

パネルを使ってステータスバーを作成することもできますが,ステータスバーコンポーネントを使った方が簡単です。デフォルトでは,ステータスバーの Align プロパティが alBottom に設定され,位置とサイズが管理されています。

ステータスバーに一度に表示する文字列を 1 行にするには,SimplePanel プロパティを True に設定し,ステータスバーに表示する文字列を SimpleText プロパティで設定します。

また,ステータスバーは複数のテキスト領域に分割して使用できます。パネルを作成するには Panels プロパティを使います。オブジェクトインスペクタからパネルエディタを開き,パネルの Width プロパティ,Alignment プロパティ,Text プロパティをそれぞれ設定します。各パネルの Text プロパティは,パネルに表示するテキストを保持します。



プログレスバー

アプリケーションが何か時間のかかる操作を実行する場合,プログレスバーを使って進行状況を表示することができます。プログレスバーで進行状況を表示すると,点線状のバーが左から右へ伸びていきます。

プログレスバー

Position プロパティは,点線状のバーの長さをトラッキングします。Max プロパティと Min プロパティは,Position プロパティの範囲を指定します。バーを進めるには,StepBy メソッドと StepIt メソッドを呼び出して Position プロパティの値を増やします。Step プロパティは,StepIt で使用する増分を指定します。



ヘルプとヒントプロパティ

ほとんどのビジュアルコントロールは,実行時に状況感知型ヘルプとヘルプヒントを表示できます。HelpContext プロパティはヘルプのコンテキスト番号を指定し,HelpFile プロパティはヘルプのファイル名を指定します。

Hint プロパティは,マウスポインタをコントロールまたはメニュー項目に置いたときに表示するテキスト文字列を保持します。ヘルプヒントを表示するには,ShowHint を True に設定します。ParentShowHint を True に設定しておくと,そのコントロールの ShowHint プロパティは親と同じ値になります。



グリッド(表)

グリッドとは,情報を行と列に並べて表示したものです。データベースアプリケーションを作成する場合は,TDBGrid または TDBCtrlGrid コンポーネントを使います。TDBGrid と TDBCtrlGrid についての詳細は,データコントロールの使い方を参照してください。データベース以外のアプリケーションを作成する場合は,標準の描画グリッドか文字列グリッドを使います。



描画グリッド

描画グリッド(TDrawGrid)は,任意のデータを表形式で表示します。グリッド内のセルを描画するには,OnDrawCell イベントを記述します。

・ CellRect メソッドはセルの画面座標を返し,MouseToCell メソッドは画面座標の位置にある行と列を返します。Selection プロパティは,現在選択されているセルの境界を指定します。
・ TopRow プロパティは,現在グリッドの一番上にある行を指定します。LeftCol プロパティは,一番左に表示されている列を指定します。VisibleColCount プロパティはグリッド内に表示する列の数を示し,VisibleRowCount プロパティはグリッド内に表示する行の数を示します。
・ 列の幅と行の高さを変更するには,ColWidths プロパティと RowHeights プロパティを使います。グリッド線の幅を設定するには GridLineWidth プロパティを使います。スクロールバーをグリッドに追加するには ScrollBars プロパティを使います。
・ 行と列を固定またはスクロール不可にするには,FixedCols プロパティと FixedRows プロパティを使います。固定行と固定列に色を指定するには,FixedColor プロパティを使います。
・ Options プロパティ,DefaultColWidth プロパティ,DefaultRowHeight プロパティもグリッドの外観と動作に影響します。



文字列グリッド

文字列グリッドは TDrawGrid の下位コンポーネントで,文字列表示を簡易化する特殊機能を備えています。Cells プロパティはグリッドの各セルの文字列をリストし,Objects プロパティは各文字列に関連付けられたオブジェクトをリストします。各列の文字列と関連オブジェクトのリストにアクセスするには,Cols プロパティを使います。各行の文字列とその関連オブジェクトのリストにアクセスするには,Rows プロパティを使います。 



値リストエディタ(VCL のみ)

TValueListEditor は,名前/値のペアを「Name=Value」の形で格納する文字列リストを編集するための専用グリッドです。名前と値は TStrings の下位オブジェクトとして保存され,この下位オブジェクトが Strings プロパティの値を表します。名前の値を調べるには,Values プロパティを使います。TValueListEditor は,クロスプラットフォームプログラミングでは使用できません。

グリッドは,名前と値の 2 つの列で構成されます。デフォルトでは,名前の列は「Key」,値列は「Value」という名称になっています。このデフォルト名を変更するには,TitleCaptions プロパティを設定します。これらの列タイトルを省略するには,DisplayOptions プロパティを使います(コントロールのサイズが変更されたときもDisplayOptions プロパティで調整します)。

ユーザーが名前列を編集するのを可能または不可にするには,KeyOptions プロパティを使います。KeyOptions プロパティには複数のオプションがあり,名前の変更,追加,削除,新しい名前の重複について,それぞれ可能/不可を設定します。

値列の入力内容をユーザーがどのように変更できるかを指定するには,ItemProps プロパティを使います。各項目にそれぞれ TItemProp オブジェクトがあり,以下の設定ができます。

・ 編集マスクにより,有効な入力を制限する
・ 値の最大長を指定する
・ 値を読み出し専用にする
・ 値リストエディタにドロップダウン矢印または省略記号ボタンを表示する。矢印の場合,矢印から選択リストが開いて,ユーザーに値を選択させる。省略記号ボタンの場合,ユーザーが値を入力するダイアログを表示するイベントをトリガーする

ドロップダウン矢印を表示する場合は,ユーザーが選択する値のリストを用意しておく必要があります。静的リストにすることも(TItemProp オブジェクトの PickList プロパティ),実行時に OnGetPickList イベントにより動的に追加されるリストにすることもできます。さらに,これらの方法を組み合わせて,OnGetPickList イベントハンドラにより変更される静的リストにすることもできます。 

省略記号ボタンを表示させる場合は,ユーザーが省略記号ボタンをクリックしたときに発生する応答を用意しておく必要があります(適宜,値の設定も行う)。応答を用意するには,OnEditButtonClick イベントハンドラを作成します。 



グラフィックの表示

以下のコンポーネントを使うと,グラフィックを簡単にアプリケーションに挿入できます。

コンポーネント 表示内容
TImage グラフィックファイル
TShape 幾何学図形
TBevel 3 次元の線と枠
TPaintBox 実行時にプログラムが描画するグラフィックス
TAnimate AVI ファイル(VCL のみ)



イメージ

イメージコンポーネントを使うと,ビットマップ,アイコン,メタファイルなどのグラフィックイメージを表示できます。Picture プロパティは,表示するグラフィックスを指定します。表示オプションを設定するには,Center プロパティ,AutoSize プロパティ,Stretch プロパティ,および Transparent プロパティを使います。詳細については,グラフィックプログラミングの概要を参照してください。



図形

図形(Shape)コンポーネントは幾何学図形を表示します。図形コンポーネントは非ウィンドウコントロール(CLX では非ウィジェットベース)なので,ユーザーの入力を受け取ることができません。Shape プロパティは,表示する図形を指定します。図形の色を変えたりパターンを追加したりするには,Brush プロパティを使います。Brush プロパティは TBrush オブジェクトを保持しています。ペイント方法は,TBrush オブジェクトの Color プロパティと Style プロパティで設定します。



ベベル

ベベルコンポーネント(TBevel)を使うと,3 次元効果を持つ線(へこんだように見える線と飛び出たように見える線)を表示できます。一部のコンポーネント(TPanel など)には,ベベル線を作成するプロパティがあります。ベベル線を作成するプロパティがない場合は,TBevel を使ってベベル線,ベベルボックス,ベベル枠を作成します。



ペイントボックス

ペイントボックスコンポーネント(TPaintBox)を使うと,アプリケーションに対してフォーム上に線描させることができます。ペイントボックスの Canvas に直接イメージを描画するには,OnPaint イベントハンドラを記述します。ペイントボックスの外側には描画できません。詳細については,グラフィックプログラミングの概要を参照してください。



アニメーションコントロール(VCL のみ)

アニメーションコンポーネントは,AVI(Audio Video Interleaved)クリップを音声なしで表示するウィンドウです。AVI クリップは,映画のような連続したビットマップフレームです。AVI クリップには音声も入れられますが,このコンポーネントでは音声のない AVI クリップしか扱えません。使用するファイルは,圧縮されていない AVI ファイルか,RLE(Run-Length Encoding)で圧縮された AVI クリップでなければなりません。アニメーションコントロールは,クロスプラットフォームプログラミングでは使用できません。

アニメーションコンポーネントには以下のようなプロパティがあります。

・ ResHandle プロパティは,AVI クリップをリソースとして保持するモジュールの Windows ハンドル。実行時に,アニメーションリソースを含むモジュールのインスタンスハンドルまたはモジュールハンドルを ResHandle プロパティで設定する。ResHandle プロパティを設定したら,ResID プロパティまたは ResName プロパティを設定して,モジュール内のどのリソースをアニメーションコントロールで表示するかを指定する
・ AutoSize プロパティを True に設定すると,アニメーションコントロールのサイズが AVI クリップのフレームのサイズに調整される
・ StartFrame プロパティおよび StopFrame プロパティは,クリップの開始フレームと終了フレームを指定する
・ CommonAVI プロパティを設定すると,Shell32.DLL で提供される Windows のコモン AVI クリップの 1 つを表示できる
・ アニメーションの開始と中断は,Active プロパティを True または False に設定することにより指定する。再生する回数は Repetitions プロパティで指定する
・ Timers プロパティを使うと,タイマーを使ってフレームを表示できる。これは,音声トラックの再生などのほかのアクションをアニメーションシーケンスに同期させるときに有用



ダイアログボックスの作成

コンポーネントパレットの[Dialogs]ページにあるダイアログボックスコンポーネントを使うと,さまざまなダイアログボックスを自分のアプリケーションで使用できます。コモンダイアログボックスは,使いやすく一貫性のあるインターフェースをアプリケーションに提供します。このインターフェースを使ってユーザーは,ファイルを開く,保存する,印刷するなどの共通のファイル操作を実行できます。ダイアログボックスはデータの表示/取得を行います。

Execute メソッドが呼び出されると,各ダイアログボックスが表示されます。Execute は論理値を返します。つまり,ユーザーが[OK]を選択してダイアログボックス内の変更を受け入れた場合には,Execute メソッドは True を返します。ユーザーが[キャンセル]を選択して変更の反映も保存もしないでダイアログボックスを終了した場合には,Execute メソッドは False を返します。 

クロスプラットフォームアプリケーションを開発する場合,CLX の QDialogs ユニットにあるダイアログボックスを使用できます。オペレーティングシステムに一般的タスク(ファイルを開く,保存する,フォントや色を変更するなど)用のネイティブのダイアログボックスがある場合は,UseNativeDialog プロパティを使用できます。このような環境でアプリケーションが動作し,かつ,Qt ダイアログのかわりにネイティブダイアログを使用したい場合には,UseNativeDialog プロパティを True に設定します。 



[開く]ダイアログボックスの使い方

よく使われるダイアログボックスコンポーネントの代表が TOpenDialog です。通常は,フォームのメインメニューバーにある[ファイル]から[新規作成]か[開く]を選択すると,TOpenDialog が呼び出されます。このダイアログボックスにあるコントロールを使って,ユーザーは,ワイルドカード文字を使ってファイルのグループを選択したり,ディレクトリ間を移動したりできます。

TOpenDialog コンポーネントは,[開く]ダイアログボックスをアプリケーションから利用できるようにします。[開く]ダイアログボックスの目的は,オープンするファイルをユーザーに指定させることです。[開く]ダイアログボックスを表示するには,Execute メソッドを使います。

ユーザーが[OK]をクリックすると,選択されたファイルが TOpenDialog の FileName プロパティに格納されます。必要に応じて,この FileName プロパティを操作できます。

たとえば,以下の短いコードをアクションに追加して TMainMenu の下位項目の Action プロパティとリンクさせることができます。あるいは,下位項目の OnClick イベントに追加することもできます。

if OpenDialog1.Execute then
filename := OpenDialog1.FileName;

このコードはダイアログボックスを表示し,ユーザーが[OK]ボタンを押すと,filename という名前で宣言されている AnsiString 変数にファイル名がコピーされます。



ヘルパーオブジェクトの使い方

VCL と CLX には,汎用のプログラミング処理を簡易化する各種の非ビジュアルオブジェクトがあります。以下のトピックでは,以下の操作を支援するヘルパーオブジェクトについて説明します。

・ リストの操作 
・ 文字列リストの操作 
・ Windows レジストリと .INI ファイルの変更 
・ ストリームの使用 



リストの操作

リストの作成,管理機能を提供するオブジェクトは次のとおりです。

オブジェクト 管理対象
TList ポインタのリスト
TObjectList メモリ管理されるインスタンスオブジェクトのリスト
TComponentList メモリ管理されるコンポーネント(TComponent から派生したクラスのインスタンス)のリスト
TQueue ポインタの先入れ先出しリスト
TStack ポインタの後入れ先出しリスト
TObjectQueue オブジェクトの先入れ先出しリスト
TObjectStack オブジェクトの後入れ先出しリスト
TClassList クラス型のリスト
TCollectionTOwnedCollectionTCollectionItem 特別に定義された項目のインデックス付きコレクション
TStringList 文字列のリスト
これらのオブジェクトについての詳細はオンラインリファレンスを参照してください。



文字列リストの操作

アプリケーションは文字列のリストを頻繁に扱います。たとえば,コンボボックスの項目,メモのテキスト行,フォント名,文字列グリッドの行と列の名前などを管理する必要が生じます。VCL と CLX は,TStrings オブジェクトとその下位オブジェクトである TStringList を通して,あらゆる文字列リストに共通のインターフェースを提供します。TStringList は,TStrings により導入された抽象プロパティおよび抽象メソッドを実装し,以下の操作を行うプロパティ,イベント,メソッドを導入します。

・ リスト内の文字列をソートする
・ ソート後のリストに文字列の重複が生じるのを禁止する
・ リスト内容の変更に応答する

文字列リストの管理機能に加え,TStrings と TStringList により簡単に文字列を交換できます。たとえば,メモのテキスト行(TStrings のインスタンス)を編集した後,そのテキスト行をコンボボックスの項目(これも TStrings のインスタンス)として使用することができます。

オブジェクトインスペクタの値列に (TStrings) と表示されているプロパティは,文字列リストです。TStrings をダブルクリックすると文字列リストエディタが開き,このエディタで行の編集,追加,削除が行えます。

文字列リストは実行時にも操作できます。一般に,以下のような処理で文字列リストを扱います。

・ 文字列リストの読み込みと保存 
・ 新しい文字列リストの作成 
・ リスト内の文字列を操作する 
・ オブジェクトと文字列リストを関連付ける 



文字列リストの読み込みと保存

テキストファイルに文字列を保存するには,文字列リストオブジェクトの提供する SaveToFile メソッドを使います。同様に,テキストファイルを文字列に読み込むには LoadFromFile メソッドを使います。テキストファイルの各行がリストの各文字列に対応します。SaveToFile メソッドと LoadFromFile メソッドを使うと,メモコンポーネントにファイルを読み込んで簡単なテキストエディタを作成したり,項目のリストをコンボボックスに保存したりできます。

以下の例は,WIN.INI ファイルを Memo コンポーネントに読み込み,WIN.BAK というバックアップコピーを作成しています。

procedure EditWinIni;
var FileName: string; { ファイル名の格納領域 }
begin FileName := 'C:\WINDOWS\WIN.INI'; { ファイル名を設定する }
with Form1.Memo1.Lines do begin
LoadFromFile(FileName); { ファイルを読み込む }
SaveToFile(ChangeFileExt(FileName, '.BAK')); { バックアップファイルに保存する }
end;
end;



新しい文字列リストの作成

通常,文字列リストはコンポーネントの一部です。ただし,参照テーブルの文字列を保存する場合など,独立した文字列リストを作成すると便利な場合があります。文字列リストの作成と管理の方法は,文字列リストが短期リストか(単一のルーチンで作成,使用,破棄する)長期リストか(アプリケーションが終了するまで有効)によって異なります。どちらの文字列リストを作成するにしても,使わなくなる時点でリストを解放するように設計しなければなりません。

短期文字列リスト

単一ルーチンの存続期間の中でのみ文字列リストを使用する場合は,作成,使用,破棄のすべてを 1 つの場所で行えます。これは,文字列リストを操作するもっとも安全な方法です。メモリは文字列リスト自体と各文字列に割り当てられます。したがって,例外が生じた場合でもメモリが解放されるよう,try...finally ブロックで保護する必要があります。

1 文字列リストオブジェクトを作成します。
2 try..finally ブロックの try 部で,文字列リストを使用します。
3 finally 部で文字列リストオブジェクトを解放します。

次の例に示すイベントハンドラは,ボタンクリックに応答して文字列リストを作成し,使用し,その後文字列リストを破棄しています。

procedure TForm1.Button1Click(Sender: TObject);
var TempList: TStrings; { リストを宣言する }
begin
TempList := TStringList.Create; { リストオブジェクトを作成する }
try { 文字列リストを使用する }
finally TempList.Free; { リストオブジェクトを破棄する }
end;
end;

長期文字列リスト

アプリケーションの実行中に文字列リストをいつでも利用できるようにするには,アプリケーションの起動時に文字列リストを作成し,アプリケーションの終了前に破棄します。

1 アプリケーションのメインフォーム用のユニットファイルで,フォームの宣言部に TStrings 型の項目を追加します。
2 メインフォームのコンストラクタ用のイベントハンドラを作成します。このイベントハンドラはフォームが表示される前に実行されます。これにより文字列リストが作成され,手順 1 で宣言したフィールドに文字列リストが代入されます。
3 フォームの OnClose イベント用に,文字列リストを解放するイベントハンドラを作成します。

以下に示す例では,長期文字列リストを使ってユーザーのメインフォーム上のマウスクリックを記録し,アプリケーション終了前にリストをファイルに保存しています。

unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;
{ CLX の場合: uses SysUtils, Classes, QGraphics, QControls, QForms, Qialogs;}
type TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

private
{ Private 宣言 }
public
{ Public 宣言 }
ClickList: TStrings; { 項目を宣言する }
end;
var Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);begin ClickList := TStringList.Create; { リストを作成する }end;
procedure TForm1.FormDestroy(Sender: TObject);begin ClickList.SaveToFile(ChangeFileExt(Application.ExeName, '.LOG')); { リストを保存する }

ClickList.Free; { リストオブジェクトを破棄する }end;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin ClickList.Add(Format('Click at (%d, %d)', [X, Y])); { 
リストに文字列を追加する }end;
end.



リスト内の文字列を操作する

文字列リストに対しては,以下のような操作が行われます。

・ リスト内の文字列を数える 
・ 特定の文字列にアクセスする 
・ リスト内の文字列の位置を検索する 
・ リスト内の文字列を繰り返し処理する 
・ リストに文字列を追加する 
・ リスト内で文字列を移動する 
・ リストから文字列を削除する 
・ 文字列リスト全体をコピーする 



リスト内の文字列を数える

Count プロパティは,リスト内の文字列の数を返す読み出し専用のプロパティです。文字列リストはゼロから始まるインデックスを使用するため,Count プロパティは最終文字列のインデックスより 1 つ多い値になります。



特定の文字列にアクセスする

Strings という配列プロパティは,リスト内の文字列を保持します。この文字列は 0 ベースのインデックスで参照されます。Strings は文字列リストのデフォルトのプロパティなので,リストにアクセスするときには Strings 識別子を省略しても問題はありません。以下に例を示します。

StringList1.Strings[0] := 'This is the first string.';

このコード行は次のコード行と同等です。

StringList1[0] := 'This is the first string.';



文字列リスト内の項目を検索する

文字列リスト内で文字列を探すには,IndexOf メソッドを使います。IndexOf メソッドは文字列をパラメータとして受け取り,リスト内で一致する最初の文字列のインデックスを返します。パラメータ文字列が見つからなければ -1 を返します。IndexOf メソッドは完全一致のみ探します。部分文字列の一致を検索するには,自分で文字列リストを繰り返し処理する必要があります。

以下の例のように,Index メソッドを使用して,リストボックスの項目に特定のファイル名があるかどうか調べることもできます。

if FileListBox1.Items.IndexOf('WIN.INI') > -1 ...



リスト内の文字列を繰り返し処理する

リスト内の文字列を繰り返し処理するには,for ループを使ってゼロから Count -1 まで実行します。 

次の例は,リスト内の各文字列を大文字に変換しています。

procedure TForm1.Button1Click(Sender: TObject);var Index: Integer;
begin 
for Index := 0 to ListBox1.Items.Count - 1 do ListBox1.Items[Index] := UpperCase(ListBox1.Items[Index]);
end;



リストに文字列を追加する

文字列リストの末尾に文字列を追加するには,Add メソッドを呼び出して新しい文字列をパラメータとして渡します。リストに文字列を挿入するには,Insert メソッドを呼び出し,2 つのパラメータ(文字列と,挿入先位置のインデックス)をパラメータとして渡します。たとえば文字列「Three」をリストの 3 番目の文字列にしたい場合には,次のコードを使用できます。

Insert(2, 'Three');

リストの末尾に別のリストの文字列を追加するには,AddStrings メソッドを呼び出します。

StringList1.AddStrings(StringList2); { StringList2 から StringList1 の末尾に文字列を追加 }



リスト内で文字列を移動する

文字列リスト内で文字列を移動するには,Move メソッドを呼び出して,2 つのパラメータ(文字列の移動前のインデックスと,移動後のインデックス)を渡します。たとえば,リストの 3 番目の文字列を 5 番目に移動する場合には,次のコードを使用できます。

Move(2, 4)



リストから文字列を削除する

文字列リストから文字列を削除するには,文字列リストの Delete メソッドを呼び出し,削除する文字列のインデックスを渡します。削除したい文字列のインデックスがわからない場合には,IndexOf メソッドを使って調べます。文字列リスト内のすべての文字列を削除するには,Clear メソッドを使用します。

次の例では,IndexOf メソッドと Delete メソッドを使って文字列を検索,削除しています。

with ListBox1.Items dobegin
BIndex:=IndexOf('bureaucracy'); if BIndex > -1 then Delete(BIndex);
end;



文字列リスト全体をコピーする

ある文字列リストから別の文字列リストへ文字列をコピーするには,Assign メソッドを使います。この場合,コピー先リストにあった文字列は上書きされます。上書きせずにコピー先リストの末尾に追加するには,AddStrings メソッドを使います。次に例を示します。

Memo1.Lines.Assign(ComboBox1.Items); { 元の文字列を上書きする }

この例では,コンボボックスからメモへとテキスト行をコピー(メモに上書き)しています。

Memo1.Lines.AddStrings(ComboBox1.Items); { 文字列を末尾に追加する }

この例では,コンボボックスのテキスト行をメモの末尾に追加しています。

文字列リストのローカルコピーを作成するには,Assign メソッドを使います。次のようにローカル変数を代入すると,元の文字列リストオブジェクトが失われることになります。

StringList1 := StringList2;

この例のようにすると,予期しない結果が発生することがあります。



オブジェクトと文字列リストを関連付ける

文字列リストは,Strings プロパティに格納されている文字列だけでなく,Objects プロパティに格納されるオブジェクトへの参照も管理することができます。Objects プロパティは,Strings プロパティと同様に,ゼロから始まるインデックスを持つ配列です。一般に,オーナー描画コントロール用文字列とビットマップを関連付ける場合に Objects プロパティを使います。

AddObject メソッドか InsertObject メソッドを使うと,文字列および関連付けられたオブジェクトを一度に文字列リストに追加できます。IndexOfObject メソッドは,文字列リスト内で指定したオブジェクトと関連付けられた最初の文字列のインデックスを返します。Delete,Clear,Move などのメソッドは,文字列とオブジェクトの両方を対象に動作します。たとえば,文字列を削除すると,その文字列に対応するオブジェクト(もしあれば)も削除されます。

オブジェクトを既存の文字列と関連付けるには,同じインデックス位置の Objects プロパティにオブジェクトを代入します。対応する文字列を追加しないとオブジェクトは追加できません。



Windows レジストリと .INI ファイル(VCL のみ)

Windows システムレジストリは階層状のデータベースで,アプリケーションはここに環境設定情報を保存します。VCL の TRegistry クラスは,レジストリの読み出しと書き込みを行うメソッドを提供します。 

Windows 95 が登場する前は,ほとんどのアプリケーションは拡張子 .INI を持つ初期化ファイルに環境設定情報を格納していました。VCL には,INI ファイルを使ったプログラムの保守と移行を支援する以下のクラスがあります。

・ TRegistry は,レジストリを操作するオブジェクトです(VCL のみ)。
・ TIniFile(VCL のみ)または TMemIniFile は,INI ファイルを操作するオブジェクトです。
・ TRegistryIniFile は,レジストリと INI ファイルの両方を操作するときに使います(VCL のみ)。TRegistryIniFile のプロパティとメソッドは TIniFile に似ていますが,システムレジストリの読み書きを行う点が異なります。TCustomIniFile 型(TIniFile,TMemIniFile,TRegistryIniFile に共通する上位オブジェクト)の変数を使うと,呼び出し元の場所に応じてレジストリ,INI ファイルのどちらかにアクセスする汎用コードを作成できます。

クロスプラットフォームプログラミングで使用できるのは,TMemIniFile だけです。



TIniFile の使い方(VCL のみ)

INI ファイルフォーマットは今も広く使われており,Delphi の多くの環境設定ファイル(DSK デスクトップ設定ファイルなど)も INI ファイルフォーマットです。INI ファイルフォーマットが依然として普及していることから,VCL では,INI ファイルの読み書きを大幅に簡易化するクラスを提供しています。TIniFile は,クロスプラットフォームプログラミングでは使用できません。

TIniFile オブジェクトをインスタンス化するときに,パラメータとして INI ファイルの名前をコンストラクタに渡します。その名前のファイルが存在しなければ,自動的に作成されます。その後は,ReadString,ReadInteger,または ReadBool を使って値を読み出せます。別の方法として ReadSection メソッドを使えば,INI ファイルのセクション全体を読み出すことができます。同様に,WriteBool,WriteInteger,または WriteString を使って値を書き込みます。 

どの Read ルーチンも 3 つのパラメータを取ります。1 番目のパラメータは,INI ファイルのセクションを識別します。2 番目のパラメータは,読み出す値を識別します。3 番目のパラメータは,指定したセクションまたは値が INI ファイルに存在しない場合のデフォルト値です。同様に Write ルーチンでも,セクションまたは値が存在しなければ,セクション/値が作成されます。



TRegistry の使い方(VCL のみ)

たいていの 32 ビットアプリケーションは,各自の情報を(INI ファイルでなく)レジストリに保存しています。その理由は,レジストリは階層構造を成し,INI ファイルより堅固で,しかも,INI ファイルと違ってサイズに制限がないからです。TRegistry オブジェクトに属するメソッドは,キーのオープン,クローズ,保存,移動,コピー,削除などを行います。

TRegistry は,クロスプラットフォームプログラミングでは使用できません。



TRegIniFile の使い方(VCL のみ)

プログラマが INI ファイルを熟知していて,INI ファイルの環境設定情報をレジストリに移したい場合には,TRegIniFile クラスを使うと便利です。TRegIniFile は,レジストリエントリを INI ファイルエントリのように見せるオブジェクトです。TIniFile のメソッド(読み書き)はすべて,TRegIniFile にもあります。 

TRegIniFile オブジェクトを作成した場合,渡したパラメータ(IniFile オブジェクトのファイル名)は,レジストリのユーザーキー下のキー値になります。このルートを起点にしてセクションと値が分岐していきます。実際,TRegIniFile オブジェクトはレジストリインターフェースを大幅に簡略化します。既存のコードをポーティングする必要がない場合でも,TRegistry のかわりに TRegIniFile を使用できます。

TRegIniFile は,クロスプラットフォームプログラミングでは使用できません。



描画スペースの作成

TCanvas は,VCL では Windows デバイスコンテキストをカプセル化し,CLX ではペイントデバイス(Qt ペインタ)をカプセル化したもので,フォーム,ビジュアルコンテナ(パネルなど),およびプリンタオブジェクト(印刷を参照)向けのあらゆる描画を処理します。キャンバスオブジェクトを利用すれば,ペン,ブラシ,パレットなどの割り当てを気にせずに簡単に描画ができます。割り当てと割り当て解除は自動的に行われます。

TCanvas には非常に多くの基本グラフィックルーチンがあるので,キャンバスを持つコントロールなら,どのコントロールにも線,図形,多角形,フォントなどを描画できます。下に示すボタンイベントハンドラは,フォームの左上隅から中央に線を引き,フォーム上に文字列を表示しています。

procedure TForm1.Button1Click(Sender: TObject);
begin
Canvas.Pen.Color := clBlue;
Canvas.MoveTo( 10, 10 );
Canvas.LineTo( 100, 100 );
Canvas.Brush.Color := clBtnFace;
Canvas.Font.Name := 'Arial';
Canvas.TextOut( Canvas.PenPos.x, Canvas.PenPos.y,'This is the end of the line' );
end;

Windows アプリケーションでは,TCanvas オブジェクトを使うと一般的な Windows グラフィックの間違いを防ぐこともできます。たとえば,デバイスコンテキスト,ペン,ブラシなどの値を,描画操作前の値に復元できます。Delphi では,描画が必要な場所や描画できる場所で TCanvas を使用して,グラフィックの描画を安全かつ簡単にしています。 



TPrinter

VCL の TPrinter は,Windows プリンタの詳細をカプセル化するオブジェクトです。インストール済みの使用可能なプリンタの一覧を取得するには,Printers プロパティを使います。CLX の TPrinter オブジェクトは,プリンタにペイントするペイントデバイスです。TPrinter は,ポストスクリプトを生成して lpr,lp,または別の印刷コマンドへ送信します。 

どちらのプリンタオブジェクトも TCanvas を使います(フォームの TCanvas と同じ)。このため,フォーム上に描画できるものであればプリンタにも印刷できます。イメージを印刷するには,BeginDoc メソッドを呼び出した後,印刷したいキャンバスグラフィック(TextOut メソッドによるテキスト表示を含む)を描画し,EndDoc メソッドを呼び出して印刷ジョブをプリンタに送ります。 

フォーム上のボタンとメモを使った例を以下に示します。ユーザーがボタンをクリックすると,ページの周囲に 200 ピクセルの境界が確保され,メモの中身が印刷されます。 

この例を実行するには,uses 節に Printers を追加してください。

procedure TForm1.Button1Click(Sender: TObject);
var
r: TRect;
i: Integer;
begin
with Printer do
begin
r := Rect(200,200,(Pagewidth - 200),(PageHeight - 200));
BeginDoc;
for i := 0 to Memo1.Lines.Count do
Canvas.TextOut(200,200 + (i * Canvas.TextHeight(Memo1.Lines.Strings[i])),
Memo1.Lines.Strings[i]);
Canvas.Brush.Color := clBlack;

Canvas.FrameRect(r);
EndDoc;
end;
end;



ストリームの使用

ストリームとは,データを読み書きする方法のことです。ストリームは,さまざまなメディア(メモリ,文字列,ソケット,BLOB ストリームなど)に対して読み書きの共通インターフェースを提供します。 

下の例では,ストリームを使ってファイルを別のファイルにコピーしています。アプリケーションには,2 つの編集コントロール(FromFile,ToFile)と[Copy File]ボタンが含まれています。

procedure TForm1.CopyFileClick(Sender: TObject);
var
stream1, stream2:TStream;
begin
stream1 := TFileStream.Create(FromFile.Text, fmOpenRead or fmShareDenyWrite);
try
stream2 := TFileStream.Create(ToFile.Text, fmCreate or fmShareExclusive);
try
stream2.CopyFrom(Stream1,Stream1.Size);
finally
stream2.Free;
finally
stream1.Free
end;

記憶媒体に対して読み書きを行うには,専用のストリームオブジェクトを使います。TStream の各下位オブジェクトは,特定の媒体(ディスクファイル,動的メモリなど)にアクセスするメソッドを実装しています。TStream の下位オブジェクトには,TFileStream,TStringStream,TMemoryStream などがあります。これらのオブジェクトは読み書き用のメソッドを提供するほか,アプリケーションがストリーム内の任意の位置を検索できるようにします。TStream のプロパティは,ストリームに関する情報(サイズ,現在位置など)を提供します。



データベースアプリケーションの作成

Delphi の利点の 1 つは,拡張データベースアプリケーションの作成をサポートしていることです。Delphi がサポートしているツールを使うと,SQL サーバーおよび各種データベース(Oracle,Sybase,InterBase,MySQL,MS-SQL,Informix,DB2など)と接続できます。同時に,アプリケーション間で意識せずにデータの共有ができます。 

Delphi には,データベースにアクセスするコンポーネントや,データベース内の情報を表示するコンポーネントが多数用意されています。コンポーネントパレットは,データアクセスのメカニズムと機能によってデータベースコンポーネントを次のようにグループ分けしています。

ページ名 内容
BDE  BDE(ボーランドデータベースエンジン)を使用するコンポーネント。BDE はデータベースと相互作用する大規模 API であり,もっとも広範な機能をサポートする。BDE には非常に有用なユーティリティ(Database Desktop,Database Explorer,SQL Monitor,BDE Administratorなど)が付属している。詳細については,ボーランドデータベースエンジンの使い方を参照
ADO  Microsoft ADO(ActiveX データオブジェクト)を使ってデータベース情報にアクセスするコンポーネント。多くの ADO ドライバがあり,各種データベースサーバーに接続できる。ADO ベースのコンポーネントを使うと,自分のアプリケーションを ADO ベース環境に統合できる。詳細については,ADO コンポーネントの操作を参照
dbExpress  dbExpress を使ってデータベース情報にアクセスするクロスプラットフォームコンポーネント。dbExpress 用ドライバによりデータベースに高速にアクセスできるが,更新を実行するには TClientDataSet と TDataSetProvider を使う必要がある。詳細については,単方向データセットの使い方を参照
InterBase  別個のエンジン層を通らずに直接 InterBase データベースにアクセスするコンポーネント。InterBase コンポーネントの使い方は,InterBase Express の概要を参照
Data Access  TClientDataSet,TDataSetProvider などのデータアクセスメカニズムを使用できるコンポーネント。クライアントデータセットの詳細は,クライアントデータセットの使い方を参照。プロバイダの詳細は,プロバイダコンポーネントの使い方を参照
Data Controls  データソースから情報にアクセスできるデータベース対応コントロール。詳細は,データコントロールの使い方を参照 


データベースアプリケーションを設計するには,どのデータアクセスメカニズムを使うかを決定する必要があります。データアクセスメカニズムによって,機能サポートの範囲,配布しやすさ,ドライバ(各種データベースサーバーをサポートするドライバ)の可用性が異なります。 
データベースクライアントアプリケーションとアプリケーションサーバーの設計時に利用できるデータベースサポートの種類と検討事項については,データベースアプリケーションの設計を参照してください。



 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Make your own free website on Tripod.com