2013-10-17 8 views
6

Wer hat irgendwelche Tipps/Code-Schnipsel, um zu verhindern, dass mehr als eine Kopie eines benutzerdefinierten X ++ -Formulars gleichzeitig geöffnet wird?Dynamics AX 2012 Nur eine Kopie eines Formulars Öffnen

Bester Fall: Der Versuch, eine weitere Kopie des Formulars zu öffnen, und die ursprünglichen Fokus erhält

Acceptable: User eine Mitteilung erhält, dass das Formular bereits geöffnet ist

Antwort

10

Sie den Code unten in der Form des Einsatzes könnte init Methode. Wenn Sie Fragen zum Code haben, zögern Sie nicht zu fragen!

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

Das funktioniert gut. Ich musste die Methode activate in element.existingForm() ändern. SetActive(); Der Befehl activate() brachte das ursprüngliche Formular nicht an die Front. Vielen Dank! – Brad

0

In den folgenden Code der init Methode des Formulars wie folgt. Keine weiteren Änderungen sind erforderlich.

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