我需要双向绑定Synedit到列'text‘在数据库中。它适用于备注组件,但对于Synedit或即Richedit只创建单向绑定。值是从数据库同步的,但我不知道如何从Synedit更新回数据库。
我试着使用Livebinding简单的连接字段,比如在图片上,但我仍然停留在文档中。


当我离开编辑器时,我需要自动同步数据库字段,就像它与备忘录组件一起工作一样。
发布于 2019-08-17 17:17:38
TSynMemo行为不像TMemo的原因是它不支持使LB工作所必需的LiveBindings observers。克服这一问题的方法是派生一个TSynMemo后代,它确实支持LB观察者并使用它。
幸运的是,有一个Embarcadero wiki条目解释了如何将LB观察者添加到缺少它们的组件中。在此基础上,在做了一些准备工作之后,示例代码应该做您想做的事情:
*属性。现在,将下面的代码添加到表单中。为了将我们的TSynMemo后代注册为一个组件并将其安装到IDE中,代码将它在表单单元中声明为一个Interposer class。它实现了所有的obsever方法,这些方法似乎是生命绑定TSynMemo所必需的。
代码
type
TSynMemo = class(SynMemo.TSynMemo)
private
procedure ObserverToggle(const AObserver: IObserver; const Value: Boolean);
protected
procedure DoChange; override;
function CanObserve(const ID: Integer): Boolean; override; { declaration is in System.Classes }
procedure ObserverAdded(const ID: Integer; const Observer: IObserver); override; { declaration is in System.Classes }
end;
TForm2 = class(TForm)
ClientDataSet1: TClientDataSet;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
DBNavigator1: TDBNavigator;
SynMemo1: TSynMemo;
ClientDataSet1ID: TIntegerField;
ClientDataSet1Name: TStringField;
ClientDataSet1Memo: TMemoField;
BindingsList1: TBindingsList;
BindNavigator1: TBindNavigator;
Memo1: TMemo;
BindSourceDB1: TBindSourceDB;
LinkControlToField1: TLinkControlToField;
LinkControlToField2: TLinkControlToField;
DBSynEdit1: TDBSynEdit;
procedure FormCreate(Sender: TObject);
public
end;
[...]implementation[...]
function TSynMemo.CanObserve(const ID: Integer): Boolean;
{ Controls which implement observers always override TComponent.CanObserve(const ID: Integer). }
{ This method identifies the type of observers supported by TObservableTrackbar. }
begin
case ID of
TObserverMapping.EditLinkID, { EditLinkID is the observer that is used for control-to-field links }
TObserverMapping.ControlValueID:
Result := True;
else
Result := False;
end;
end;
procedure TSynMemo.DoChange;
begin
inherited;
TLinkObservers.ControlChanged(Self);
end;
procedure TSynMemo.ObserverAdded(const ID: Integer; const Observer: IObserver);
begin
if ID = TObserverMapping.EditLinkID then
Observer.OnObserverToggle := ObserverToggle;
end;
procedure TSynMemo.ObserverToggle(const AObserver: IObserver; const Value: Boolean);
var
LEditLinkObserver: IEditLinkObserver;
begin
EXIT; // do nothing
end;
const
sDfm = 'DFM';
procedure TForm2.FormCreate(Sender: TObject);
begin
ClientDataSet1.IndexFieldNames := 'ID';
ClientDataSet1.CreateDataSet;
ClientDataSet1.InsertRecord([1, 'Row1', 'Memo1']);
ClientDataSet1.InsertRecord([2, 'Row2', 'Memo two']);
end;
initialization
Data.Bind.Components.RegisterObservableMember(TArray<TClass>.Create(
TSynMemo
),
'Lines.Text', sDfm);
finalization
Data.Bind.Components.UnregisterObservableMember(TArray<TClass>.Create(TSynMemo));
end.https://stackoverflow.com/questions/57535630
复制相似问题