AX2009 - 检查表单是否是调用者

时间:2015-07-27 14:18:49

标签: axapta microsoft-dynamics dynamics-ax-2009

如果表单被用作当前打开的另一个表单的调用者,是否有办法检查表单中的代码?

3 个答案:

答案 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;
}