[最終更新日 1999/03/14]

作ろう!コンポーネント


プロパティの追加(その1)

プロパティは変数と同じように見えますが、実は書きこみ時や読みだし時に処理(手続き、関数等)を経由することで、範囲外の値を受け付けないようにしたり、読みだし時に文字変数を数値に変換するためのものです。

ここでは、そのプロパティを追加してみましょう。


  1. 設計時プロパティ、実行時プロパティ

    設計時プロパティとはフォーム設計時にオブジェクトインスペクタで操作可能なプロパティ。実行時プロパティはプログラム実行中しか操作できないプロパティです。実行時プロパティはオブジェクトインスペクタで操作不可能なので、プログラムでプロパティ操作のコードを記述する必要性があります。(詳しくはマニュアル参照)

    ではこのプロパティをコンポーネントで記述するにはどのようにすれば良いのでしょうか。答えは簡単です。published(C++Builderでは、__published)に記述すれば設計時プロパティ、publicに記述すれば実行時プロパティになります。

    プロパティを追加する場合、どちらに配置するか考えてコードを記述してください。


  2. readとwrite

    プロパティ読みだしが行われる変数、あるいは処理をreadで指定できます。またプロパティ書きこみが行われる変数、あるいは処理をwriteで指定できます。


  3. defaultとコンストラクタ

    設計時プロパティの場合、コンポーネントをフォームに配置したときにオブジェクトインスペクタに表示する初期値を default で指定することができます。ただし、これはプロパティに表示する値だけを初期化するだけで、メンバ変数の初期化までは行いません。メンバ変数を初期化する場合はコンストラクタにコードを記述する必要性があります。


  4. 設計時プロパティとして UIntValue の実装

    では実際にTextプロパティに入力している文字を数値で取りだせる。また、数値を代入するとTextプロパティに変換した文字列をセットする UIntValue プロパティを追加してみましょう。

    このプロパティは書きこみ、読みだし時に変換処理が入るので read、write の両方とも処理を呼び出す必要性があります。

    メモ
    SetUIntValue手続き(関数)内で範囲外の場合、例外を発生させています。これはコンポーネント使用者が範囲外の値を代入したとき、値を代入されないバグと勘違いされるのを防ぐためです。例外を使えばデバックの効率がアップするのでうまく利用してください。

    プロパティで使用する関数は、read 時は "Get"+"プロパティ名"、write 時は "Set"+"プロパティ名" と書くのが標準的です。

  5. テストコードを書く

    ではコンポーネントに追加したプロパティをテストするために、テストコードを書いてみましょう。まずフォームにボタンを3つ配置してください。そのボタンをダブルクリックして以下のコードを追加します。

    メモ
    Button3Click でマイナス値を代入しているのは例外を試すためです。

  6. 実際に動かしてみる

    メニューの[実行(R)|実行(R)]で実行してみてください。入力ミスが無ければフォームが表示されます。
    それでは以下の操作を行ってみてください。



まとめ

さてここまでやってみてどうでしょうか?
プロパティを追加したことでもう標準のTEditと違う独自のコンポーネントとなりました。

しかし、数値以外の文字が入力できるのは問題ですね。
さて次は既にある処理のオーバーライドにチャレンジです。
レッツ、トライ!コンポーネント


戻る