AX通过菜单可以多次打开同一个窗体,有些客户想同一个窗体只打开一次,如果第二次点击就把原来已经窗体显示在最上面。AX提供了一些API用来做这事,并且有合适的入口用来增加一些处理代码。
1.修改类工厂ClassFactory的FormRunClass方法
FormRun formRunClass(Args args)
{
#FormCacheMark
Hwnd hwnd;
;
if(infolog.globalCache().isSet(#FormCacheMark,args.name()))
{
hwnd = infolog.globalCache().get(#FormCacheMark,args.name());
WinAPI::bringWindowToTop(hwnd);
return null;
}
return ClassFactory::formRunClassOnClient(args);
}
{
#FormCacheMark
Hwnd hwnd;
;
if(infolog.globalCache().isSet(#FormCacheMark,args.name()))
{
hwnd = infolog.globalCache().get(#FormCacheMark,args.name());
WinAPI::bringWindowToTop(hwnd);
return null;
}
return ClassFactory::formRunClassOnClient(args);
}
增加一个判断,判断当前客户端是否有该窗体的实例,如果有的话,就直接将窗体显示在最前端,并返回null。
2.修改SysSetupFormRun类的init方法,在Super()方法之后保存当前窗体的hwnd,以便以后调用。
public void init()
{
;
super();
infolog.globalCache().set(#FormCacheMark,this.name(),this.hWnd());
SysSecurityFormSetup::loadSecurity(this);
}
{
;
super();
infolog.globalCache().set(#FormCacheMark,this.name(),this.hWnd());
SysSecurityFormSetup::loadSecurity(this);
}
3.修改SysSetupFormRun类的close方法,在关闭窗体时从全局缓存中去掉当前窗体。
public void close()
{
super();
infolog.globalCache().remove(#FormCacheMark,this.name());
}
{
super();
infolog.globalCache().remove(#FormCacheMark,this.name());
}
OK,就这么简单。具体代码如附件所示。