VCL for PHP チャートコンポーネント - パート7 - サブプロパティ

By: Tomohiro Takahashi

Abstract: この記事では、VCL for PHP チャートコンポーネントの作成について解説します。なお、この記事はDelphi for PHPの開発者であるJose Leon氏のブログを再構成したものです。

VCL for PHP チャートコンポーネント - サブプロパティ

今回のコンポーネントでは、ある共通のカテゴリの下でグループ化されたプロパティを公開する必要が出てくることがあります。最初の例としてFontプロパティが挙げられます。これによりユーザーは、名前やサイズ、太字などのフォントのプロパティを全て単一のプロパティで指定することが可能になります。

もちろん、これらのプロパティ全てをグループ化しない方法でコンポーネントに追加することもできます:

  • FontAlign
  • FontCase
  • FontColor
  • FontFamily
  • FontLineHeight
  • FontSize
  • FontStyle
  • FontVariant
  • FontWeight

しかし、オブジェクトインスペクタが乱雑になってしまいます。フォントプロパティが数個あるコンポーネントを想像してみてください...

このようなプロパティをグループ化し、より良いコンポーネントインターフェースを作成できるようにするために、VCL for PHPはサブプロパティを作成する手段を提供しています。読み進めましょう。

Axis()

今回のチャートコンポーネントでは、水平および垂直のチャート軸をプロパティで指定する手段をユーザーに提供する必要があります。それぞれの軸用のクラスを作成することで実現しようと思います。

サブプロパティを作成するには、サブプロパティはオブジェクトでなければならず、そのオブジェクトはPersistentを継承したクラスでなければなりません。これは、ストリーミングシステムが .xml.phpファイル に対して、オブジェクトのプロパティを読み書きできるようにするためです。

XAxisクラスの場合、以下のプロパティを追加します:

  • Stroke
  • Color
  • TickHeight
  • GridColor
  • Offset
  • Steps
  • 3D
  • Labels
  • Vertical

コードを書いてみましょう:

class XAxis extends Persistent
{
    protected $_stroke = 1;

    function getStroke() { return $this->_stroke; }
    function setStroke($value) { $this->_stroke = $value; }
    function defaultStroke() { return 1; }

    protected $_color = "";

    function getColor() { return $this->_color; }
    function setColor($value) { $this->_color = $value; }
    function defaultColor() { return ""; }

    protected $_tickheight = 1;

    function getTickHeight() { return $this->_tickheight; }
    function setTickHeight($value) { $this->_tickheight = $value; }
    function defaultTickHeight() { return 1; }

    protected $_gridcolor = "";

    function getGridColor() { return $this->_gridcolor; }
    function setGridColor($value) { $this->_gridcolor = $value; }
    function defaultGridColor() { return ""; }

    protected $_offset = 0;

    function getOffset() { return $this->_offset; }
    function setOffset($value) { $this->_offset = $value; }
    function defaultOffset() { return 0; }

    protected $_steps = 1;

    function getSteps() { return $this->_steps; }
    function setSteps($value) { $this->_steps = $value; }
    function defaultSteps() { return 1; }

    protected $_3d = 0;

    function get3D() { return $this->_3d; }
    function set3D($value) { $this->_3d = $value; }
    function default3D() { return 0; }

    protected $_labels = array();

    function getLabels() { return $this->_labels; }
    function setLabels($value) { $this->_labels = $value; }
    function defaultLabels() { return array(); }

    protected $_vertical = 0;

    function getVertical() { return $this->_vertical; }
    function setVertical($value) { $this->_vertical = $value; }
    function defaultVertical() { return 0; }
}

オーナーを指定する

ストリーミングシステムが動作するには、そのオブジェクトのオーナーを知っている必要もあります。今回の場合、XAxisオブジェクトのオーナーはそれを所有するチャートになりますが、Persistentにはオーナーを指定できるコンストラクタがありません。そこで、単純にpublicなフィールドを追加し、PersistentのreadOwner()メソッドをオーバーライドするトリックを使います:

class XAxis extends Persistent
{
    public $_control = null;

    function readOwner()
    {
        return($this->_control);
    }
}

そして忘れてはいけないのは、オブジェクトを作成する際にこのフィールドに正しいオーナーを設定することです。

XAxisプロパティの作成

これでOpenChartクラスにXAxisプロパティを追加できます。他のプロパティと同様の方法で行います:

    protected $_xaxis = null;

    function getXAxis() { return $this->_xaxis; }
    function setXAxis($value) { if(is_object($value)) $this->_xaxis = $value; }

ただし、設定する値がオブジェクトの場合にだけこのプロパティにセットしてください。そして、OpenChartコンポーネントのコンストラクタの中でXAxisオブジェクトプロパティを作成します:

class OpenChart extends Control
{
    function __construct($aowner = null)
    {
        parent::__construct($aowner);

        //Creates the axis properties
        $this->_xaxis = new XAxis();
        $this->_xaxis->_control = $this;
    }
}

ここまで来たら、[コンポーネント]|[パッケージ]で表示されるダイアログのチェックボックスをON/OFFして、パッケージをアンインストールし、再度インストールします。結果は以下のようになります:

Hide image

この作業をYAxisについても繰り返す必要があります。それぞれのaxis(軸)には複数の異なるプロパティがあるので、基本となるクラスを使用せずに異なるクラスを使用することに決めましたが、別の選択肢もあるかもしれません。

サブプロパティ用のプロパティエディタを登録する

サブプロパティにどのプロパティエディタを結び付けるのか指定することもできます。同様の方法で行えますが、ドット(.)を使用してサブプロパティを修飾する必要があります:

registerPropertyEditor("OpenChart","XAxis.Color","TSamplePropertyEditor","native");
registerPropertyEditor("OpenChart","XAxis.GridColor","TSamplePropertyEditor","native");
registerPropertyEditor("OpenChart","XAxis.Labels","TStringListPropertyEditor","native");
registerBooleanProperty('OpenChart','XAxis.Offset');
registerBooleanProperty('OpenChart','XAxis.Vertical');

気に入ってくれると思います!

Server Response from: ETNASC02