2013-10-17 4 views
6

カスタムX ++フォームの複数のコピーを一度に開くことを防ぐためのヒント/コードスニペットがありますか?Dynamics AX 2012フォームのコピーを1つだけ開く

ベストケース:フォームの別のコピーを開こうとし、元の利益は

許容焦点を当てる:ユーザーフォームのに以下のコードを挿入することができ

答えて

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

これはうまく機能します。私は、activateメソッドをelement.existingForm()に変更しなければならなかった。setActive(); activate()コマンドは元のフォームを前面に持ってこなかった。本当にありがとう! – Brad

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()); 
    } 
} 
関連する問題