这是一个不错的!好消息:有一个解决方案。(但这很棘手。最后是简单的替代解决方案。)
问题是,PRACTICE 脚本的宏替换在实际 PRACTICE 代码中无处不在。但是对话框描述不是 PRACTICE 代码:对话框描述只是嵌入在脚本中。这就像在 HTML 文件中嵌入图像(例如通过数据 URI)。该图像也不是 HTML。
显示自定义对话框的命令是DIALOG.view <dlg-file>
. 但是 DIALOG.view 也可以与嵌入块一起使用(在圆括号中,它们位于单独的行中)。这就是你所做的。
诀窍来了:如果用整个嵌入块内的(&+
所有以开头的单词替换左大括号,&
则将替换为 PRACTICE 宏 - 只要存在具有该名称的宏。
所以你去:
PRINT "Workspace is &WORKSPACE"
DIALOG
(&+
HEADER "&WORKSPACE"
; Large menu here...
)
请注意,宏替换实际上出现在 DIALOG 块中的任何地方。这可能会导致不必要的副作用 - 特别是如果您在 DIALOG 中嵌入了 PRACTICE 代码。例如:
DIALOG
(
BUTTON "Push me"
(
PRIVATE &myfile
DIALOG.File.open *.txt
ENTRY %LINE &myfile
PRINT "You picked file '&myfile'"
)
)
如果您现在为对话框块启用宏替换,它还将替换 PRIVATE 和 ENTRY 命令的 &myfile,这通常不是您想要的。
但是,如果您使用“(&-”)明确禁用宏替换到嵌入在对话框中的 PRACTICE 脚本,它应该可以工作。所以你得到:
DIALOG
(&+
HEADER "&WORKSPACE"
BUTTON "Push me"
(&-
PRIVATE &myfile
DIALOG.File.open *.txt
ENTRY %LINE &myfile
PRINT "You picked file '&myfile'"
)
)
其他解决方法是定义一个宏 &myfile,它实际上包含文本“&myfile”:
LOCAL &WORKSPACE &myfile
&WORKSPACE="Select A Task To Run"
&myfile="&"+"myfile" // <- This is the trick!
DIALOG
(&+
HEADER "&WORKSPACE"
BUTTON "Push me"
(
PRIVATE &myfile
DIALOG.File.open *.txt
ENTRY %LINE &myfile
PRINT "You picked file '&myfile'"
)
)
如果你掌握了这件事,你就接近成为一名实践大师了!
这是自定义对话框的 TEXT 和 HEADER 的另一个更简单的解决方案:
- 将 DIALOG 描述中的 HEADER 语句替换为 DIALOG 命令之前的 WinPOS 命令。
- 将 DIALOG 描述内的 TEXT 语句替换为 DYNTEXT,并将 DIALOG 描述外的文本设置为 DIALOG.Set
例如:
PRIVATE &myheader &mytext
&myheader="Select A Task To Run"
&mytext="zaphod beeblebrox is an awesome frood"
WinPOS ,,,,,,,"&myheader"
DIALOG
(
POS 0 0 30. 1
DlgText1: DYNTEXT ""
)
DIALOG.Set DlgText1 "&mytext"
第二种方法只是避免了 DIALOG 描述中的宏替换。所以这不是问题的确切答案,但可能是实际问题的更好解决方案。