-
Notifications
You must be signed in to change notification settings - Fork 2
/
RTBind.pas
110 lines (88 loc) · 3.21 KB
/
RTBind.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
unit RTBind;
interface
uses
System.Generics.Collections, System.Bindings.Expression, System.Bindings.EvalProtocol, System.Bindings.Helper,
Data.Bind.Components, System.Classes, Controls;
type
TRTBindEmpressionList = TObjectList<TBindingExpression>;
IRTBindManager = Interface
['{6DEE20D5-DFA6-4DDB-955B-EEA81A20A735}']
procedure Clear;
procedure Notify(ASource: TObject; const APropName: string = '');
procedure NotifyControls;
procedure Link(ASource: TObject; const ASourcePropName: string;
const ALinkTo: TObject; const ALinkToProp: string;
const ACreateOptions: TBindings.TCreateOptions = [coNotifyOutput, coEvaluate]); overload;
procedure Link(ASource: TObject; ASourcePropName: string; ALinkTo: TControl); overload;
End;
TRTBindManager = class(TInterfacedObject, IRTBindManager)
private
FSourceBindings: TRTBindEmpressionList;
FControlsBindings: TRTBindEmpressionList;
public
constructor Create; virtual;
destructor Destroy; override;
procedure Clear;
procedure Notify(ASource: TObject; const APropName: string = '');
procedure NotifyControls;
procedure Link(ASource: TObject; const ASourcePropName: string;
const ALinkTo: TObject; const ALinkToProp: string;
const ACreateOptions: TBindings.TCreateOptions = [coNotifyOutput, coEvaluate]); overload;
procedure Link(ASource: TObject; ASourcePropName: string; ALinkTo: TControl); overload;
end;
implementation
uses
System.SysUtils, RTBind.Mapping;
constructor TRTBindManager.Create;
begin
FSourceBindings := TRTBindEmpressionList.Create(false);
FControlsBindings := TRTBindEmpressionList.Create(false);
end;
destructor TRTBindManager.Destroy;
begin
Clear;
FControlsBindings.Free;
FSourceBindings.Free;
inherited;
end;
procedure TRTBindManager.Clear;
var
Exp: TBindingExpression;
begin
for Exp in FSourceBindings do
TBindings.RemoveBinding(Exp);
FSourceBindings.Clear;
for Exp in FControlsBindings do
TBindings.RemoveBinding(Exp);
FControlsBindings.Clear;
end;
procedure TRTBindManager.Notify(ASource: TObject; const APropName: string);
begin
TBindings.Notify(ASource, APropName);
end;
procedure TRTBindManager.NotifyControls;
var
I: Integer;
begin
for I := 0 to Pred(FControlsBindings.Count) do
FControlsBindings.Items[I].EvaluateOutputs;
end;
function Expression(Obj: TObject; const StrID: string): IScope;
begin
Result := TBindings.CreateAssociationScope([Associate(Obj, StrID)]);
end;
procedure TRTBindManager.Link(ASource: TObject; const ASourcePropName: string; const ALinkTo: TObject;
const ALinkToProp: string; const ACreateOptions: TBindings.TCreateOptions);
begin
FSourceBindings.Add(TBindings.CreateManagedBinding([
Expression(ASource, 'src')], 'src.' + ASourcePropName, [
Expression(ALinkTo, 'lnk')], 'lnk.' + ALinkToProp, nil, nil, ACreateOptions));
FControlsBindings.Add(TBindings.CreateManagedBinding([
Expression(ALinkTo, 'src')], 'src.' + ALinkToProp, [
Expression(ASource, 'lnk')], 'lnk.' + ASourcePropName, nil, nil, ACreateOptions));
end;
procedure TRTBindManager.Link(ASource: TObject; ASourcePropName: string; ALinkTo: TControl);
begin
Link(ASource, ASourcePropName, ALinkTo, TRTBindMapping.Prop(ALinkTo));
end;
end.