如果表单被用作当前打开的另一个表单的调用者,是否有办法检查表单中的代码?
答案 0 :(得分:0)
据我所知,开箱即用无法检查。如果您有一小组特定表格(比如一个来电表格和2或3个表格),那么通过calling a method in the caller form from the called forms来管理来电表单中的被叫表格列表应该非常容易。
如果您想要一个适用于所有表单的通用解决方案,那么事情会变得有趣。您可能希望查看SysSetupForm[Run]
和SysForm[Run]
类,并尝试使用类似的表单管理逻辑扩展它们。可能需要将被调用表单管理的数据存储在全局高速缓存中。
那说我建议你重新考虑你的表单设计。通常这样的要求是设计不良的结果。
答案 1 :(得分:0)
是的,有。
对于AX 2009,您的代码看起来应该是这样的:
Object caller = element.args().caller();
if (SysDictClass::isEqualOrSuperclass(classIdGet(caller), classNum(FormRun)))
{
// ...
}
AX 2012的类似内容:
Object caller = element.args().caller();
if (caller is FormRun)
{
// ...
}
但请注意,如果通过菜单项调用表单,则仅在此时设置调用者()。如果直接调用方法,则必须在Args对象中手动设置调用者()。
如果您想在来电表单上调用某个方法,我过去曾在博客中写过这篇文章:
http://devexpp.blogspot.com.br/2013/09/calling-methods-on-caller-dynamics-ax.html
答案 2 :(得分:0)
这只是一个想法,我没有尝试,但我不明白为什么它不起作用。我没有优化代码,所以使用这个想法只是一个灵感。
首先,在从主窗体调用的每个窗体中,修改init
方法,如下所示:
public void init()
{
super();
blahblah::addHandleToCache(element.hWnd());
}
这是blahblah :: addHandleToCache的代码:
public static client void addHandleToCache(int _handle)
{
#define.CACHE_OWNER('MyCallerForm')
container con;
int hWnd;
int i;
//get a container with open window handles from the cache
if (infolog.globalCache().isSet(#CACHE_OWNER, curUserId()))
{
con = infolog.globalCache().get(#CACHE_OWNER, curUserId());
}
//remove handles of closed windows from the container
for (i = conLen(con); i >= 1; i--)
{
hWnd = conPeek(con, i);
if (!WinApi::isWindow(hWnd))
{
conDel(con, i, 1);
}
}
//add the current window handle to the container
con += _handle;
//save the container in the cache
infolog.globalCache().set(#CACHE_OWNER, curUserId(), con);
}
现在,当您想要检查主表单是否被用作其他打开表单的调用者时,您可以使用以下检查:
public boolean hasOpenChildForms()
{
#define.CACHE_OWNER('MyCallerForm')
container con;
int hWnd;
boolean ret;
//get a container with open window handles from the cache
if (infolog.globalCache().isSet(#CACHE_OWNER, curUserId()))
{
con = infolog.globalCache().get(#CACHE_OWNER, curUserId());
}
for (i = conLen(con); i >= 1; i--)
{
hWnd = conPeek(con, i);
if (WinApi::isWindow(hWnd))
{
//the form is open
ret = true
}
else
{
//remove handles of closed windows from the container
conDel(con, i, 1);
}
}
return ret;
}