Dynamics AX 2012只打开表单的一个副本

时间:2013-10-17 06:39:43

标签: forms axapta x++ dynamics-ax-2012

任何人都有任何提示/代码段,以防止一次打开自定义X ++表单的多个副本?

最佳案例:尝试打开表单的另一个副本,原始收益重点

可接受:用户收到表格已打开的通知

2 个答案:

答案 0 :(得分:10)

您可以将下面的代码插入到表单的init方法中。 如果您对代码有任何疑问,请不要犹豫!

public void init()
{
    #define.CACHE_OWNER        ('MyForm')
    #define.CACHE_KEY_INSTANCE ('Instance')

    FormRun existingForm()
    {
        ;

        if (infolog.globalCache().isSet(#CACHE_OWNER, #CACHE_KEY_INSTANCE))
        {
            return infolog.globalCache().get(
                #CACHE_OWNER, #CACHE_KEY_INSTANCE);
        }
        return null;
    }

    void registerThisForm()
    {
        ;

        infolog.globalCache().set(#CACHE_OWNER, #CACHE_KEY_INSTANCE, this);
    }

    boolean isAlreadyOpened()
    {
        ;

        return existingForm() ? !existingForm().closed() : false;
    }

    void activateExistingForm()
    {
        ;

        existingForm().activate(true);
    }
    ;

    super();
    if (isAlreadyOpened())
    {
        activateExistingForm();
        this.close();
    }
    else
    {
        registerThisForm();
    }
}

答案 1 :(得分:0)

将以下代码添加到表单的init方法中,如下所示。不需要进行其他更改。

public void init()
{
    #define.CACHE_OWNER('MyForm')
    int hWnd;

    super();

    if (infolog.globalCache().isSet(#CACHE_OWNER, curUserId()))
    {
        hWnd = infolog.globalCache().get(#CACHE_OWNER, curUserId());
    }

    if (WinApi::isWindow(hWnd))
    {
        element.closeCancel();
        WinAPI::bringWindowToTop(hWnd);
    }
    else
    {
        infolog.globalCache().set(#CACHE_OWNER, curUserId(), element.hWnd());
    }
}