Come posso creare una nuova istanza di una classe modulo e quindi aprirlo come una scatola acDialog (pausa altro codice)?
-
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
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