Valueプロパティの定義 – Delphiカスタムコンポーネントの作成 4

投稿者: | 2018年1月27日

NumberEditコンポーネントの中心となる、Valueプロパティから作成します。

プロパティの定義

まずはValueプロパティの定義を書きます。TCustomNumberEditクラスのpublicに、以下のように記述します。

  TCustomNumberEdit = class(TCustomEdit)
  private
{ Private 宣言 }
  protected
{ Protected 宣言 }
  public
{ Public 宣言 }
    property Value: Extended read FValue write SetValue;
  published
{ Published 宣言 }
  end;

Valueプロパティのスコープをpublicで定義するのは、次の2つの理由です。
1つめは、アプリケーションからもアクセスできるようにするためです。
2つめは、TCustomNumberEditクラスから新しいクラス(コンポーネント)を作成したときのためです。
たとえば、TCustomNumberEditの継承元TCustomEditクラスでは、Textプロパティがpublicになっています。そのおかげで、TNumberEditではTextプロパティを隠して、代わりにValueプロパティをオブジェクトインスペクターに表示できます。これと同じことを、さらに下位のコンポーネントでもできるよう、publicで定義します。

FValueフィールドの宣言

TCustomNumberEditクラスはValueプロパティに実数値を設定できます。この設定した実数値を記憶しておくために、FValueフィールドを宣言します。
FValueフィールドにアプリケーションが直接アクセスできないよう、スコープをprivateにします。

  private
{ Private 宣言 }
    FValue: Extended;

Valueプロパティから値を読み取るとき、プロパティの値はFValueフィールドから取得されます。それを指定しているのが次の部分です。

read FValue

Valueプロパティから読み取る(read)とき、FValueフィールドの値がそのまま出力されると言うことを表しています。値をそのまま出力するには、プロパティのデータ型(Extended)と、フィールドのデータ型を同じにしておきます。

フィールドの名前は、慣習として先頭に F を付けます。
特にプロパティの値を記憶するフィールドは、プロパティ名の先頭に F を付けて、FValue などとします。

SetValueメソッドの定義

プロパティに値を設定したとき、クラス内での処理方法をwrite部に書きます。
Valueプロパティのwrite部は、以下のようになっています。

write SetValue

これは、Valueプロパティに値を設定すると、SetValueというメソッドが実行されることを表しています。SetValueのようにプロパティの入出力で実行されるメソッドを、アクセサーと呼ぶこともあります。ですが、ここではメソッドという呼び方に統一します。

プロパティの入出力で実行されるメソッド(プロパティアクセスメソッド)は、特に理由がなければ、privateで定義します。SetValueメソッドもprivateで定義します。

  private
{ Private 宣言 }
    FValue: Extended;
    procedure SetValue(const Value: Extended);

ここで重要なことがあります。「メソッドはフィールドより後ろに記述する」という規則です。これは言語の規則です。FValueより前の行にprocedureを書いてしまうと、コンパイルエラーになります。

さて、SetValueメソッドは値を書き込むメソッドです。戻り値(出力する値)は必要ありません。そのため、手続き(procedure)として定義します。
書き込む値は引数にセットされます。引数の名前は通常 Value です。これはValueプロパティの名前と関係ありません。慣例として引数名にValueが使われています。Valueプロパティと混同しそうなときは、引き数名を変えてもかまいません。引数にはconstを付けて、定数パラメーターとします。また、引数のデータ型は、プロパティの型と一致させます。

SetValueメソッドの実装

SetValueメソッドの実装(実際に実行されるコード)を書いていきます。ユニットのimprementation部に、以下のコードを追加します(Register手続きの後ろがいいでしょう)。

procedure TCustomNumberEdit.SetValue(const Value: Extended);
begin
  FValue := Value;
end;

Value引数で受け取った値を、FValueフィールドに記録します。これで、Valueプロパティに値を設定したり、読み取ったりできるようになりました。
でも、これでValueプロパティが完成したわけではありません。
Valueプロパティに値を設定するだけなら、プロパティのwrite部を以下のように書くことができます。

write FValue

わざわざSetValueメソッドにしたのには理由があります。それは「表示」です。
FValueフィールドに値を記憶しただけでは、画面に数値が表示されません。プロパティに値を設定したら、画面の編集ボックス内にその数値が表示されるべきです。
では、編集ボックス内に数値を表示するには、どうすればよいでしょうか。とても簡単にできる方法があります。それはTextプロパティに文字列を設定すれば良いのです。
SetValueメソッドを次のように変更します。

procedure TCustomNumberEdit.SetValue(const Value: Extended);
begin
  FValue := Value;
  Text := FloatToStr(FValue);
end;

このTextというのはどこから来たのでしょうか。それは、継承元のTCustomEditクラスからです。クラスを継承すると、そのクラスの持つプロパティやメソッドを引き継ぎます。Textは、TCustomEditクラスから引き継いだTextプロパティです。Textプロパティに文字列を設定すると、その文字列が編集ボックスに表示される機能が備わっています。ですから、FValueの値を文字列に変換し、Textプロパティに設定してやれば、数値が編集ボックスに表示されるのです。

コメントを残す

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

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