Delphi LiveBindings TPrototypeBindSource 和 customFormat
Delphi LiveBindings TPrototypeBindSource and customFormat
我将业务 类 与 TPrototypeBindSource 结合使用。我将使用 CustomFormat 连接 2 个字段。我带来了 TBindSourceDB,但没有带来 TPrototypBindSource。
我使用 TEdit 和 TLinkControlToField。
如果我使用 : %s + " text" => 它工作正常。
当我将它与 TBindSourceDB 一起使用时,效果很好
%s + " - " + Self.Owner.FieldByName('Enseigne').text
但是我不明白在使用 TPrototypeBindSource 时如何访问数据。
你能告诉我用业务 类 绑定连接 2 个字段的语法吗?
我想我会再试一次,因为你似乎对我的第一个答案没有太大的热情。
在解决您的问题之前,让我们来做个小实验。在具有数据集的项目中
使用持久字段 FieldA 和 FielDB,例如,设置 BindSourceDB 和 BindingList 并添加
两个 TLinkControlToFields 到 link 这些字段到两个 TEdits,edFieldA 和 edFieldB。
测试它是否按预期工作,然后添加另一个 TEdit、edOther 和另一个 TLinkControlToField、LinkControlToField3。将其控件设置为 edOther,将 DataSource 设置为 BindSourceDB,并将其 FieldName 设置为 FieldA。将其 CustomFormat 设置为
Name
编译和运行,你应该会发现edOther 显示了FieldA 的Field 组件的名称,DataSetFieldA 或类似的名称。很明显,LiveBinding 的
表达式计算器使用 FieldA 的 TField 组件作为 "scope" 它用来
确定所引用的 Name
属性。
现在,将 Name
替换为 Owner.Name
并且在 运行-time edOther 应该显示 Form1
或类似的,因为持久字段由它们包含的表单或数据模块拥有。因此,引用 Owner.Name 扩大了可以解析 Format
表达式中的标识符以及提取它们的值的范围。
因此,使用 BindSourceDB 作为 link 的数据源,您可以将 CustomFormat
设置为相当复杂的内容,例如
LowerCase(Owner.DataSet.IndexFieldNames) + ' ' + Owner.DataSet.FieldByName('ID').Text
不幸的是,这不适用于 PrototypeBindSource
.
的默认设置
继续我们的实验,使用带有两个字段的 PrototypeBindSource 设置一个项目
FieldA 和 FieldB 以及三个 TEdits,和以前一样。请注意,这一次,如果您尝试将 LinkControlToField3 的 CustomFormat
设置为 Name
,您将收到错误消息 'Could not find Name',我认为是因为 LB 机器无法解析对 Name 的引用因为 TPropotypeBindSource 中字段的抽象实现。
然而,并非一无所有。删除 LinkControlToField3,而是将 BindExpression 添加到窗体的 BindingList。
将 BindExpression 的 ControlComponent 设置为 edOther
,将其 ControlExpression 设置为 Text
,并将其 SourceComponent 设置为 Form1
。
完成后,在 SourceExpression 中,我们可以使用像这样的表达式来引用 Form1 及其组件的属性
edFieldA.Text + ':' + edFieldB.Text
这对我来说很好。
我还没有弄清楚的一件事是 SourceExpression 不能包含 LowerCase
之类的东西。然而,通过向 Form1 添加一个 MyLowerCase
函数,LB 对此非常满意。
所以,我认为这回答了您关于如何将内容连接到两个控件(或字段)的问题。就个人而言,我仍然更喜欢使用业务对象的串联 属性,但是 ymmv.
我将业务 类 与 TPrototypeBindSource 结合使用。我将使用 CustomFormat 连接 2 个字段。我带来了 TBindSourceDB,但没有带来 TPrototypBindSource。
我使用 TEdit 和 TLinkControlToField。
如果我使用 : %s + " text" => 它工作正常。 当我将它与 TBindSourceDB 一起使用时,效果很好
%s + " - " + Self.Owner.FieldByName('Enseigne').text
但是我不明白在使用 TPrototypeBindSource 时如何访问数据。
你能告诉我用业务 类 绑定连接 2 个字段的语法吗?
我想我会再试一次,因为你似乎对我的第一个答案没有太大的热情。
在解决您的问题之前,让我们来做个小实验。在具有数据集的项目中 使用持久字段 FieldA 和 FielDB,例如,设置 BindSourceDB 和 BindingList 并添加 两个 TLinkControlToFields 到 link 这些字段到两个 TEdits,edFieldA 和 edFieldB。
测试它是否按预期工作,然后添加另一个 TEdit、edOther 和另一个 TLinkControlToField、LinkControlToField3。将其控件设置为 edOther,将 DataSource 设置为 BindSourceDB,并将其 FieldName 设置为 FieldA。将其 CustomFormat 设置为
Name
编译和运行,你应该会发现edOther 显示了FieldA 的Field 组件的名称,DataSetFieldA 或类似的名称。很明显,LiveBinding 的
表达式计算器使用 FieldA 的 TField 组件作为 "scope" 它用来
确定所引用的 Name
属性。
现在,将 Name
替换为 Owner.Name
并且在 运行-time edOther 应该显示 Form1
或类似的,因为持久字段由它们包含的表单或数据模块拥有。因此,引用 Owner.Name 扩大了可以解析 Format
表达式中的标识符以及提取它们的值的范围。
因此,使用 BindSourceDB 作为 link 的数据源,您可以将 CustomFormat
设置为相当复杂的内容,例如
LowerCase(Owner.DataSet.IndexFieldNames) + ' ' + Owner.DataSet.FieldByName('ID').Text
不幸的是,这不适用于 PrototypeBindSource
.
继续我们的实验,使用带有两个字段的 PrototypeBindSource 设置一个项目
FieldA 和 FieldB 以及三个 TEdits,和以前一样。请注意,这一次,如果您尝试将 LinkControlToField3 的 CustomFormat
设置为 Name
,您将收到错误消息 'Could not find Name',我认为是因为 LB 机器无法解析对 Name 的引用因为 TPropotypeBindSource 中字段的抽象实现。
然而,并非一无所有。删除 LinkControlToField3,而是将 BindExpression 添加到窗体的 BindingList。
将 BindExpression 的 ControlComponent 设置为 edOther
,将其 ControlExpression 设置为 Text
,并将其 SourceComponent 设置为 Form1
。
完成后,在 SourceExpression 中,我们可以使用像这样的表达式来引用 Form1 及其组件的属性
edFieldA.Text + ':' + edFieldB.Text
这对我来说很好。
我还没有弄清楚的一件事是 SourceExpression 不能包含 LowerCase
之类的东西。然而,通过向 Form1 添加一个 MyLowerCase
函数,LB 对此非常满意。
所以,我认为这回答了您关于如何将内容连接到两个控件(或字段)的问题。就个人而言,我仍然更喜欢使用业务对象的串联 属性,但是 ymmv.