2011年9月24日土曜日

LiveBindingを試してみる。

DelphiXE2のLiveBindingの機能を使って、現在時刻を更新する処理を
チュートリアルを参考作ってみた。

処理としては、時刻が更新されると、登録した通知先(作った例場合はフォーム)の
表示を更新する処理になっています。

以下ソース

まずは、時計のソース、タイマーを使って定周期で時刻を更新し、登録先の
更新通知を行っています。
また、変更通知先を登録する処理を書いています。


  1. unit Unit4;  
  2.   
  3. interface  
  4.   
  5. uses  
  6.  System.SysUtils, System.Classes,Vcl.ExtCtrls, Data.Bind.EngExt,  
  7.  Vcl.Bind.DBEngExt, System.Rtti, System.Bindings.Outputs, Vcl.Bind.Editors,  
  8.  Data.Bind.Components,  
  9.  System.Bindings.EvalProtocol,  
  10.  System.Bindings.Expression,  
  11.  System.Bindings.ObjEval,  
  12.  System.Bindings.Helper;  
  13.   
  14. type  
  15.  TDataModule4 = class(TDataModule)  
  16.    FTimer: TTimer;  
  17.    procedure FTimerTimer(Sender: TObject);  
  18.    procedure DataModuleCreate(Sender: TObject);  
  19.    procedure DataModuleDestroy(Sender: TObject);  
  20.  private  
  21.    { Private 宣言 }  
  22.    FNowString : String;  
  23.    BindingExpression1: TBindingExpression;  
  24.  public  
  25.    procedure AddBindingList(const InputScopes: array of IScope; const BindExprStr: stringconst OutputScopes: array of IScope; const OutputExpr: string);  
  26.    published  
  27.    { Public 宣言 }  
  28.    property NowString : String read FNowString;  
  29.  end;  
  30.   
  31. var  
  32.  DataModule4: TDataModule4;  
  33.   
  34. implementation  
  35.   
  36. {%CLASSGROUP 'Vcl.Controls.TControl'}  
  37.   
  38. uses Unit1;  
  39.   
  40. {$R *.dfm}  
  41.   
  42. procedure TDataModule4.AddBindingList(const InputScopes: array of IScope;  
  43.  const BindExprStr: stringconst OutputScopes: array of IScope;  
  44.  const OutputExpr: string);  
  45. begin  
  46.   
  47.  BindingExpression1 :=  TBindings.CreateManagedBinding(  
  48.        InputScopes,  
  49.        BindExprStr,  
  50.        OutputScopes,  
  51.        OutputExpr,  
  52.        nil);  
  53.   
  54. end;  
  55.   
  56. procedure TDataModule4.DataModuleCreate(Sender: TObject);  
  57. begin  
  58.  //BindScope1.Active := true;  
  59. end;  
  60.   
  61. procedure TDataModule4.DataModuleDestroy(Sender: TObject);  
  62. begin  
  63.  //BindScope1.Active := false;  
  64. end;  
  65.   
  66. procedure TDataModule4.FTimerTimer(Sender: TObject);  
  67. begin  
  68.  FNowString := DateTimeToStr(Now);  
  69.  TBindings.Notify(Self, 'NowString');  
  70.   
  71. end;  
  72.   
  73. end.  


次に、時計を表示するソース。比較のためにポーリング処理で上記のソースのプロパティを使って
タイムスタンプを更新する処理もあります。


  1. unit Unit1;  
  2.   
  3. interface  
  4.   
  5. uses  
  6.  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,  
  7.  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls,  
  8.  Data.Bind.EngExt, Vcl.Bind.DBEngExt, System.Rtti, System.Bindings.Outputs,  
  9.  Unit4,  
  10.  System.Bindings.Expression,  
  11.  System.Bindings.ObjEval,  
  12.  System.Bindings.Helper,  
  13.  Vcl.Bind.Editors, Data.Bind.Components;  
  14.   
  15.   
  16. type  
  17.  TForm1 = class(TForm)  
  18.    Label1: TLabel;  
  19.    Label3: TLabel;  
  20.    Timer1: TTimer;  
  21.    Label2: TLabel;  
  22.    Label4: TLabel;  
  23.    procedure Timer1Timer(Sender: TObject);  
  24.    procedure FormCreate(Sender: TObject);  
  25.    procedure FormClose(Sender: TObject; var Action: TCloseAction);  
  26.  private  
  27.    { Private 宣言 }  
  28.    FSakaClock : TDataModule4;  
  29.  public  
  30.    { Public 宣言 }  
  31.  end;  
  32.   
  33. var  
  34.  Form1: TForm1;  
  35.   
  36. implementation  
  37.   
  38. {$R *.dfm}  
  39.   
  40.   
  41. procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);  
  42. begin  
  43.  //FSakaClock.Free;  
  44.  FSakaClock.Free;  
  45. end;  
  46.   
  47. procedure TForm1.FormCreate(Sender: TObject);  
  48. begin  
  49.  FSakaClock := TDataModule4.Create(Self);  
  50.  FSakaClock.AddBindingList(  
  51.       { inputs }  
  52.      [TBindings.CreateAssociationScope([  
  53.        Associate(FSakaClock, 'I1')  
  54.      ])],  
  55.      'I1.NowString',  
  56.      { outputs }  
  57.      [TBindings.CreateAssociationScope([  
  58.        Associate(Label3, 'O1')  
  59.      ])],  
  60.      'O1.Caption');  
  61.   
  62.  //FSakaClock := TSakaClock.Create(Self);  
  63. end;  
  64.   
  65. procedure TForm1.Timer1Timer(Sender: TObject);  
  66. begin  
  67.  Label1.Caption := FSakaClock.NowString;  
  68. end;  
  69.   
  70. end.