首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Synedit的Delphi双向绑定

Synedit的Delphi双向绑定
EN

Stack Overflow用户
提问于 2019-08-17 10:58:19
回答 1查看 381关注 0票数 1

我需要双向绑定Synedit到列'text‘在数据库中。它适用于备注组件,但对于Synedit或即Richedit只创建单向绑定。值是从数据库同步的,但我不知道如何从Synedit更新回数据库。

我试着使用Livebinding简单的连接字段,比如在图片上,但我仍然停留在文档中。

当我离开编辑器时,我需要自动同步数据库字段,就像它与备忘录组件一起工作一样。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-17 17:17:38

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

幸运的是,有一个Embarcadero wiki条目解释了如何将LB观察者添加到缺少它们的组件中。在此基础上,在做了一些准备工作之后,示例代码应该做您想做的事情:

  • 在新表单上,删除TClientDataSet、TDataSource、TDBGrid和TDNavigator,并按照通常的方式将它们连接起来。使用TClientDataSet是为了允许一个完全独立的样例项目。如果您想使用Note,请使用FireDAC。您可以同样很好地使用TFDMemTable而不是TClientDataSet;下面的步骤和代码将是相同的,我已经测试过这个FD替代方案是否有效。
  • 在TClientDataSet上设置ID、Name (字符串(20))和备忘录字段,如代码所示
  • 将通过TBSynEdit连接的TDataSource添加到备注字段。这样做的目的是显示我们接下来将添加的活动绑定TSynMemo以同样的方式执行。
  • 向表单中添加TSynMemo、TMemo、TBindingList、TBindSourceDB和TBindNavigator
  • 使用快速绑定弹出添加TLinkControlToFields将TSynEdit和TMemo链接到ClientDataSet的备注字段。
  • 将BindSourceDB的BindSourceDB属性连接到视觉LB设计器中的TBindNavigator的*属性。

现在,将下面的代码添加到表单中。为了将我们的TSynMemo后代注册为一个组件并将其安装到IDE中,代码将它在表单单元中声明为一个Interposer class。它实现了所有的obsever方法,这些方法似乎是生命绑定TSynMemo所必需的。

代码

代码语言:javascript
复制
  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.
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57535630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档