我使用带有TPrototypeBindSource的业务类。我将使用CustomFormat来连接2个字段。我将使用TBindSourceDB,但不会使用TPrototypBindSource。
我使用TEdit和TLinkControlToField。
如果我使用:%s +“text”=>它的工作正常。 当我将它与TBindSourceDB一起使用时,它可以正常工作
%s + " - " + Self.Owner.FieldByName('Enseigne').text
但是当我使用TPrototypeBindSource时,我不明白如何访问数据。
你能给我一些连接业务类bind的连接2字段的语法吗?
答案 0 :(得分:0)
我觉得我还有另一个回答,因为你似乎对我的第一个没有太大的热情。
在解决你的问题之前,让我们尝试一下。在具有DataSet的项目中 使用持久字段FieldA和FieldB,比如设置BindSourceDB和BindingList并添加 两个TLinkControlToFields将这些字段链接到两个TEdits,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以及三个TEdits,和以前一样。请注意,这一次,如果您尝试将LinkControlToField3的CustomFormat
设置为Name
,您将收到错误消息'找不到名称',我认为因为LB机器无法解析对Name的引用,因为TPropotypeBindSource中字段的抽象实现。
然而,一切都不会丢失。删除LinkControlToField3,而是在Form的BindingList中添加一个BindExpression。
将BindExpression的ControlComponent设置为edOther
,将其ControlExpression设置为Text
,将其SourceComponent设置为Form1
。
完成后,在SourceExpression中,我们可以引用Form1及其组件的属性,使用类似这样的表达式
edFieldA.Text + ':' + edFieldB.Text
对我来说很好。
我还没有找到的一件事是SourceExpression不能包含LowerCase
之类的东西。然而,通过向Form1添加MyLowerCase
函数可以轻松解决这个问题,而LB对此非常满意。
所以,我认为这回答了你如何将内容连接到两个控件(或字段)的问题。就个人而言,我仍然希望使用业务对象的连接属性,但是ymmv。