Come posso creare una nuova istanza di una classe modulo e quindi aprirlo come una scatola acDialog (pausa altro codice)?

StackOverflow https://stackoverflow.com/questions/8338895

  •  26-10-2019
  •  | 
  •  

Domanda

Problema

Ho una forma di ricerca complessa che ho bisogno di aprire più volte (allo stesso tempo) per consentire agli utenti di effettuare ricerche multiple allo stesso tempo. Ho trovato la possibilità di aprire un'istanza della forma (in quanto è una classe) utilizzando:

Option Compare Database
Option Explicit

'Array to hold Form Instances
Private MyFormCollection(1 To 4) As Form_frmTest

Private Sub cmd_CloneMe_Click()
    Dim intCounter As Integer

    For intCounter = 1 To 4
        Set MyFormCollection(intCounter) = New Form_frmTest
        MyFormCollection(intCounter).Caption = "Form #" & intCounter
        MyFormCollection(intCounter).Visible = True
    Next intCounter

    Forms!frmTest.SetFocus
End Sub

Questo è un esempio di aprire più istanze di una maschera e non quello che userò per il codice finale, come ho solo bisogno di aprire un istante per click, ma sarà probabilmente altri già aperto!

ma non posso trovare un modo per uno di quei duplicati come un acDialog (così chiama le pause di funzione fino a nascondere o chiudere la nuova forma di dialogo). Qui è il modo che normalmente aprire una forma normale (non una copia):

Call DoCmd.OpenForm("SomeForm", acNormal, , , , acDialog)

Domanda

Come posso aprire una nuova istanza di un modulo come una finestra di dialogo (così chiama le pause di funzione fino a nuovo form viene chiuso o nascosto)?

Grazie

È stato utile?

Soluzione

È possibile utilizzare questo codice per verificare se una forma è visibile:

Private Function IsVisible(intObjType As Integer, strObjName As String) As Boolean
    Dim intObjState As Integer
    intObjState = SysCmd(acSysCmdGetObjectState, intObjType, strObjName)
    IsVisible = intObjState And acObjStateOpen
End Function

Se sì, non resta che attendere:

Do While IsVisible(acForm, "frmInfo")
    DoEvents
Loop

==================

Ok, un'altra idea: si hanno o la scelta di aprire una finestra di dialogo modale e fermare il codice nella funzione di chiamata, o vivere con più finestre di dialogo e hanno la funzione di chiamata in esecuzione.

Credo che l'unico modo per risolvere questo è un contatore delle finestre di dialogo aperte, e rifiutandosi di fare qualsiasi cosa in funzione di chiamata quando il conteggio è ancora> 0.

Altri suggerimenti

E 'possibile scrivere una funzione pubblica nel modulo chiamato e fino a che restituisce la funzione (chiudendo il modulo) il metodo chiamante è bloccato. Nell'esempio che segue clic su un pulsante "Done" potrebbe impostare il ritorno

Option Explicit
Private m_dlgResult As VbMsgBoxResult

Public Function ShowDialog() As VbMsgBoxResult

    m_dlgResult = vbCancel
    Me.Show vbModal
    ShowDialog = m_dlgResult

End Function

Private Sub Done_Click()

    m_dlgResult = vbOK
    Unload Me

End Sub
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top