Domanda

Prefazione

Ho bisogno di creare più copie di un modulo di ricerca (in Access 2010 ) che restituisca un valore alla chiamata (che è anche il modulo che ha creato l'istanza del modulo).

Come accennato, questi moduli potrebbero e avranno più copie in esecuzione contemporaneamente, ad esempio un utente potrebbe voler aggiungere un'azienda a qualcosa in modo che:

  • Fai clic su "seleziona azienda" e apri un'istanza della schermata di ricerca dell'azienda
  • Quindi apri l'editor della società (lasciando aperta la schermata di ricerca / selezione della società originale) poiché notano che la società ha una società madre che non è stata ancora aggiunta.
  • Quindi fanno clic sul pulsante "Seleziona società madre" che apre UN'ALTRA istanza della schermata di ricerca e selezione
  • Trovano la società madre
  • Selezionalo per chiudere la seconda schermata di ricerca e la società madre viene aggiunta alla prima società.
  • L'utente seleziona quindi l'azienda modificata utilizzando la schermata di ricerca originale che chiude nuovamente la schermata di ricerca originale e riporta l'azienda selezionata a qualsiasi forma abbia originariamente inizializzato la prima ricerca ...

Tutto ciò consente agli utenti di aggiornare e correggere i dati non appena trovano un errore, il che riduce la probabilità che si dimentichino e lo rende molto più veloce!

LA MAGGIOR PARTE di questo va bene ora, ma ho avuto molti problemi con le istanze di un modulo che non potevano essere aperte come "acDialog" interrompendo così l'esecuzione del codice chiamante fino al termine della ricerca (vedi questa domanda per maggiori informazioni) e la soluzione che ho scelto è simulare la pausa del codice chiamante utilizzando un ciclo infinito e controllando se la schermata di ricerca l'istante è ancora visibile. Quindi, quando l'utente seleziona qualcosa nella schermata di ricerca istantaneamente, inserisce il valore in un campo nascosto nella schermata di ricerca e lo nasconde (non chiuso). La funzione chiamante quindi vede che è nascosto, prende il valore dal campo nascosto e scarica l'istante.

Problema

Posso controllare se il modulo è nascosto utilizzando FormInstant.Visable ma se l'utente chiude il modulo questo causa un errore e il codice che normalmente userei per verificare se il modulo esiste richiede un nome del modulo e poiché è un istante di una forma tutte le forme hanno lo stesso nome! Ho un riferimento al modulo in quanto è memorizzato in un oggetto "form" locale ... Il codice che userei normalmente è:

CurrentProject.AllForms("FormName").IsLoaded

Allora come posso controllare per un istante che un modulo sia ancora caricato?

È stato utile?

Soluzione

LOL Mi sono appena reso conto durante la rilettura del mio messaggio che posso probabilmente intercettare l'errore per capire se il modulo è aperto o meno!

L'ho scritto velocemente e sembra funzionare bene:

Public Function IsFormLoaded(ByRef FormToTest As Form, _
                            Optional ByRef bIsVisable As Boolean = False) As Boolean
    Dim lErrorNum As Long
    bIsVisable = False
    On Error Resume Next
        bIsVisable = NewFormClone.Visible
        lErrorNum = Err.Number
    On Error GoTo 0

    If (lErrorNum = 0) Then
        IsFormLoaded = True
    Else
        IsFormLoaded = False
    End If
End Function

Immagino che non importi davvero chi risponde alla domanda fintanto che riceve una risposta e il prossimo ragazzo / ragazza può usarla! :)

Lo lascerò aperto per un po 'e se nessuno trova una risposta migliore la contrassegnerò come se fosse ...

Altri suggerimenti

Mi piace la tua risposta. Per quanto riguarda l'idea del ciclo / attesa? Un modo migliore è includere sempre un riferimento in ogni modulo. Di solito dichiaro la variabile del modulo del form chiamata frmPrevious.

Create instance of form
Instance.frmPrevious = me

Quindi ora abbiamo il modulo "chiama" del codice quando il modulo è chiuso al posto di un'impostazione di codice "visibile" + loop.

Quindi nel codice di chiusura del modulo abbiamo:

frmPrevious.FunctionCodeToRun

Quanto sopra risolve molti problemi, ma uno è che non hai bisogno di dialoghi (che come noti non possono usare) e scarichi anche la necessità di scrivere il codice "loop + wait" dal codice chiamante.

Ciò tuttavia significa che il codice continua in una nuova funzione nel modulo chiamante. Quindi di solito posiziono quella funzione proprio sotto il codice chiamante nel modulo di chiamata. Inoltre tendo a usare un nome standard per quella funzione. Trovo che questo compromesso ne valga la pena al contrario di loop / wait e continuare nella stessa routine di codice (sono d'accordo che questo "continuare" nel codice è spesso preferibile, ma poi di nuovo dover scrivere loop e attendere il codice non è davvero così pulito) .

Una vecchia domanda, ma ecco cosa mi ha insegnato l'esperienza: se una, due, ... istanze di FormDefn si aprono, l'utente chiude One (Master che è l'unico che può essere progettato), Forms (FormName) restituisce un errore,Forms (Form) fornisce un oggetto sbagliato, ma Forms (NumberIndex) esiste ancora con .Name= FormName!

OpenForm crea l'oggetto Forms (FormName).Una volta chiusi i moduli (FormName) dà un errore.Qualsiasi "Set xForm= New Form_xxx" crea moduli nella raccolta di moduli a cui è possibile accedere solo dall'indice del numero di raccolta e non possono essere progettati.

Quindi per trovare in seguito un modulo multiistanza usa qualcosa come:

Dim FormIdx     As Integer
Dim lForm       As Access.Form
For FormIdx = 0 To Application.Forms.Count - 1
    Set lForm = AccessFunc.Appl.Forms(FormIdx)
    If lForm.Name = pFormName Then
        IsFormOpened = True
        Set rForm = lForm
        GoTo IsFormOpened_Exit
    End If
Next

Prova anche questo

Function IsLoaded(strFrmName As String) As Boolean

    '  Determines if a form is loaded.

    Const conFormDesign = 0
    Dim intX As Integer

    IsLoaded = False
    For intX = 0 To Forms.Count - 1
        If Forms(intX).FormName = strFrmName Then
            If Forms(intX).CurrentView <> conFormDesign Then
                IsLoaded = True
                Exit Function  ' Quit function once form has been found.
            End If
        End If
    Next

End Function

Puoi chiamare la funzione precedente nel tuo progetto in questo modo

If Not isLoaded("MyForm") Then
 MsgBox "MyForm is Not Loaded"
End If
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top