我使用带有TPrototypeBindSource的业务类。我将使用CustomFormat来连接两个字段。我会带着TBindSourceDB来,但不会带着TPrototypBindSource。
我使用TEdit和TLinkControlToField。
如果我使用:%s +“text”=>,它可以正常工作。当我将它与TBindSourceDB一起使用时,它可以正常工作
%s + " - " + Self.Owner.FieldByName('Enseigne').text但是当我使用TPrototypeBindSource时,我不知道如何访问数据。


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