Question

Préface

J'ai besoin de créer plusieurs copies d'un formulaire de recherche ( Access 2010 ) qui retourne une valeur à l'appel (qui est aussi la forme qui a créé l'instance de la forme).

Comme mentionné ces formes pourrait et aura plusieurs copies en cours d'exécution en même temps par exemple, un utilisateur pourrait vouloir ajouter une entreprise à quelque chose ils:

  • Cliquez sur « société select » et ouvrir une instance de l'écran de recherche de l'entreprise
  • Ouvrez ensuite l'éditeur de l'entreprise (en laissant l'écran de recherche / sélection société d'origine ouverte) comme ils remarquent la société a une société mère qui n'a pas encore été ajouté.
  • Ils cliquent ensuite sur le bouton « Select Parent de l'entreprise » qui ouvre une autre instance de la recherche et de l'écran de sélection
  • Ils trouvent la société mère
  • Sélectionnez-qui ferme le deuxième écran de recherche et la société mère est ajouté à la première entreprise.
  • L'utilisateur sélectionne ensuite la société modifiée en utilisant l'écran de recherche original qui ferme à nouveau l'écran de recherche d'origine et retourne la société choisie à ce que jamais la forme qu'ils initialisés à l'origine de la première recherche ...

Tout cela permet aux utilisateurs de mettre à jour et corriger les données comme et quand ils trouvent une erreur qui réduit la probabilité de les oublier et le rend beaucoup plus rapide!

PLUS cela est très bien maintenant, mais j'ai eu beaucoup de problèmes avec les instances d'un formulaire ne pouvant ouvrir un « acDialog » stoppant ainsi le code d'appel en cours d'exécution jusqu'à ce que la recherche a été effectuée (voir this question pour plus d'informations) et la solution que je suis allé avec est de simuler la mise en pause du code appelant à l'aide d'une boucle sans fin et vérifier si l'écran de recherche instantanée est encore visible. Ensuite, lorsque l'utilisateur de l'élément à l'écran de recherche instantanée, il met la valeur dans un champ caché dans l'écran de recherche et cache soi-même (non fermé). La fonction d'appel voit alors il est caché saisit la valeur du champ caché et déchargements l'instant.

Problème

Je peux vérifier si le formulaire est caché à l'aide FormInstant.Visable mais si l'utilisateur ferme la forme ce qui provoque une erreur et le code je normalement utiliser pour vérifier si le formulaire existe nécessite un nom de formulaire et comme il est un instant d'une forme toutes les formes ont le même nom! J'ai une référence à la forme telle qu'elle est stockée dans un objet « forme » locale ... Le code que je utiliserions normalement est:

CurrentProject.AllForms("FormName").IsLoaded

Alors, comment puis-je vérifier un instant d'une forme en cours de chargement encore?

Était-ce utile?

La solution

LOL Je viens de réaliser en relisant mon msg que je peux piéger sans doute l'erreur de travailler si le formulaire est ouvert ou non!

J'ai rapidement écrit cela et il semble fonctionner correctement:

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

Devinez il n'a pas vraiment mater qui répond à la question tant qu'il est répondu et le gars à côté / gal peut l'utiliser :)

Je vais laisser cette ouverture un peu et si personne ne trouve une meilleure réponse que je marquera ce qu'il ...

Autres conseils

J'aime votre réponse. Quant à la boucle / wait idée? Une meilleure façon est d'inclure toujours une référence dans chaque forme. Je déclare useally variable module de formulaire appelé frmPrevious.

Create instance of form
Instance.frmPrevious = me

Nous avons donc maintenant la forme « appel » du code lorsque le formulaire est fermé en place d'une certaine « visible » + boucle réglage du code.

dans le code proche de la forme que nous avons:

frmPrevious.FunctionCodeToRun

Les solutions précédentes ne résout bon nombre de questions, mais on est que vous n'avez pas besoin de dialogue (qui, comme vous constatez ne peut pas utiliser) Et vous videz également la nécessité d'écrire du code « boucle d'attente + » du code d'appel.

Cela ne signifie cependant que votre code continue dans une nouvelle fonction sous la forme d'appel. Je me suis donc l'habitude de placer ce droit de fonction ci-dessous le code d'appel sous forme d'appel. J'ai aussi tendance à utiliser un nom standard pour cette fonction. Je trouve que ce compromis vaut par opposition à boucle / attente et continuer dans la même routine de code (je suis d'accord ce « continue » dans le code est souvent préférable, mais ayant à nouveau d'écrire en boucle et le code d'attente est pas vraiment propre) .

Une vieille question, mais voici ce que l'expérience m'a appris: Si un, deux, ... cas de FormDefn ouvert puis l'utilisateur ferme un (maître qui est le seul qui peut être conçu), les formes (formName) donne une erreur, formulaires (formulaire) donne mauvais objet, mais les formes (NumberIndex) existe encore avec .Nom = FormName!

OpenForm crée l'objet Forms (FormName). Une fois fermé les formes (FormName) donne une erreur. Tous « Set XFORM = Nouveau Form_xxx » crée des formes dans la collection des formes qui ne sont accessibles que par le nombre collection index, et ne peuvent pas être conçus.

Donc, pour trouver plus tard une chose utilisation de forme multi-instance comme:

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

Essayez ceci aussi

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

Vous pouvez appeler la fonction ci-dessus dans votre projet comme si

If Not isLoaded("MyForm") Then
 MsgBox "MyForm is Not Loaded"
End If
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top