哇。你喜欢复杂的、分层的问题。
第一个问题是访问值,它不像你描述的那样直接完成。事实上,您使用 Describe() 来获取值。唯一的问题是它以以下格式作为字符串返回,并带有引号(请注意,我们使用标准 PowerScript 字符串表示法,其中 ~t 是一个制表符)
"<DefaultValue>~t<Expression>"
您需要表达式,因此您必须解析它,同时删除引号。
获得表达式后,您需要针对给定的行评估它。这可以通过另一个 Describe () 调用来完成,特别是:
Describe ("Evaluate('<expression>', <rownum>)")
可以使用 GetRow() 函数获取表达式正在评估的行号。
这听起来可能需要 PowerScript 和一些临时值存储,但只要您愿意进行冗余函数调用以多次获取给定值,您可以在表达式中执行此操作,例如(对于示例列b):
if (Describe ("Evaluate (~"" + Mid (Describe ("b.protect"),
Pos (Describe ("b.protect"), "~t")+1,
Len (Describe ("b.protect")) - Pos (Describe ("b.protect"), "~t") - 1)
+ "~", " + String (GetRow()) + ")")='1',
rgb(128, 128, 128),
rgb(255,255,255))
这看起来很复杂,但是如果将 Mid() 表达式放在计算字段中以便查看结果,您会看到它只是解析出 Protect 表达式并将其放入上述的 Describe (Evaluate()) 语法中。
为了简单起见,我在我的代码中加入了一个作弊。我使用了我的 Protect 表达式中只有单引号的知识,并选择将 Evaluate() 表达式字符串放在双引号中。如果我试图对任何列进行一般性操作,并且不能假设我的 Protect 表达式中没有双引号,我将使用全局函数将 Protect 表达式中的任何双引号替换为转义引号(〜“),我相信你的代码看起来像一个三重波浪号和一个引号。再说一次,如果我不得不进行全局函数调用(请注意,如果有很多行,表达式中的全局函数调用会对性能产生重大影响),我只需将 Describe ("column.protect") 和 GetRow() 传递给它并构建PowerScript 中的完整表达式,这将更容易理解和维护。
祝你好运,
特里。