对话
对话是两个人之间的对话。 两个人的对话通常是这样的:
- 飞行员:(把三明治放回托盘上)“你对经济怎么看?”
- 副驾驶:(没有从电话上抬起头)“我需要加薪,你呢?”
- 飞行员:(擦掉大蒜面包屑)“好吧,我这周要去五星级酒店吃饭。”
- 副驾驶:(对游戏皱眉)“他们的鸡汤很好吃。”
这两个人正在以一种允许他们在谈话期间倾向于其他事情的方式交换信息。
有时,两个人会切换到一种非常专注的对话模式:
- 飞行员:“我们的汽油快用完了。”
- 副驾驶:“切换到另一个坦克。”
- 飞行员:“一个小时前做的。”
- 副驾驶:“这不好。 我们还要再过一个小时。”
- 飞行员:“我有个主意,但你不会喜欢的。”
在这种模式下,副驾驶现在忽略纸牌游戏,飞行员忽略三明治。
对话框是一个人与计算机对话的窗口。 JMP 有两种对话框:无模式对话框和模式对话框。 查找/替换对话框是无模式的;它保持开放并在窗口之间切换焦点,就像飞行员从经济转向食品一样容易。 JMP 的保存对话框是模态的;一旦 JMP 进入保存文件模式,在保存文件或取消保存之前,不会有任何其他障碍。 JSL 可以创建无模式或模式的自定义对话框,为您提供一些信息并得到答复。
得到答案
模态对话框的寿命:
- 构建显示框树
- 打开一个窗口以拥有并显示显示框树
- 等待窗口关闭
第 1 项,构建树,通常作为 New Window 函数的参数完成。 第 2 项和第 3 项是新窗口功能。 这是一个警告框模态对话框。
rdata = New Window( title, <<MODAL></MODAL>
<
只是认为你应该知道...
这个小窗口的双向对话非常简单:
没有要返回的数据。 New Window 函数确实返回一个值;它会告诉你是否按下了 OK 按钮
{Button( 1 )}
或使用操作系统提供的关闭按钮关闭窗口
{Button( -1 )}
它返回一个包含一个元素的列表。 您可以使用rdata["按钮"]这将是 -1 或 1。 您可能不在乎,因为您没有在对话框中放置取消按钮。
查看更多...
垃圾
很久以前,JMP 将窗口的内容(显示框)放入一个名为垃圾在要求操作系统关闭窗口之前。垃圾随着时间的推移不断发展以解决许多问题,有时会产生意想不到的副作用。 一个副作用是使模态对话框的显示框对 JSL 可用短的对话框关闭后的时间,这就是一些用户从模态对话框中检索答案的方式……实际上是将它们从垃圾箱中取出。
- 飞行员:(把大蒜碎餐巾扔进垃圾桶)“嗯,很好。”
- 副驾驶:(皱着鼻子)“我想我现在就把它清空。 或者也许一会儿。”
问题垃圾围绕它填满多少以及何时清空它。 在 JMP 的早期版本中,当显示下一个窗口或某些变体时,垃圾箱会被清空。 当垃圾桶被清空时,它的内容消失了,那些模态对话框变量也消失了。 大多数情况下,它大部分时间都有效,但它不断发展,试图解决各种问题。 最终@hecht_jmp将最先进的解决方案放入 JMP 以解决垃圾问题……但需要更多的计划来从模态对话框中获取答案。
以正确的方式获得答案
如果你想返回更多的数据,你必须用<<返回结果:
rdata = New Window( "modal dialog test",
<<MODAL></MODAL>
在我输入之前,它说“输入你的名字”。
{answer = "Craige", Button( 1 )}
您可以使用rdata["答案"]之后新窗户()返回从变量中的文本框中获取值回答. (先做取消测试。)
列表和关联数组一样吗?
上面的所有示例都返回一个列表。 列表中的项目看起来都像简单的赋值语句或某种函数调用。 JMP 的一个很少使用但不太了解的功能是使用这些名称为列表添加下标,而不是更常见的数字索引。
result = New Window( "Tell us about yourself",
<<MODAL></MODAL>
鲍勃正要按确定
结果中的值可能是
{name = "Bob", title = "程序员", Button( 1 )}
或者,如果鲍勃取消,
{name = "Bob", title = "programmer", Button( -1 )}
If( result["Button"] == 1,
Write( Eval Insert( "\!n\[^result["name"]^ is a ^result["title"]^]\" ) )
, // else
Write( "\!nthe dialog canceled." )
);
鲍勃是一名程序员
列表做行为有点像关联数组,尽管它是通过顺序查找完成的。 (如果您需要一个关联数组,请制作一个。 不要使用这个列表行为......它是一个糟糕的替代品。)
模态对话语义
当您的用户按下模态对话框上的取消按钮时,他们不希望任何更改。 模态对话框中的任何 JSL 都应该在不更改程序其余部分中的变量的情况下操作对话框。 这是一个更大的例子;它有一个用于启动报告的无模式对话框:
此窗口打开时,您可以在其他窗口中工作;这是一个无模式的对话框。
每次按下 Make Report 按钮时,都会打开另一个窗口:
显示来自无模式启动器的值的报告。
还有一个“设置参数”按钮,可打开带有验证例程的模式对话框。 此取消按钮不会对上面的启动器应用任何更改。
验证例程打开另一个模态对话框。
- 飞行员:(眯眼)“这看起来很复杂!”
- 副驾驶:“我们可以做到。 有评论!”
// here's a simple modal window. It provides a warning, but no data is returned.
alert = Function( {title, text, icon = "error"},
New Window( title, <<MODAL></MODAL>