标记一个 #text .. #endtext 区域的开始。
#text 指令还定义了该区域的性质。该区域可以将值赋给一个局部变量,或处理该区域的内容。
#text 指令有两种变体。
1. #text [:= | +=] VarName [, LineDelimiter [, LineFunc, [, EndFunc]] ]
2. #text LineFunc [, EndFunc]
1.这种变体可以通过跟在 #text 指令后面的 := 或 += 运算符来识别。这声明了一个 #text .. #endtext 区域,将值存储到一个局部变量中,该变量的名称在运算符后面指定。文本声明还可以包含(可选的)标记,这些标记将被用作“行分隔符”,一个可选的函数,用于计算每行,以及一个可选的函数名称,该函数将从 #endtext 行调用。
2.该变体没有变量名,每行和 #endtext 行最多声明 2 个函数名
VarName | 是为文本块赋值的变量的名称 |
LineDelimiter | 是区块中每行末尾应添加的分隔符 |
LineFunc | 是一个函数的名称,该函数应在代码块的每一行中调用。函数传递给该行,并返回一个字符串 |
EndFunc | 是一个函数的名称,在所有行创建完成后被调用。当代码块分配给变量时,该函数接收代码块的字符串值,并返回字符串。当代码块没有分配给变量时,该函数将不带参数地被调用。 |
请注意,以下 3 个 UDC 已在 XSharpDefs.xh 中定义
#xcommand ENDTEXT => #endtext
#xcommand TEXT TO <varname> ;
=> #text := <varname>, chr(13)+chr(10)
#xcommand TEXT TO <varname> ADDITIVE ;
=> #text += <varname>, chr(13)+chr(10)
LOCAL cResult AS STRING
TEXT TO cResult
line 1
line 2
line 3
line 4
TEXT
? cResult
该代码将被转换为
LOCAL cResult AS STRING
var tempLocal := System.Text.StringBuilder{}
tempLocal:Append("Line 1"+chr(13)+chr(10) )
tempLocal:Append("Line 2"+chr(13)+chr(10) )
tempLocal:Append("Line 3"+chr(13)+chr(10) )
cResult := tempLocal:ToString()
? cResult
请注意,编译器会为不同的方言声明不同的 TEXT 命令。上述 TEXT 命令适用于所有方言。
下面的 TEXT 命令适用于非核心方言(FoxPro 除外):
#xcommand TEXT INTO <varname> WRAP [<lnbreak>] TRIMMED ;
=> #text := <varname>, iif(<.lnbreak.>,<!lnbreak!>, CRLF) , LTrim
该命令允许用户定义行结束符,并在每个字符串上调用 LTrim() 函数,然后将其赋值给变量
FoxPro 声明了一个特殊的 TEXT 命令,看起来像这样:
#xcommand TEXT TO <varname> [<tm:TEXTMERGE>] [<noshow:NOSHOW>] [FLAGS <flags>] [PRETEXT <expression> ] ;
=> __TextInit(<.tm.>, <.noshow.>, iif(<.flags.>, <!flags!>, 0), <!expression!> ) ;;
#text := <varname>, ,__TextWriteLine , __TextEnd
正如你所看到的,命令被转化为对 __TextInit() 函数的调用,并包含了各种 TEXT 命令选项的值。每一行都被发送到 __TextWriteLine 函数,#endtext 指令被替换为对 __TextEnd() 的调用。每一行不添加分隔符。这是在 __TextWriteLine 中处理的。当选择 TEXTMERGE 选项或启用全局 SET TEXTMERGE 时,该函数还负责扩展文本内部的表达式。
请注意,以下 2 个 UDC 已在 XSharpDefs.xh 中定义
#xcommand ENDTEXT => #endtext
#xcommand TEXT TO FILE <(file)> ;
=> _TextSave( <(file)> ) ;;
#text QOut, _TextRestore
TEXT TO FILE EXAMPLE.TXT
line 1
line 2
line 3
line 4
ENDTEXT
TEXT TO FILE 命令被转换为对 _TextSave() 函数的调用,随后是 #text 指令,该指令指定每一行都必须发送到 QOut() 函数,并声明 #endtext 行必须由对 _TextRestore() 函数的调用所取代。QOut() 和 _TextRestore 函数名是不带参数的。代码块中的每一行都将作为参数发送给 QOut() 函数。
因此,这段代码将转换为
_TextSave("EXAMPLE.TXT");
QOut("line 1")
QOut("line 2")
QOut("line 3")
QOut("line 4")
_TextRestore()