Live Bindings - konzolově

vložil Radek Červinka 20. září 2011 22:52

Rád bych ukázal nejdříve princip toho jak LiveBinding (novinka v Delphi XE2) funguje, než budu ukazovat jak je to v IDE prováděno. Zdrojem mi bylo demo, jehož autorem je Pawel Glowacki a možná ho ukázal i v Praze a Bratislavě.

Uvedu nejprve kód, následně k tomu něco napíši.

    1program LiveBindingProgr;
    2
    3{$APPTYPE CONSOLE}
    4
    5uses
    6  System.SysUtils,
    7  System.Bindings.Expression,
    8  System.Bindings.ObjEval,
    9  System.Bindings.Helper;
   10
   11type
   12  TMyObject1 = class(TObject)
   13  private
   14    FIntegerValue: Integer;
   15    FStringValue: String;
   16  public
   17    property IntegerValue: Integer read FIntegerValue write FIntegerValue;
   18    property StringValue: String read FStringValue write FStringValue;
   19  end;
   20
   21  TMyObject2 = class(TMyObject1);
   22  TMyResultObject = class(TMyObject1);
   23
   24var
   25  MyObject1: TMyObject1;
   26  MyObject2: TMyObject2;
   27  MyResultObject: TMyResultObject;
   28
   29  BindingExpression1: TBindingExpression;
   30  BindingExpression2: TBindingExpression;
   31
   32begin
   33  ReportMemoryLeaksOnShutdown := True;
   34  MyObject1 := TMyObject1.Create;
   35  MyObject2 := TMyObject2.Create;
   36  MyResultObject := TMyResultObject.Create;
   37
   38  MyObject1.IntegerValue := 1;
   39  MyObject1.StringValue := 'LiveBinding ';
   40
   41  MyObject2.IntegerValue := 2;
   42  MyObject2.StringValue := 'power.';
   43
   44  { a binding expression that binds the two Integer properties of the given objects }
   45  BindingExpression1 := TBindings.CreateManagedBinding(
   46    { inputs }
   47    [TBindings.CreateAssociationScope([
   48      Associate(MyObject1, 'o1'),
   49      Associate(MyObject2, 'o2')
   50      ])],
   51    '(o1.IntegerValue + 10) * o2.IntegerValue',
   52    { outputs }
   53    [TBindings.CreateAssociationScope([
   54      Associate(MyResultObject, 'res')
   55      ])],
   56    'res.IntegerValue',
   57    nil);
   58
   59  { a binding expression that binds the two String properties of the given objects }
   60  BindingExpression2 := TBindings.CreateManagedBinding(
   61    { inputs }
   62    [TBindings.CreateAssociationScope([
   63      Associate(MyObject1, 'o1'),
   64      Associate(MyObject2, 'o2')
   65      ])],
   66    '(o1.StringValue) + "is "+ o2.StringValue',
   67    { outputs }
   68    [TBindings.CreateAssociationScope([
   69      Associate(MyResultObject, 'res')
   70      ])],
   71    'res.StringValue',
   72    nil);
   73
   74  TBindings.Notify(MyObject1, 'IntegerValue');
   75  TBindings.Notify(MyObject2, 'StringValue');
   76
   77  Writeln('Result of add operation: ', MyResultObject.IntegerValue);
   78  Writeln(MyResultObject.StringValue);
   79  Readln;
   80
   81  MyObject1.Free;
   82  MyObject2.Free;
   83  MyResultObject.Free;
   84end.

Řádky 12 - 27 je deklarace tří tříd a jejich objektů se kterými budeme šachovat. Každá třída má property "IntegerValue" a "StringValue". Následně se tyto property nastaví na nějaké hodnoty.

Nyní se vytvoří dvě instance "vazeb", jedna pro integer hodnotu, druhá pro string hodnotu. V podstatě se definuje výraz, který určuje vazbu mezi zdrojovými "MyObject1" a "MyObject2" a cílovým MyResultObject.

V případě integer hodnot je to na řádku 51, ohledně string hodnot je to na řádku 66.

No a na nyní je jen třeba provést "šťouchnutí" do některého zdrojového objektu (tj. "MyObject1" nebo "MyObject2") - jakože došlo ke změně, neboli provést výpočet a aktualizaci cíle. Toto je ve VCL prováděno např. při OnChange TEdit nebo změně pozice v datasetu automaticky. Zde nic takového nemáme - tj. je třeba provést manuální aktualizaci. Zbytek je už jen omáčka kolem.

Výsledkem běhu je:

Result of add operation: 22
LiveBinding is power.

Celé vyhodnocování, resp. Live Bindings je postaveno na RTTI (Run Time Type Information).

Samozřejmě toto je jen jednoduchý případ a zdaleka nepostihuje možnosti Live Bindings, ale nějakou představu snad poskytne.

Jinak se můžete podívat na FishFacts Live Bindings pro FireMonkey video, které tu šlo už dříve.


Nabízíme Delphi školení a konzultace na různá témata, primárně ve Vaší firmě.

Tagy: ,

Novinky v Delphi

Komentování ukončeno

Naše nabídka

Partial English version.

MVP
Ing. Radek Červinka - Embarcadero MVP
profil na linkedin, Twitter:@delphicz

Nabízím placené poradenství a konzultace v oblasti programování a vývoje SW.
Dále nabízíme i vývoj speciálního software na zakázku.

Neváhejte nás kontaktovat (i ohledně reklamy nebo burzy práce).

Pokud chcete podpořit tento server libovolnou částkou, můžete použít PayPal. Moc děkuji.

Delphi Certified Developer

O Delphi.cz

Delphi je jediný moderní RAD nástroj podporující tvorbu nativních aplikací pro platformu Win32, Win64 , Mac OSX a na iPhone a Android (s výhledem na další platformy díky FireMonkey) na současném trhu (včetně Windows 8.1).

V současnosti je světová komunita přes dva miliónů vývojářů.

Delphi.cz je nezávislý portál pro uživatele Delphi. Portál není koncipován pro úplné začátečníky, i když i ti se zde nebudou nudit, ale spíše na programátory, kteří již něco znají a chtějí své znalosti dále rozvíjet a sledovat novinky.

Anketa

Poslední komentáře

Comment RSS