我们能在Delphi XE2 LiveBinding表达式中使用布尔运算符吗?

3

我计划为TCheckBox编写一个实时绑定源表达式:

SourceExpression = '(Checked = False) and (Enabled = True)'

执行代码时,提示了一个异常:
Expected EOF - trailing text in expression

Delphi XE2实时绑定支持布尔运算符吗?

只是一个猜测 - 你试过使用 SourceExpression = '(not Checked) and (Enabled)' 吗?为什么呢?因为每当我看到布尔表达式中的 = 时,我的眼睛就会受伤 :-) 但是现在没有 Delphi XE2... - TLama
1
“not Checked” 不被支持,因此我使用 “Checked = False”。 - Chau Chee Yang
看看这个 Stack Overflow 的问题:如何编写实时绑定表达式,以根据 TCheckBox.Checked 控制 TEdit.PasswordChar?。被接受的答案注册了一个布尔表达式求值器。 - LU RD
1
据我所知,在LiveBinding表达式中不能使用逻辑运算符(andornotxorshlshr):(,但可以注册自定义方法来评估逻辑操作以解决此问题。 - RRUZ
shl和shr不是逻辑运算符。很难相信Live Bindings不支持逻辑运算符。 - David Heffernan
难以置信,但不幸的是,显然是真的! - David Heffernan
1个回答

1
不支持直接使用布尔运算符。
文档中可以看到:
您可以在表达式中使用以下数学符号: - 常量:nil True False Pi - 算术运算符:+ - * / - 逻辑运算符:= <> < <= > >= - 括号()可改变运算符优先级。
但是,您可以使用内置函数IfAll()IfAny()IfThen()代替andornot
SourceExpression := 'IfAll(IfThen(Checked, False, True), Enabled)'

或者你可以注册自己的函数

我在XE4上测试过,但是它应该也适用于XE2。

  • A 或 B: IfAny(A, B)
  • A 且 B: IfAll(A, B)
  • 非 A: IfThen(A, False, True)
  • A 异或 B: IfAll(IfAny(A, B), IfThen(IfAll(A,B), False, True))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接