gpt4 book ai didi

Delphi Synedit 双向绑定(bind)

转载 作者:行者123 更新时间:2023-12-02 11:03:14 25 4
gpt4 key购买 nike

我需要将 Synedit 双向绑定(bind)到数据库中的“文本”列。它适用于备忘录组件,但对于 Synedit 或 Richedit 仅创建单向绑定(bind)。值是从数据库同步的,但我不知道如何从 Synedit 更新回数据库。

我尝试在 Livebound 设计器中简单连接字段,如图所示,但我陷入了文档中。

scheme binding

当我离开编辑器时,我需要自动同步数据库字段,就像它与 Memo 组件一起使用一样。

最佳答案

TSynMemo 的行为与 TMemo 不同的原因是它“开箱即用”,不支持 LiveBindings 观察者LB 工作所必需的。克服这个问题的方法是派生一个 TSynMemo确实支持 LB 观察者并使用它的后代。

幸运的是,有一个Embarcadero wiki entry它解释了如何将 LB 观察器添加到缺少它们的组件中。在此基础上,经过一些准备工作,示例代码应该执行您想要的操作:

  • 在新表单上,放置 TClientDataSet、TDataSource、TDBGrid 和 TDNavigator,并以通常的方式将它们链接起来。使用 TClientDataSet 是为了允许一个完全独立的示例项目。 注意如果您想使用FireDAC。您同样可以使用 TFDMemTable 代替 TClientDataSet;下面的步骤和代码是相同的,并且我已经测试过这个 FD 替代方案是否有效。

  • 在 TClientDataSet 上设置 ID、Name(String(20))和 Memo 字段,如代码所示

  • 添加通过 TDataSource 连接到备注字段的 TBSynEdit。这样做的目的是为了表明我们接下来要添加的实时绑定(bind) TSynMemo 以相同的方式执行

  • 将 TSynMemo、TMemo、TBindingList、TBindSourceDB 和 TBindNavigator 添加到表单

  • 使用快速绑定(bind)弹出窗口添加 TLinkControlToFields 以链接 TSynEdit 和 TMemo到 ClientDataSet 的 Memo 字段

  • 在可视化 LB 设计器中将 BindSourceDB 的 * 属性连接到 TBindNavigator 的 * 属性。

现在,将以下代码添加到表单中。无需注册我们的 TSynMemo后代作为组件并将其安装在IDE中,代码声明它在表单单元中作为 Interposer 类。它实现了所有观察者方法这似乎是实时绑定(bind) 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.

关于Delphi Synedit 双向绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57535630/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com