对话
对话是两个人之间的对话。 两个人的对话通常是这样的:
这两个人交换信息的方式使他们能够在谈话过程中处理其他事情。
有时两个人会切换到一种高度集中的对话模式:
在这种模式下,副驾驶现在忽略纸牌游戏,而飞行员则忽略三明治。
对话框是人与计算机进行对话的窗口。 JMP 有两种对话框:无模式对话框和模态对话框。 查找/替换对话框是无模式的;它保持打开状态,并在窗口之间切换焦点,就像飞行员从经济切换到食物一样轻松。 JMP 的保存对话框是模态的;一旦 JMP 进入保存文件模式,在保存文件或取消保存之前,没有任何其他内容可以妨碍。 JSL 可以创建自定义对话框(无模式或模式),为您提供一些信息并获得答复。
得到答案
模式对话框的生命周期:
第 1 项,构建树,通常作为 New Window 函数的参数来完成。 第 2 项和第 3 项是新窗口功能。 这是一个警报框模式对话框。
rdata = New Window( title, <<MODAL></MODAL>
<
Just thought you should know...Just thought you should know...Just thought you should know...Just thought you should know...只是觉得你应该知道...
这个小窗口的双向对话框非常简单:
没有数据可返回。 New Window 函数确实返回一个值;它告诉您是否按下了“确定”按钮
{Button( 1 )}
或使用操作系统提供的关闭按钮关闭窗口
{Button( -1 )}
它返回一个包含一个元素的列表。 您可以使用以下命令测试“取消”与“确定” rdata[“按钮”]这将是 -1 或 1。 您可能不在乎,因为您没有在对话框中放置“取消”按钮。
很久以前,JMP 将窗口的内容(显示框)放入一个称为垃圾在要求操作系统关闭窗口之前。垃圾随着时间的推移,它解决了许多问题,但有时会产生意想不到的副作用。 一个副作用是使模式对话框的显示框可用于 JSL短的对话框关闭后的时间,这就是一些用户从模式对话框中检索答案的方式......实际上是将它们从垃圾箱中取出。
问题与垃圾围绕它填充了多少以及何时清空它。 在 JMP 的早期版本中,当显示下一个窗口或某些变体时,垃圾箱会被清空。 当垃圾箱被清空时,它的内容就消失了,那些模式对话框变量也消失了。 它在大多数时候都有效,但它不断发展,试图解决各种问题。 最终@hecht_jmp将最先进的解决方案放入 JMP 中,解决了垃圾问题……但需要更多的计划来从模式对话框中获取答案。
以正确的方式获得答案
如果您想要返回更多数据,您必须通过以下方式请求<<返回结果:
rdata = New Window( "modal dialog test", <<MODAL></MODAL>
It said "Enter your name" before I typed over it.It said "Enter your name" before I typed over it.It said "Enter your name" before I typed over it.It said "Enter your name" before I typed over it.在我输入之前,它说“输入你的名字”。
{answer = "Craige", 按钮( 1 )}
您可以使用rdata[“答案”]之后新窗户()返回以从变量中的文本框中获取值回答。 (首先进行取消测试。)
列表类似于关联数组吗?
上面的所有示例都返回一个列表。 列表中的项目看起来都像简单的赋值语句或某种函数调用。 JMP 的一个很少使用且不太了解的功能是使用这些名称而不是更常见的数字索引来为列表添加下标。
result = New Window( "Tell us about yourself", <<MODAL></MODAL>
Bob is about to press OKBob is about to press OKBob is about to press OKBob is about to press OK鲍勃正要按“确定”
结果的值可能是
{名称=“鲍勃”,标题=“程序员”,按钮(1)}
或者,如果鲍勃取消,
{名称=“鲍勃”,标题=“程序员”,按钮(-1)}
If( result["Button"] == 1, Write( Eval Insert( "\!n\[^result["name"]^ is a ^result["title"]^]\" ) ) , // else Write( "\!nthe dialog canceled." ) );
鲍勃是一名程序员
列表做其行为有点像关联数组,尽管它是通过顺序查找完成的。 (如果您需要关联数组,请创建一个。 不要使用此列表行为...它是一个糟糕的替代品。)
模态对话框语义
当用户按下模式对话框上的取消按钮时,他们希望不会发生任何更改。 模式对话框中的任何 JSL 都应该操作该对话框,而无需更改程序其余部分中的变量。 这是一个更大的例子;它有一个用于启动报告的无模式对话框:
You can work in other windows while this window is open; it is a modeless dialog.You can work in other windows while this window is open; it is a modeless dialog.You can work in other windows while this window is open; it is a modeless dialog.You can work in other windows while this window is open; it is a modeless dialog.当此窗口打开时,您可以在其他窗口中工作;这是一个非模式对话框。
每次按下“生成报告”按钮时,都会打开另一个窗口:
A report showing the values from the modeless launcher.A report showing the values from the modeless launcher.A report showing the values from the modeless launcher.A report showing the values from the modeless launcher.显示来自无模式启动器的值的报告。
还有一个“设置参数”按钮,可打开带有验证例程的模式对话框。 此取消按钮不会对上面的启动器应用任何更改。
The validation routine opens yet another modal dialog.The validation routine opens yet another modal dialog.The validation routine opens yet another modal dialog.The validation routine opens yet another modal dialog.验证例程会打开另一个模式对话框。
// 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>
什么是模式对话框以及如何编写更好的对话框。