NumberEditコンポーネントの新規作成 – カスタムコンポーネントの作成 2

投稿者: | 2018年1月14日

Delphiのカスタムコンポーネントを、早速作成していきます。
コンポーネントを作成して動作させるには、コンポーネントのクラスをコーディングしたユニットと、これをコンポーネントとして登録するためのパッケージが必要になります。ユニットやパッケージを手作業で作成することも可能です。しかし、必要最低限の準備を行う機能がDelphiにあるため、今回はこちらを使用します。

コンポーネントの新規作成

プラットフォームの選択

DelphiのIDEのメニューから、[コンポーネント]→[コンポーネントの新規作成]を実行します。「コンポーネントの新規作成」ダイアログが表示されます。
コンポーネントの新規作成
Delphiで他の作業をしていた場合、「コンポーネントの新規作成」ダイアログの表示が、この画像と異なることがあります。そのときは、後述の「継承元コンポーネントの選択」から読み進めてください。

最初の画面では、コンポーネントのフレームワーク、プラットフォームを選択します。ラジオボタンで[VCL for Delphi Win32]にチェックを入れ、[次へ]を押します。

なお、この時点でDelphi 64ビット向けのコンポーネントは選択(作成)できません。Delphi IDEは32ビットで動作しているため、64ビット向けコンポーネントを作成する場合でも、初めに32ビットのコンポーネントを作成しておく必要があります。

継承元コンポーネントの選択

継承元となるコンポーネントをリストから選択します。
今回は数値専用の編集ボックスコントロールを作成するので、TCustomEditを継承元に選びます。リストからTCustomEditを探して選択してください。検索を使用すればすぐに見つかります。TCustomEditを選択したら、[次へ]を押します。

継承元にTCustomEditを使用し、TEditを使用しない理由は、プロパティなどの可視性です。たとえば、TEditにはTextプロパティがあります。Textプロパティの可視性はpublishedで、オブジェクトインスペクターから設計時に文字列を設定できます。もしTEditから継承すると、数値専用のコントロールなのに文字列を扱うTextプロパティが表示されてしまいます。
TCustomEditではTextプロパティがpublicで定義されているため、オブジェクトインスペクターに表示されず、都合がよいのです。

名前とユニットの入力

新規作成するコンポーネントの名前と、ユニットファイル名を入力します。
「クラス名」はコンポーネントのクラス名です。ここではTNumberEditと入力します。
「パレットページ名」はコンポーネントが表示される、パレットの名前です。特に決めていなければデフォルトの「Samples」でもよいですし、ドロップダウンから既存のパレットを選択してもよいです。または、自分で適当な名前を決めて入力することもできます。
「ユニット名」はコンポーネントのユニットファイルの名前を、パス付きで入力します。カスタムコンポーネントを入れておく専用のフォルダーを用意すれば、管理が楽かもしれません。ファイル名は「NumberEdit.pas」とします。
「検索パス」は空白にしておいてよいでしょう。
各項目を入力したら、[次へ]を押します。

ユニットの作成

ユニットファイルだけを作成するか、パッケージも一緒に作成するかを選択します。
よく分からない場合、[新規パッケージへインストール]を選択しましょう。特定のパッケージに入れたいときは、[既存のパッケージへインストール]を選択します。

[ユニットの作成]を選択すると、ユニットファイルだけ作成されます。これだと、後でパッケージを作成したり、既存パッケージに追加したりする作業が必要になります。また、パッケージに入れていない状態でユニットだけコーディングすると、Delphi IDEの支援機能が働かないことがあり、コーディング作業がはかどらなくなることがあります。

新規パッケージ

[新規パッケージへインストール]を選択したときに表示される画面です。新規作成するパッケージのファイル名と、パッケージの説明を入力します。
ファイル名はパス付きで入力します。NumberEdit.pasユニットと同じフォルダーを選択するとよいでしょう。ファイル名は「NumberEdit.dpk」とします。
説明は任意です。今回は、「数値入力コントロール」と入れておきます。
それぞれ入力したら、[完了]を押します。

名前を付けて保存

「NumberEditに名前を付けて保存」ダイアログが表示されます。フォルダーとファイル名に間違いがないか確かめて、[保存]を押します。

確認

「ユニット”NumberEdit.pas”で”ビジュアルコンポーネントライブラリ”フレームワークを使用していますが・・・」というような、長いメッセージ付きのダイアログが表示されます。TEditのようなコントロールを使用する際は、パッケージに特定の設定やデータを取り込む必要があるということを書いています。この設定やデータを取り込んでもよいかという確認なので、[はい]を押します。

コンパイル、登録完了

パッケージのコンパイルが行われます。正常に行われれば、コンポーネントパレットにTNumberEditコンポーネントが登録されます。
試しに、VCLフォームアプリケーションを新規作成して、TNumberEditコンポーネントをフォームに配置してみてもよいでしょう。使用できるプロパティが少ない、TEditコントロールが表示されると思います。TNumberEditはTCustomEditから継承しているため、TCustomEditが持つ機能がそのままTNumberEditに引き継がれています。TCustomEditはTEditの継承元でもあるため、TNumberEditとTEditが似ているのは当たり前といえます。使用できるプロパティ(オブジェクトインスペクターに表示されるプロパティ)が少ないのは、TCustomEditでプロパティの可視性をpublicやprotectedにしているものが多いからです。プロパティの可視性については、今後、説明する予定です。

もし、コンパイルでエラーが表示された場合、TNumberEditクラスのコンポーネントを、すでに使用している可能性が考えられます。その場合、作成するコンポーネントの名前を変更しましょう。

TNumberEditクラスをTCustomNumberEditに変更する

新規作成されたNumberEdit.pasユニットファイルは、以下のようになっているはずです。

unit NumberEdit;

interface

uses
  System.SysUtils, System.Classes, Vcl.Controls, Vcl.StdCtrls;

type
  TNumberEdit = class(TCustomEdit)
  private
 { Private 宣言 }
  protected
 { Protected 宣言 }
  public
{ Public 宣言 }
  published
{ Published 宣言 }
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('MIZU', [TNumberEdit]);
end;

end.

typeの次の行、TNumberEdit = class(TCustomEdit)が、TCustomEditクラスから継承して、新たにTNumberEditクラスを定義しているところです。ここにプロパティ等を追加していくのですが、その前にやっておきたいことがあります。クラス定義の部分を、以下のように変更しましょう。

type
  { 以下の行を変更 }

  TCustomNumberEdit = class(TCustomEdit)
  private

TCustomNumberEdit = class(TCustomEdit)のように、NumberEditの前に Custom を付けます。つまり、TCustomEditクラスから継承して、TCustomNumberEditクラスを作成します。
なぜこのようにするかというと、TCustomEditのように、プロパティなどの可視性をあらかじめ低く設定しておくためです。そうしておくと、TCustomNumberEditクラスから継承して、いろいろなコンポーネントを作りやすくなります(実際に作るかどうかは問いません)。
メインのTNumberEditクラスは、以下のようにコードを追加します。

    { Published 宣言 }

  end;

  { 以下の行を追加 TCustomNumberEditを継承してTNumberEditを定義 }

  TNumberEdit = class(TCustomNumberEdit);

procedure Register;

おすすめの本
(値段は高いですが、それだけの価値があります)
OBJECT PASCAL HANDBOOK―マルチデバイス開発ツールDelphiのためのプログラミング言語完全ガイド
(コンポーネントの作り方を日本語で説明した、唯一の本ではないでしょうか。少し古いですが、もし手に入るなら買っておいて損はないでしょう)
Delphiコンポーネント設計&開発完全解説

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)