delphi - 在表单中实时绑定(bind)现有的用户对象

标签 delphi livebindings

我尝试在 VCL 表单上使用实时绑定(bind),其中要绑定(bind)到表单上的控件的对象作为属性传递给表单。我使用的是 10.1 柏林。对象中传递的属性是普通的:

 Public
      Property ProjectObject: TProject Read fProjectObject Write fProjectObject;

我已使用 DataGeneratorAdapter 和 AdapterBindSource 通过设计器设置表单上的链接。

我缺乏理解的地方是 OnCreateAdapter 方法中的 AdapterBindSource。我能找到的所有示例都展示了如何创建一个由控件填充的新对象,但我找不到在 runtinme fProjectObject(传递的对象)处绑定(bind)的方法。

我当前在 OnCreateAdapter 方法中的代码是:

ABindSourceAdapter := TObjectBindSourceAdapter<TProject>.Create(Self);

编译器可以接受,但不允许控件显示和更新 fProjectObject 中的属性。

显示此表单(项目编辑表单)的代码部分如下所示:

ProjEdit.ProjectObject := Proj;
ProjEdit.ShowModal;
StoreProject(Proj);

其中ProjEdit是项目编辑表单,ProjectObject是传递项目对象的属性,Proj是要编辑的项目对象。在对信息进行任何更改后,项目对象将被简单地传递到此表单并存储。该对象在传递到此表单进行编辑之前已存储在数据库中。

如何将实时绑定(bind)连接到传递的对象?

预先感谢您的帮助

最佳答案

这是我的建议:

首先:在 AdapterBindSource 的 CreateAdapter 中使用以下内容:

procedure TfrmProjectEdit.AdapterBindSource1CreateAdapter(Sender: TObject; var ABindSourceAdapter: TBindSourceAdapter);
begin
  fProjectObject:=TProject.Create;
  ABindSourceAdapter:=TObjectBindSourceAdapter<TProject>.Create(self, fProjectObject, True);
end;

第二:为项目属性使用 setter,例如:

procedure TfrmProjectEdit.SetProject (aProject: TProject);
begin
  fProjectObject:=aProject;
  AdapterBindSource1.Refresh;
end;

简单解释:AdapterBindSource 将拥有 fProjectObject,并在 ABS 释放时释放它。我们只需为 fProjectObject 分配一个新值并刷新 setter 中的 ABS。

我还没有测试过这段代码 - 但我认为这应该可行......

关于delphi - 在表单中实时绑定(bind)现有的用户对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42606011/

相关文章:

delphi - 通过 LiveBindings 同步 TMediaPlayer.Position 和 TrackBar.Position

delphi - 我们可以在Delphi XE2 LiveBinding表达式中使用 bool 运算符吗?

delphi - LiveBindings - TList<TMyObject> 绑定(bind)到 TStringGrid

listview - TListView:已添加项目?

Delphi XE2 新服务 - 为什么它包含这些 VCL 单元?

ios - 如何设置TPanel透明?

mysql - 忽略 TDateTime 中的毫秒(相同 TDateTime 值相减不为 0)

delphi - 查询未知接口(interface)类型

delphi - 如何在运行时获取 FMX TComboBox 的 Item.LookupData 和 SelectedValue (作为整数)?