窗体本身/综合应用
关于打开窗体,加载窗体和当前活动窗体的对比
2017-06-22 17:33:43

先来了解一下问题:

IsLoaded("frm0i") = False 和Screen.ActiveForm.Name<>“frm0”在功能上有什么区别呢?有网友认为,如果只打开frm0一个窗体,这两个代码表达的意思应该是一样的。如果打开了包括frm0在内的多个窗体,那IsLoaded只是表明该窗体是否打开,但不能判断该窗体是不是活动窗体。而Screen.ActiveForm.Name的值应该是指当前活动的窗体,既然是活动窗体,那么该窗体就肯定已经加载和打开了。

这里说明一下

IsLoaded函数是返回窗体是否加载,而Screen.ActiveForm.Name则是返回的当前处于活动状态的窗体名称,任一时间加载的窗体可能有多个,但处于活动状态的最多只有一个

这里存在三个概念,其一是打开的窗体;其二是加载的窗体;其三是当前活动的窗体。1、打开的窗体与加载的窗体是两回事情,打开的窗体一定加载了,但反之不一定成立,对于子窗体、孙窗体来说是加载了,但不能视为其打开了。不信你用forms遍历是找不到已经加载于主窗体中的子窗体或孙窗体的。也就是说IsLoaded能判断的范围要比forms遍历到的范围大。2、当前活动的窗体是针对打开的窗体而言的,而不是对加载窗体而言的,所以当前活动窗体一定是主窗体而不可能是子窗体或孙窗体。3、同理关闭和卸载分别针对的是打开的窗体和加载的窗体,所以你对子窗体和孙窗体不应该用关闭事件,而只能用卸载事件。

总结:

是不是可以这样理解:在Access窗口中加载的窗体称之为加载并打开,而在主窗体中加载的子窗体就只能称之为加载了,而没有打开(因为Froms找不到这些子窗体和孙窗体)。可以把子窗体理解为控件(事实上他们确实也是放在子窗体控件中的)。如果对已经打开了的窗体激活的话,就是让其获得焦点。