代码部件可以显示模式或无模式窗体,但是要受到若干限制。
进程内部件显示的无模式窗体不能正常工作,除非它们能与客户端的消息循环进行通讯。所以, Visual Basic 创建的进程内部件只可在支持这种通讯的客户端进程中显示无模式窗体。
下列应用程序支持进程内部件显示无模式窗体:
不支持进程内部件显示无模式窗体的应用程序有:
为了让进程内部件能够检测在运行时客户端应用程序是否支持显示无模式窗体,Visual Basic 为 App 对象提供了一个布尔类型的 NonModalAllowed 属性。
在显示无模式窗体之前,进程内部件应检测这个属性。如果值为 True,则窗体可以按 vbModeless 显示。如果值为 False,则显示无模式窗体将导致 369 号运行时错误。这时部件就应该降低要求,按 vbModal 显示该窗体。
在开发环境中调试进程内部件时,如果使用非 Visual Basic 的应用程序作为进程外测试程序,那么,即使非 Visual Basic 的应用程序不支持它们,无模式窗体也能显示并运行正常。
在这种情况下测试 App 对象的 NonModalAllowed 属性是没有用的;不管对于什么客户端,该属性都会返回 True。这是因为,在用进程外测试应用程序测试进程内部件时,Visual Basic 不能判断这个测试应用程序是否支持无模式窗体。
在试图编写显示无模式窗体的进程内部件之前,为了能够用于特定的非 Visual Basic 应用程序,可以先编写一个小的测试 DLL,该 DLL 的方法在消息框中显示 App 对象的 NonModalAllowed 属性值。然后,从非 Visual Basic 的应用程序中调用此方法来确定它是否支持无模式窗体。
如果调用进程外部件的方法来显示模式或无模式窗体,窗体不一定会显示在客户端应用程序的窗体之前。这是因为自动化不会给来自不同应用程序的窗体定义 Z 顺序关系。
详细信息 “创建 ActiveX EXE 部件”提供了从进程外部件显示窗体的演示程序。