Trace32 在 TEXT 或 HEADER 中为 window 使用宏
Trace32 use a macro in TEXT or HEADER for window
这里有另一个 Trace32 问题。一周前,我编写了一个新脚本,可以 运行 我公司从一个中央位置使用的任何命令。当我记得我在哪个工作区工作时它会很好用(因为所有文件位置都是相对于工作区根目录的)我今天实现了以下代码:
PRINT "Workspace is &WORKSPACE"
; Select the action we want to perform.
DIALOG
(
HEADER "Select A Task To Run"
; Large menu below
我已经不止一次忘记检查调试控制台,并且在忘记更改工作区时摸不着头脑。我想做如下事情:
; Select the action we want to perform.
DIALOG
(
HEADER &WORKSPACE
但这无法编译。尝试 HEADER "&WORKSPACE"
也不起作用,因为标题只是说“&WORKSPACE
”,而不是给我实际的文件位置 (C:\Files\Whatever\
)。有没有办法使用宏或变量将 window 标题设置为自定义字符串?我似乎找不到解决办法。谢谢!
这个不错!好消息:有一个解决方案。 (但这很棘手。最终的替代解决方案很简单。)
事实是,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,这通常不是您想要的。
但是,如果您使用“(&-] 明确禁用宏替换直至 DIALOG 中嵌入的 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命令之前用WinPOS命令替换DIALOG描述中的HEADER语句。
- 将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 描述中的宏替换。所以这不是问题的确切答案,但可能是解决实际问题的更好方法。
这里有另一个 Trace32 问题。一周前,我编写了一个新脚本,可以 运行 我公司从一个中央位置使用的任何命令。当我记得我在哪个工作区工作时它会很好用(因为所有文件位置都是相对于工作区根目录的)我今天实现了以下代码:
PRINT "Workspace is &WORKSPACE"
; Select the action we want to perform.
DIALOG
(
HEADER "Select A Task To Run"
; Large menu below
我已经不止一次忘记检查调试控制台,并且在忘记更改工作区时摸不着头脑。我想做如下事情:
; Select the action we want to perform.
DIALOG
(
HEADER &WORKSPACE
但这无法编译。尝试 HEADER "&WORKSPACE"
也不起作用,因为标题只是说“&WORKSPACE
”,而不是给我实际的文件位置 (C:\Files\Whatever\
)。有没有办法使用宏或变量将 window 标题设置为自定义字符串?我似乎找不到解决办法。谢谢!
这个不错!好消息:有一个解决方案。 (但这很棘手。最终的替代解决方案很简单。)
事实是,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,这通常不是您想要的。
但是,如果您使用“(&-] 明确禁用宏替换直至 DIALOG 中嵌入的 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命令之前用WinPOS命令替换DIALOG描述中的HEADER语句。
- 将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 描述中的宏替换。所以这不是问题的确切答案,但可能是解决实际问题的更好方法。