チュートリアル:LiveBinding 対応のコンポーネントを作成する
データベースおよび LiveBinding のチュートリアル への移動
このチュートリアルでは、LiveBinding と共に使用できるコンポーネントを作成する方法を示します。ここでは、LiveBinding と共に使用できるカスタム TTrackBar コンポーネントを有効にします。
なお、TTrackBar コンポーネントをフォームにドロップするときは常に、以下の図のように、登録されているプロパティがない状態でコンポーネントが[LiveBinding デザイナ]に表示されます。
これは、TTrackBar が LiveBinding と共に使用できるようになっていないためです。コンポーネントを LiveBinding と共に使用できるようにするには、以下の 2 つの要件を満たす必要があります。
- LiveBinding ではオブザーバを利用してコントロールの通知をサブスクライブするため、コントロールはオブザーバ サポートを実装する必要があります。
- コントロール値の名前(たとえば TTrackBar の
Position
など)を登録する必要があります。このコントロール値名は、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.pas と VCL.Sample.ObservableTrackbarReg.pas が含まれているパッケージをいったんインストールすると、TObservableTrackbar をコンポーネント パレットから選択できるようになります。TObservableTrackbar は[LiveBinding デザイナ]で以下の図のように表されます。
これで、[LiveBinding デザイナ]を使って、ObservableTracker1.Position
をフィールド(または別のオブジェクト プロパティ)に接続できます。
まとめ
このプロトタイプに従うことにより、以下を行うだけで、RAD Studio で独自の LiveBinding 対応コンポーネントを設計できます。
- オブザーバ サポートの実装
- コントロール値名の登録