我尝试在 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/