Show/Hide Toolbars

XSharp

用途

标记一个 #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是一个函数的名称,在所有行创建完成后被调用。当代码块分配给变量时,该函数接收代码块的字符串值,并返回字符串。当代码块没有分配给变量时,该函数将不带参数地被调用。

示例1

请注意,以下 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

请注意,以下 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()

参见

TEXT 命令

Core TEXT 命令

Non-Core TEXT 命令

FoxPro TEXT 命令

#endtext 指令