チュートリアル:LiveBinding 対応のコンポーネントを作成する

提供: RAD Studio
移動先: 案内検索

データベースおよび LiveBinding のチュートリアル への移動


このチュートリアルでは、LiveBinding と共に使用できるコンポーネントを作成する方法を示します。ここでは、LiveBinding と共に使用できるカスタム TTrackBar コンポーネントを有効にします。

なお、TTrackBar コンポーネントをフォームにドロップするときは常に、以下の図のように、登録されているプロパティがない状態でコンポーネントが[LiveBinding デザイナ]に表示されます。

LBTTrackBar1.png

これは、TTrackBar が LiveBinding と共に使用できるようになっていないためです。コンポーネントを LiveBinding と共に使用できるようにするには、以下の 2 つの要件を満たす必要があります。

  • LiveBinding ではオブザーバを利用してコントロールの通知をサブスクライブするため、コントロールはオブザーバ サポートを実装する必要があります。
  • コントロール値の名前(たとえば TTrackBarPosition など)を登録する必要があります。このコントロール値名は、LiveBinding コンポーネントで、コントロールの値を取得および設定する式を生成するのに使用されます。

この動作のために TTrackBar コンポーネントを直接変更することはできないため、このチュートリアルで示す手順に従って作成する下位クラスにオブザーバ サポートを実装する必要があります。

観察可能な TTrackBar コンポーネントの新規作成

観察可能なトラックバーを実装するクラスの名前を TObservableTrackbar とし、ユニットそのものは VCL.Sample.ObservableTrackbar とします。

TObservableTrackbar コンポーネントの interface セクションは以下のとおりです。

unit VCL.Sample.ObservableTrackbar;

interface

uses
  Vcl.ComCtrls, System.Classes, WinApi.Messages, WinApi.CommCtrl, Vcl.Controls;

type
  [ObservableMember('Position')]                            { identifies the control value name for TObservableTrackbar }
  TObservableTrackBar = class(TTrackBar)
  private
    procedure CNHScroll(var Message: TWMHScroll); message CN_HSCROLL;
    procedure CNVScroll(var Message: TWMVScroll); message CN_VSCROLL;
    procedure ObserverToggle(const AObserver: IObserver; const Value: Boolean);
  protected
    function CanObserve(const ID: Integer): Boolean; override;                       { declaration is in System.Classes }
    procedure ObserverAdded(const ID: Integer; const Observer: IObserver); override; { declaration is in System.Classes }
  end;

implementation セクションは以下のとおりです。

implementation

uses
  System.SysUtils;

{ TObservableTrackBar }

function TObservableTrackBar.CanObserve(const ID: Integer): Boolean;
{ Controls which implement observers always override TComponent.CanObserve(const ID: Integer). }
{ This method identifies the type of observers supported by TObservableTrackbar. }
begin
  case ID of
    TObserverMapping.EditLinkID,      { EditLinkID is the observer that is used for control-to-field links }
    TObserverMapping.ControlValueID:
      Result := True;
  else
    Result := False;
  end;
end;

{ The overrides for CNHscroll and CNVScroll are where TObservableTrackBar calls the
  observable interfaces to notify LiveBindings components when the user moves the thumb.
  These two overrides are sufficient to monitor user input to TObservableTrackbar.
  TLinkObservers.ControlChanged is a utility method that does most of the work. You can
  find the implementation in System.Classes. }
procedure TObservableTrackBar.CNHScroll(var Message: TWMHScroll);
var
  LPosition: Integer;
begin
  LPosition := Position;

  inherited;

  if LPosition <> Position then
    TLinkObservers.ControlChanged(Self);
end;

procedure TObservableTrackBar.CNVScroll(var Message: TWMVScroll);
var
  LPosition: Integer;

begin
  Message.Result := 0;
  LPosition := Position;

  inherited;

  if LPosition <> Position then
    TLinkObservers.ControlChanged(Self);
end;

{ The following methods prevent the user from moving the thumb when TObservableTrackBar
  is linked to a read-only field. }
procedure TObservableTrackBar.ObserverAdded(const ID: Integer; const Observer: IObserver);
begin
  if ID = TObserverMapping.EditLinkID then
    Observer.OnObserverToggle := ObserverToggle;
end;

{ All controls that support the EditLink observer should prevent the user from changing the
  control value. Disabling the control is one way to do it. Some observer implementations ignore
  certain types of input to prevent the user from changing the control value. }
procedure TObservableTrackBar.ObserverToggle(const AObserver: IObserver; const Value: Boolean);
var
  LEditLinkObserver: IEditLinkObserver;

begin
  if Value then
  begin
    if Supports(AObserver, IEditLinkObserver, LEditLinkObserver) then
      { disable the trackbar if the associated field does not support editing }
      Enabled := not LEditLinkObserver.IsReadOnly;
  end else
    Enabled := True;
end;

end.

観察可能な新規 TTrackBar コンポーネントの登録

TObservableTrackBar を[LiveBinding デザイナ]で完全に有効にするには、登録する必要があります。RegisterObservableMember() メソッドを使って、コントロール値名プロパティを登録する必要があります。以下のコードは、コンポーネントの登録を行うユニットに含めることができます。

unit VCL.Sample.ObservableTrackbarReg;

interface

procedure Register;

implementation

uses
  System.Classes, VCL.Sample.ObservableTrackbar, Data.Bind.Components;

procedure Register;
begin
  RegisterComponents('LiveBindings Samples', [TObservableTrackBar]);
end;

initialization
  Data.Bind.Components.RegisterObservableMember(TArray<TClass>.Create(TObservableTrackBar), 'Position', 'DFM');

finalization
  Data.Bind.Components.UnregisterObservableMember(TArray<TClass>.Create(TObservableTrackBar));

end.

Position は、以下の 2 箇所でコントロール値名として識別されます。

  • VCL.Sample.ObservableTrackbar.pas における ObservableMember 属性
  • VCL.Sample.ObservableTrackbarReg.pas における RegisterObservableMember() の呼び出し

ObservableMember 属性は、LiveBinding コンポーネントで式の生成に使用されます。RegisterObserverableMember() は、設計時に[LiveBinding デザイナ]への通知に使用されます。

観察可能な新規 TTrackBar コンポーネントの使用

VCL.Sample.ObservableTrackbar.pasVCL.Sample.ObservableTrackbarReg.pas が含まれているパッケージをいったんインストールすると、TObservableTrackbar をコンポーネント パレットから選択できるようになります。TObservableTrackbar は[LiveBinding デザイナ]で以下の図のように表されます。

LBTTrackBar2.png

これで、[LiveBinding デザイナ]を使って、ObservableTracker1.Position をフィールド(または別のオブジェクト プロパティ)に接続できます。

LBTTrackBar3.png

まとめ

このプロトタイプに従うことにより、以下を行うだけで、RAD Studio で独自の LiveBinding 対応コンポーネントを設計できます。

  • オブザーバ サポートの実装
  • コントロール値名の登録

関連項目