2013-10-17 15 views
6

Chiunque ha suggerimenti/snippet di codice per impedire l'apertura di più di una copia di un modulo X ++ personalizzato alla volta?Dynamics AX 2012 È aperta una sola copia di un modulo

Caso migliore: cercare di aprire un'altra copia del modulo, e gli utili originali concentrano

accettabile: l'utente riceve una notifica che la forma è già aperta

risposta

10

è possibile inserire il codice qui sotto nella forma di Metodo init. Se avete domande per il codice non esitate a chiedere!

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

Questo funziona bene. Ho dovuto cambiare il metodo di attivazione in element.existingForm(). SetActive(); Il comando activate() non ha portato il modulo originale in primo piano. Grazie mille! – Brad

0

Aggiungere il seguente codice al metodo della forma init come segue. Non sono richieste altre modifiche

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()); 
    } 
} 
Problemi correlati