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
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
45 BindingExpression1 := TBindings.CreateManagedBinding(
46
47 [TBindings.CreateAssociationScope([
48 Associate(MyObject1, 'o1'),
49 Associate(MyObject2, 'o2')
50 ])],
51 '(o1.IntegerValue + 10) * o2.IntegerValue',
52
53 [TBindings.CreateAssociationScope([
54 Associate(MyResultObject, 'res')
55 ])],
56 'res.IntegerValue',
57 nil);
58
59
60 BindingExpression2 := TBindings.CreateManagedBinding(
61
62 [TBindings.CreateAssociationScope([
63 Associate(MyObject1, 'o1'),
64 Associate(MyObject2, 'o2')
65 ])],
66 '(o1.StringValue) + "is "+ o2.StringValue',
67
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.