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í 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