我想我会再回答一次,因为你似乎对我的第一个答案没有太大的热情。
在解决你的问题之前,让我们做一个小实验。例如,在一个具有持久字段 FieldA 和 FieldB 的 DataSet 的项目中,设置一个 BindSourceDB 和 BindingList 并添加两个 TLinkControlToField 以将这些字段链接到两个 TEdit,即 edFieldA 和 edFieldB。
测试它是否按预期工作,然后添加另一个 TEdit、edOther 和另一个 TLinkControlToField、LinkControlToField3。将其控件设置为 edOther,将 DataSource 设置为 BindSourceDB,将其 FieldName 设置为 FieldA。将其 CustomFormat 设置为
Name
编译运行,你会发现edOther显示了FieldA的Field组件的名称,DataSetFieldA或类似的名称。显然,LiveBinding 的表达式求值器正在使用 FieldA 的 TField 组件作为它用来识别Name
所引用的属性的“范围”。
现在,替换Name
为Owner.Name
并且在运行时 edOther 应该显示Form1
或类似,因为持久性字段由其包含的表单或数据模块拥有。因此,引用 Owner.Name 扩大了Format
可以解析表达式中的标识符并提取其值的范围。
因此,使用 BindSourceDB 作为链接的数据源,您可以将其设置CustomFormat
为相当复杂的东西,例如
LowerCase(Owner.DataSet.IndexFieldNames) + ' ' + Owner.DataSet.FieldByName('ID').Text
不幸的是,这不适用于PrototypeBindSource
.
继续我们的实验,使用 PrototypeBindSource 设置一个项目,该项目具有两个字段 FieldA 和 FieldB 以及三个 TEdit,如前所述。请注意,这一次,如果您尝试将CustomFormat
LinkControlToField3 设置为Name
您将收到错误消息“找不到名称”,我认为是因为 LB 机器无法解析对名称的引用,因为 TPropotypeBindSource 中的字段的抽象实现.
然而,一切都没有丢失。删除 LinkControlToField3,而是向窗体的 BindingList 添加一个 BindExpression。
将 BindExpression 的 ControlComponent 设置为edOther
,将其 ControlExpression 设置为 ,Text
并将其 SourceComponent 设置为Form1
。
完成后,在 SourceExpression 中,我们可以使用像这样的表达式来引用 Form1 及其组件的属性
edFieldA.Text + ':' + edFieldB.Text
这对我来说很好。
我还没有设法找出的一件事是 SourceExpression 不能包含LowerCase
. 然而,这很容易解决,通过向MyLowerCase
Form1 添加一个函数,LB 对此非常满意。
所以,我认为这回答了您关于如何将内容连接到两个控件(或字段)的问题。就个人而言,我仍然更喜欢使用业务对象的串联属性,但是 ymmv.