Dialogs and Forms（对话框与表单）

（以下内容，译自Category:Tutorials中的Dialogs and Forms. 更多内容可以参看Category:Chinese. ）

本专题介绍模态对话框（modal dialogs）、非模态（modeless）对话框及表单（forms）的特点，还将概要说明何时及如何使用这些类型的东西.

特点

 * Forms（表单）
 * 出现在 Window 菜单中
 * 可以隐藏在其它窗口之下
 * 可以用 Ctrl-TAB 和 Ctrl-Shift-TAB 反复动作
 * （通常）可以平铺及层叠


 * Dialogs（对话框）
 * 不会出现在 Window 菜单中
 * 总在其它窗口之上
 * 不能用 Ctrl-TAB 和 Ctrl-Shift-TAB 反复动作
 * 不参与平铺与层叠


 * 模态对话框
 * 阻断应用程序，如果应用程序中出现了模态对话框，则其就是应用程序当前唯一活动的东西（例如：等待用户输入）；
 * 程序的控制直到对话框关闭之后才得到返回，因此模态对话框的“结果”要在控制返回时才是有效的.


 * 非模态对话框（及表单）
 * 不会阻断应用程序，因此同时可以有多个非模态的对话框及表单被激活，此时应用程序还可以激活菜单、工具条，进行最大化/最小化等；
 * 程序中一旦非模态对话框/表单被创建/显示后立即就会返回控制. 因此，在控制从创建/显示调用返回时其“结果”还不是有效的.

应用指南
一般来说，表单应用于“文档”而对话框应用于“提问”.

模态对话框也可以认为是一种编程的需求，因为程序流可以写成为一系列的动作，比如：


 * 提问用户名
 * 向用户致意并提问所需要的颜色
 * 用所选择的颜色写出“谢谢”

不过这种方法也有不少缺点：


 * 1) 它对用户有很大限制：只有一条顺序通路. 当然也可以在这个通路中加入“if”以及偏好，不过这个办法很快就会复杂得无法控制，编程的困难比做像样的选择难得多.
 * 2) 一般来说，最好是在对话框仍有效时就能确定对话框将要执行的动作，因为要有什么不对头用户当然愿意已经输入的数据还在对话框中时再做些尝试.
 * 3) 模态对话框激活时会阻断整个应用程序（除了对话框本身）. 这对用户体验来讲是很不好的，因而需要保留“高度关注”问题/提示的响应. 想想看，模态对话框激活时，连最小化应用程序都不能做！

还有其它一些理由，不过仅就上述这些问题就足以要求寻找新的方法.

这个新方法就是在对话框/表单 之中 做 动作.

例子 Dialogs and Forms: Modeless dialogs example 说明了如何用非模态对话框的最后一个动作从一个对话框跳到另一个对话框（对表单来讲方法也是一样的）. 值得注意的是，在做OK/Cancel处理时对Cancel没有做任何检查. 有一个表单有三个不同的“最终动作”，在例子中其实是做了同样的事，不过它们也可以去做不同的事. 还有，不需要做很多的测试，因为这些动作是关联在按钮上，而不是作为对话框的“结果”被处理的.