IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

IHM Discussion :

Pourquoi mon formulaire modal ne stoppe pas le code appelant ?


Sujet :

IHM

  1. #1
    Membre expérimenté
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Points : 1 505
    Points
    1 505
    Par défaut Pourquoi mon formulaire modal ne stoppe pas le code appelant ?
    Hello !

    Alors la petite question du jour...

    J'instancie un formulaire comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Private contactEditor As Form
     
    Private Sub OpenDetails()
    '
    'Ouvre le formulaire d'édition détaillé de l'entité sélectionnée, si une entité est sélectionnée
    '
      If IsNumeric(Me.Liste0) Then
        Select Case Me.Liste0.Column(1)
            Case "Entreprise": Set contactEditor = New Form_ContactEntrepriseEditor
            Case "Particulier": Set contactEditor = New Form_ContactParticulierEditor
        End Select
        contactEditor.Modal=True
        contactEditor.Visible = True
        Me.Liste0.Requery
      End If
    End Sub
    Je m'attendais à ce que la ligne "Me.Liste0.Requery" soit exécutée après que contactEditor soit fermé, mais non, il s'exécute dans la foulée.

    En revanche, si je passe par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.OpenForm "ContactEntrepriseEditor", , , , , acDialog
    Ca fonctionne normalement...

    Je précise que j'ai déjà défini les propriété Popup et Modal manuellement en mode design, ça ne change rien.
    (\ _ /)
    (='.'=)
    (")-(")

  2. #2
    Membre du Club
    Inscrit en
    Mai 2003
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 63
    Points : 67
    Points
    67
    Par défaut
    A vérifier parce que je n'en ai pas le temps avant de pouvoir me montrer affirmatif mais j'ai un affreux.
    Lorsque tu crées ton objet avec "set ... New", il me semble que tu crée un objet lié à ton formulaire mais que tu n'ouvre pas pour autant celui-ci. M'est avis qu'une fois créé, il faut utiliser sa méthode "OPENFORM".

    J'ssaierai de repasser d'ici la fin de journée pour voir ce qu'il en est résulté pour toi.

    Bonne chance.

  3. #3
    Membre expérimenté
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Points : 1 505
    Points
    1 505
    Par défaut
    Salut toftof,

    Merci pour ton aide, mais a priori je ne partage ni ton analyse, ni ta solution.
    (\ _ /)
    (='.'=)
    (")-(")

  4. #4
    Expert éminent
    Avatar de Lou Pitchoun
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5 038
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2005
    Messages : 5 038
    Points : 8 268
    Points
    8 268
    Par défaut
    Salut Fred,

    Tu devrais peut être mettre le
    sur l'évènement 'Sur activé' de ton formulaire.

  5. #5
    Membre expérimenté
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Points : 1 505
    Points
    1 505
    Par défaut
    Citation Envoyé par Kikof
    Tu devrais peut être mettre le
    sur l'évènement 'Sur activé' de ton formulaire.
    Nannnn... Je veux d'abord comprendre pkoi un truc qui devrait marcher marche po.

    Comme solution de repli, pour l'instant, j'ai inséré un événement NeedToDispose qu'écoute le form appelant, et que je déclenche en lieu et place d'un docmd.Close dans le form appelé.

    Dans l'appelant ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub EntrepriseEditor_NeedToDispose()
     
        Set EntrepriseEditor = Nothing
        Me.Liste0.Requery
    End Sub
    (\ _ /)
    (='.'=)
    (")-(")

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut Form et flux de contrôle
    Bonjour à tous et à Fred point G

    Voici l'explication du Pb.

    Dans un objet Form, les propriétés Popup et Modal portent sur des aspects de fenêtrage et d'attribution du flux des entrées clavier/souris.
    Ces propriétés n'ont pas d'incidence sur le flux de contrôle (exécution du code).

    La méthode DoCmd.OpenForm offre une possibilité d'agir sur le flux de contrôle avec le paramètre optionnel WindowMode:=acDialog.
    Dans ce cas, c'est la méthode DoCmd.OpenForm qui devient "bloquante" et gère l'attente de la fermeture du formulaire.

    Conclusion, un objet Form n'implémente pas de fonctionnalité de flux de contrôle. Si le développeur ne peut pas utiliser DoCmd.OpenForm, alors il doit lui-même implémenter sa fonction d'attente-synchronisation.

    =-=-=-=-=-=-=

    Pour revenir à ton exemple présenté en début de discussion.

    Quel est l'intérêt d'utiliser l'opérateur New sur une classe formulaire si tu n'as qu'un seul formulaire "bloquant" affiché ?

    Pour ma part, j'utilise l'opérateur New seulement si j'ai besoin de gérer simultanément plusieurs instances du même formulaire.
    Qu'en pense-tu ?

  7. #7
    Membre expérimenté
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Points : 1 505
    Points
    1 505
    Par défaut
    Bonjour =JBO= !

    Citation Envoyé par =JBO=
    Voici l'explication du Pb.
    Merci pour cette explication que je n'avais vraiment pas envisagé mais qui me rassure beaucoup. Je ne vois pas comment implémenter une fonction d'attente-synchronisation et je n'ai pas le temps de me pencher sur ce problème étant donné que, de toute façon, je suis obligé de gérer la destruction du form appelé dans le code du form appelant, ce qui me donne la possiblité de déplacer mon code à exécuter aprèsla fermeture du form appelé, non pas dans la procédure qui l'instancie, mais dans celle qui le détruit...

    J'aurais cherché à rester dans la procédure appelante afin de limiter la durée de vie de ma variable form si je n'avais pas été contraint de déclarer cette variable au niveau module afin de m'abonner à des événements du form qu'elle référence.
    Certes je crois savoir qu'en passant par des API il serait possible de gérer l'abonnement/désabonnement aux événements directement dans la procédure qui instancie le form, mais bon, je ne maîtrise pas ces API.

    Citation Envoyé par =JBO=
    Pour revenir à ton exemple présenté en début de discussion.

    Quel est l'intérêt d'utiliser l'opérateur New sur une classe formulaire si tu n'as qu'un seul formulaire "bloquant" affiché.

    Pour ma part, j'utilise l'opérateur New seulement si j'ai besoin de gérer simultanément plusieurs instances du même formulaire.
    Qu'en pense-tu ?
    J'en pense que tu as raison mais mon exemple était partiel. Je te confirme que j'ai besoin d'instancier plusieurs fois la même classe, les deux étant effectivement des forms modaux (l'un est ouvert à partir de l'autre).
    (\ _ /)
    (='.'=)
    (")-(")

  8. #8
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    A l'arrache

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Sub test()
    Dim f As Form_Formulaire1
    Set f = New Form_Formulaire1
     
    showform f, True
     
    MsgBox "fini"
    End Sub
    Function showform(frm As Form, Optional bdialog As Boolean)
    frm.Visible = True
    If bdialog Then
        Do
            DoEvents
        Loop Until Not isloaded(frm)
    End If
    End Function
    Function isloaded(ByVal frm As Form) As Boolean
    On Error GoTo err
    isloaded = frm.Visible
    err:
    End Function

  9. #9
    Membre expérimenté
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Points : 1 505
    Points
    1 505
    Par défaut
    Ah carrément, un Do... Loop ??

    Je sais pas pourquoi, mais une boucle pour stopper du code j'aurias juré que c'était dégueu...

    Mais si toi qui le fait, ça me rassure un peu. lol

    Ceci dit, comme je l'ai expliqué, ça ne change pas vraiment le problème dès lors que je veux m'abonner à des événements du form instancié.
    (\ _ /)
    (='.'=)
    (")-(")

  10. #10
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Dans un ancien post, jbo le faisait aussi pour gérer des transactions, je lui avait fait la remarque que c'était dégueu donc comme il est le seul à te répondre, je me suis pas géné

    Ceci dit, pour stopper du code comme cela, je ne voit pas d'autres moyens.

    Ou alors avec des goto

  11. #11
    Membre expérimenté
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Points : 1 505
    Points
    1 505
    Par défaut
    Citation Envoyé par Tofalu
    Ou alors avec des goto
    Ouais, un GoTo DotNet...

    Dans un ancien post, jbo le faisait aussi pour gérer des transactions, je lui avait fait la remarque que c'était dégueu donc comme il est le seul à te répondre, je me suis pas géné
    Pas touche à =JBO=, c'est un pote, et il est + fort que toi d'abord, na !
    (\ _ /)
    (='.'=)
    (")-(")

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Pourquoi mon animation Flash ne marche pas sur IE ?
    Par Audrey75 dans le forum Flash
    Réponses: 23
    Dernier message: 23/12/2008, 13h58
  2. Pourquoi mon XmlInclude( dataset) ne marche pas?
    Par Arbiorix dans le forum Services Web
    Réponses: 2
    Dernier message: 09/12/2008, 17h17
  3. Problème de fenêtre modal qui ne stoppe pas le code en arrière plan
    Par Sebcaen dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 25/09/2006, 13h43
  4. [C#] ftp : pourquoi mon fichier à uploader n'est pas accessible ?
    Par LE NEINDRE dans le forum Windows Forms
    Réponses: 3
    Dernier message: 12/09/2006, 14h52
  5. Réponses: 2
    Dernier message: 12/05/2006, 23h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo