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

Access Discussion :

Comportement incertain de l'objet Forms => une idée ? [AC-2010]


Sujet :

Access

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 44
    Points : 36
    Points
    36
    Par défaut Comportement incertain de l'objet Forms => une idée ?
    Bonjour,
    Je cherche à afficher dans une messagebox le contenu de la requete courante qui sous-tend mon formulaire actif.
    j'ai essayé d'afficher pour commencer son nom avec la récupération de l'index du formualaire courrant

    Me.CurrentView


    puis en faisant appel à la propriété Name de l'objet Forms correspondant à cet index
    Forms(Me.CurrentView).Name

    Cela a fonctionné à merveille.

    Alors j'essaye de faire appel à la propriété RecordSource de l'objet Forms correspondant à cet index

    Forms(Me.CurrentView).RecordSource


    et la cela ne fonctionne plus du tout.

    A toutes mes tentatives d'utilisation de propriété de l'objet Forms, y compris "Name" qui fonctionnait précédement, l'erreur suivante se produit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ----------------------
    Microsoft Visual Basic
    ----------------------
    Arreur d'execution '2456':
    Numéro de référence au formulaire non valide
    ----------------------
    [Continuer][Fin][Debogage][Aide]

    Toute instruction contenant
    produit cette erreur.

    Et ce, même si je retire la dernière instruction déclencheuse de ce comportment bizarre.

    Alors j'ai mis des MsgBox pour tracer ce qui ce passe.
    Ne trouvant pas, j'insère un bout de code de DMboup, en y insérant des traces...

    ci-dessous le code source complet du bouton d'appel et sa procédures liée

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    Private Sub BTNSRC_Click()
    MsgBox " Sub BTNSRC_Click() ", vbInformation, "procédure évènementielle"
    FORMSRC Me
    End Sub
     
    Public Sub FORMSRC(ByRef frm As Form)
    'Affiche le source de la requete assiciée à ce formulaire
    '   Index Formulaire actif  Me.CurrentView
    '
    'MsgBox " index forms : " & CStr(Me.CurrentView) 
    'MsgBox Forms(Me.CurrentView).RecordSource
    'MsgBox Forms(Me.CurrentView).Name
     
     
       Dim TxtMsg As String
       Dim ListForm As String
     
       MsgBox " Sub FORMSRC(ByRef frm As Form) ", vbInformation, "procédure"
     
     '(DMboup) Pour lister les formulaires ouverts en mode formulaire (CurrentView=1; 0 ouvert en création, 2 ouvert en feuille de données)
     
      For Each MonForm In Application.Forms
            If MonForm.CurrentView = 1 Then
                i = i + 1
                If i = 1 Then
                    ListForm = MonForm.Name
                Else
                    ListForm = ListForm & "; " & MonForm.Name
                End If
                If i = Me.CurrentView Then MsgBox MonForm.Name, , "nom du formulaire courrant dont l'index est " & CStr(Me.CurrentView)
            End If
        Next
     
        'MsgBox (prompt, btn mode vbokonly, title,helpfile, context as vbmsgboxresult)
        MsgBox ListForm, , "ListForm"
     
        MsgBox CStr(Me.CurrentView), , "CStr(Me.CurrentView)"
     
        MsgBox Forms(Me.CurrentView).Name, , "Forms(Me.CurrentView)" 'tombe en erreur '2456'
     
     
    End Sub


    Quelqu'un aurait il une idée de la raison du non fonctionnement des deux instructions Forms(Me.CurrentView).RecordSource et Forms(Me.CurrentView).Name ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'MsgBox Forms(Me.CurrentView).RecordSource
    'MsgBox Forms(Me.CurrentView).Name

    En vous remerciant par avance ,
    ArchiSi

    Apparement il sufit de supprimer un s . C'est carément bizzare, pourquoi Access qui comprenait Forms, ne veut plus rien savoir et ne comprends désormais que Form... mystère!

    donc désormais c'est ce code qui fonctionne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'MsgBox Form(Me.CurrentView).RecordSource
    'MsgBox Form(Me.CurrentView).Name

  2. #2
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 878
    Points : 4 754
    Points
    4 754
    Par défaut
    Le formulaire courant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    debug.print me.name
    ' aussi :
    MsgBox Forms(Me.name).RecordSource
    "Always look at the bright side of life." Monty Python.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 44
    Points : 36
    Points
    36
    Par défaut Merci : Forms ou Form
    Merci
    je viens de voir la réponse.
    C'est bien la syntaxe que je cherchais.

    il m'a fallu enlever un s à forms pour que cela fonctionne.
    Mon problème est résolu
    Cordialement

  4. #4
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 650
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 650
    Points : 14 628
    Points
    14 628
    Par défaut
    bonjour,
    Je cherche à afficher dans une messagebox le contenu de la requete courante qui sous-tend mon formulaire actif.
    j'ai essayé d'afficher pour commencer son nom avec la récupération de l'index du formualaire courrant

    Me.CurrentView
    tu fais une confusion dans les propriétés du formulaire: CurrentView = mode d'affichage du formulaire (Création, Formulaire, Feuille de Données, Page) rien à voir avec un quelconque "index du formulaire courant".
    Le formulaire courant (ou actif) est celui qui a le focus et il n'y a aucune propriété du formulaire qui le définit.

    Seule l'application (la base active) a cette propriété (nom de l'objet actif) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.CurrentObjectName
    par extension, me.name (comme la solution de micniv) donne bien le formulaire actif, mais c'est uniquement parce que c'est l'objet actif et qu'il peut donc exécuter son code.
    puis en faisant appel à la propriété Name de l'objet Forms correspondant à cet index
    Forms(Me.CurrentView).Name

    Cela a fonctionné à merveille.
    j'aurais bien aimé voir le résultat, car à part afficher un message d'erreur je ne vois pas ce qui peut fonctionner dans ce code (même sans s)...
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 44
    Points : 36
    Points
    36
    Par défaut
    Bonjour,
    merci beaucoup pour ces explication. J'ai eu du mal a comprendre. Du coup le comportement incertain etait lié aux fenetres ouvertes en mode formulaire, et laquelle parmis celles ci etait active. J'ai corrigé le script dont le comportement est constant et semble fonctionner correctement.

    ci-dessous le source résulant

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    Private Sub BTNSRC_Click()
    Dim MDBG As Boolean
    Dim answer As Integer
     
    ' non pertinent : le bouton SRC n'est affiché qu'en mode Debug
    ' la récupération  du champ MODEDBGm donnera donc toujours la meme valeur
    ' a savoir vrai
    ' If IsNull(Me![MODEDBGm]) Then Me![MODEDBGm] = False 'initialisation s'il est vide
    ' MDBG = Me![MODEDBGm]
    ' ces deux instructions sont remplacées par une question posée via une MsgBox
    '
     
    answer = MsgBox("Afficher la requete source en mode verveux ?", vbYesNo + vbDefaultButton2, "[SRC] Verbose ?")
    If answer = vbYes Then
       MDBG = True
       Else
       MDBG = False
    End If
    If MDBG Then MsgBox " Sub BTNSRC_Click() ", vbExclamation, "procédure évènementielle"
     
    FORMSRC Me, MDBG
    End Sub
     
    Public Sub FORMSRC(ByRef frm As Form, MDBG As Boolean)
    'Affiche le source de la requete associée à ce formulaire 
    '   Me.Calcule_Independent_NomForm = Forms(Me.CurrentView).Name
     
       Dim txtmsg As String
       Dim ListForm As String
       Dim NomFormCurrent As String
       Dim SRCFormCurrent As String
       Dim TypouvertureFormCurrent As Integer
     
       If MDBG Then MsgBox " Sub FORMSRC(ByRef frm As Form) ", vbExclamation, "procédure"
       If MDBG Then MsgBox " formulaire transmis : frm.name " & frm.Name, vbOKOnly, "procédure"
     
     'Pour lister les formulaires ouverts en mode formulaire (CurrentView=1; 0 ouvert en création, 2 ouvert en feuille de données)
     
      For Each MonForm In Application.Forms
            If MonForm.CurrentView = 1 Then
            ' si le formulaire est ouvert en mode formulaire
                i = i + 1
                If i = 1 Then
                    ListForm = MonForm.Name   
                Else
                    ListForm = ListForm & "; " & MonForm.Name
                End If
     
                If MonForm.Name = frm.Name Then 'Donc là je ne teste plus Currentview qui n'a rien à voir avec ce que je cherchais mais je teste par son nom
                                                                ' si le formulaire de la collection coresspond bien à celui ouvert dans lequel j'ai cliqué sur [SRC]
     
              ' on ne recupère que les propriété du formulaire ayant appelé cette procedure
                       NomFormCurrent = MonForm.Name
                       SRCFormCurrent = MonForm.RecordSource
                       TypouvertureFormCurrent = MonForm.CurrentView
                End If
            End If
        Next
     
        'syntaxe MsgBox (prompt, btn mode vbokonly, title,helpfile, context as vbmsgboxresult)
        If MDBG Then MsgBox ListForm, , "ListForm ouvert en mode fenetre-formulaire" 
        If MDBG Then MsgBox (CStr(Me.CurrentView) & " versus " & CStr(frm.CurrentView)), vbOKOnly, "CStr(Me.CurrentView) versus CStr(frm.CurrentView)"
        If MDBG Then
                Debug.Print Me.Name
                ' aussi :
                MsgBox Forms(Me.Name).RecordSource, vbOKOnly, "Forms(Me.Name).RecordSource"
        End If
     
       txtmsg = "Formulaire actif Nom : " & NomFormCurrent & Chr(13) & Chr(10)
       txtmsg = txtmsg & "Type d'ouverture (0 dev, 1 fenetre, 2 tabulaire)  : " & CStr(TypouvertureFormCurrent) & Chr(13) & Chr(10)
       txtmsg = txtmsg & Chr(13) & Chr(10)
       txtmsg = txtmsg & "DATASOURCE" & Chr(13) & Chr(10)
       txtmsg = txtmsg & "==========" & Chr(13) & Chr(10)
       txtmsg = txtmsg & SRCFormCurrent
       MsgBox txtmsg, vbInformation, NomFormCurrent & " => DATASOURCE code requete associée"
     
     
    End Sub
    Merci encore;
    Il ne me reste plus qu'à nettoyer ce source pour ne laisser que ce qui est en rapport avec l'objet de ma procédure : afficher le code source associé au formulaire en cours, et retirer tout les "if If MDBG Then MsgBox ..." esclusivement liés à ma curiosité.

    A bientôt

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

Discussions similaires

  1. Utilisation des objets form dans une classe
    Par quikjean dans le forum Visual Studio
    Réponses: 0
    Dernier message: 27/07/2009, 22h31
  2. copie d'un objet shape sur une form
    Par JockdiL dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 18/09/2008, 19h33
  3. Réponses: 15
    Dernier message: 19/06/2006, 19h25
  4. déplacer un objet TLabel sur une Form
    Par darkangel37 dans le forum C++Builder
    Réponses: 14
    Dernier message: 14/06/2006, 10h36
  5. Pb pour changer la taille d'un Objet TImage dans une Form
    Par Gouyon dans le forum C++Builder
    Réponses: 10
    Dernier message: 06/06/2006, 18h01

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