Delphi. Обратная связь через LiveBindings
Используется следующее решение для редактирования полей объекта с помощью LiveBindings
И не очень пойму, как, если в методе write объекта, свойство обновляется с условием, заставить механизм LiveBindings "перечитать" значение в контрол.
Т.е. в Edit ввели 200, в FA записалось 200, на форме видим 200. Если ввели 0, то в FA будет 100 (из-за условия в SetA), а в Edit отображается 0.
P.S. Поскольку здесь Nodify висит на OnEditChange - то пример не совсем корректен с точки зрения ввода и обработки данных.
unit Unit4;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Data.Bind.EngExt, Vcl.Bind.DBEngExt, System.Rtti, System.Bindings.Outputs,
Vcl.Bind.Editors, Data.Bind.Components, Vcl.StdCtrls;
type
TSimple = class
private
FA: Integer;
procedure SetA(const Value: Integer);
published
constructor Create (Value : Integer);
property A: Integer read FA write SetA;
end;
TForm4 = class(TForm)
bndngslst1: TBindingsList;
edt1: TEdit;
procedure FormCreate(Sender: TObject);
procedure edt1Change(Sender: TObject);
private
{ Private declarations }
bndscp1: TBindScope;
public
{ Public declarations }
procedure CreateExpression (AControlComponent: TComponent;
AControlProperty, ASourceProperty: string; ABindScope: TBindScope;
ABindingsList: TBindingsList);
procedure InitializeBinding; virtual;
end;
var
Form4: TForm4;
implementation
{$R *.dfm}
{ TForm4 }
procedure TForm4.CreateExpression(AControlComponent: TComponent;
AControlProperty, ASourceProperty: string; ABindScope: TBindScope;
ABindingsList: TBindingsList);
var Expression: TBindExpression;
begin
{создаем выражение}
Expression := TBindExpression.Create(self);
{назначаем компонент для отображения информации}
Expression.ControlComponent := AControlComponent;
{Указываем в какое свойство выводить данные}
Expression.ControlExpression := AControlProperty;
{указываем точку доступа - тут должен содержаться наш класс}
Expression.SourceComponent := ABindScope;
{Тут указываем свойство КЛАССА, которое будет выводится в AControlProperty}
Expression.SourceExpression := ASourceProperty;
{Обеспечиваем двухстороннюю связь - будем и читать и писать свойство}
Expression.Direction := TExpressionDirection.dirBidirectional;
{Назначаем список}
expression.BindingsList := ABindingsList;
end;
procedure TForm4.edt1Change(Sender: TObject);
begin
bndngslst1.Notify(Sender,'');
end;
procedure TForm4.FormCreate(Sender: TObject);
begin
bndscp1 := TBindScope.Create(Self);
InitializeBinding;
end;
procedure TForm4.InitializeBinding;
begin
CreateExpression(edt1,'Text','A',bndscp1,bndngslst1);
bndscp1.DataObject:= TSimple.Create(200);
end;
{ TSimple }
constructor TSimple.Create(Value: Integer);
begin
inherited Create;
FA := 200;
end;
procedure TSimple.SetA(const Value: Integer);
begin
FA := Value;
if Value < 100 then
FA := 100;
end;