Appel d'un objet dans une form depuis un module

Signaler
Messages postés
936
Date d'inscription
lundi 19 janvier 2004
Statut
Membre
Dernière intervention
17 mars 2017
-
Messages postés
792
Date d'inscription
vendredi 4 mars 2005
Statut
Membre
Dernière intervention
12 juin 2012
-
Bonjour à tous,
voilà mon problème ( Bien simplifié) : J'ai une Form (Form1) avec un label (Label1) et un bouton (commandbutton1)
je lance la form et quand je clique sur le commandButton j'appelle une fonction (Recherche) située dans un module (Call Recherche).
jusque là tout va bien .....
Ma fonction doit connaitre la propriété Caption du label donc depuis le module je récupére cette propriété.
Dim Chemin as string
Chemin = Form1.Label1.caption

et c'est là que le bas blesse. quand je veux récupérer la propriété Caption le prog repasse par la sub FormLoad de ma Form et remet tout à zéro.
Donc ma question comment faire pour ne pas repasser par FormLoad.
à mon avis c'est une bétise mais bon je n'arrive pas à y mettre le doigt dessus.
Cordialement, Jean-Paul  
______________________________________________________________________

Le Savoir n'a de valeur que s'il est partagé

9 réponses

Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
133
Il faut que tu lui passe la référence de ta feuille :

Public sub Recherche(ByRef oForm As Form)

...

End Sub

Et pour l'appel :
Recherche(me)
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
" ... repasse par la sub FormLoad de ma Form ..."

C'est pas normal. Tu ne peux repasser par le Form_Load que si ta feuille avait été déchargée et est rechargée. Hors ici ce ne doit pas etre le cas. Si tu appelle la fonction recherche dans l'évènement du CommandButton de ta feuille, elle ne poura pas etre déchargée tant que cet évènement ne sera pas terminer.

Vérifie ton code, mais il y a quelque chose qui colle pas.

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #
Messages postés
936
Date d'inscription
lundi 19 janvier 2004
Statut
Membre
Dernière intervention
17 mars 2017
4
Re,
Dark, je vais testé ta manière.
Sinon voilà je met un bout de code

Private Sub cmdSuivant_Click()
'   J'ai plusieurs panel dans ma Form m_Place me permet
'   de selectionner le panel à afficher



cmdPrécédant.Enabled = (m_Place > 0)
If m_Place = 4 Then
    m_Place = 5
    cmdSuivant.Caption = "&Terminer"
    AffichePanel m_Place
    Call LancerLaRecherche_API



    Exit Sub



Else
   
    m_Place = m_Place + 1
End If
'   la sub AffichePanel affiche le Panel FramePanel(m_Place) concerné
'   un seul est affiché les autres sont cachés
'   à L'appel de ma fonction le panel ou se trouve le label est caché
'   Le problème vient peut-être de là



AffichePanel m_Place







End Sub




'   ce qui suit a été récupéré sur VBFrance et se situe dans un module c'est une recherche récursive de fichier.

'===============================================
'===============================================
Sub LancerLaRecherche_API()
    ' Alogtihme récursif
    '---Déclaration des variables---
    Dim ResultatRecherche As ListeFichier
    Dim NombreOccurence As Long
    Dim i
   
    Dim Repertoire As String
    Dim FichiersRecherchés As String

' Ici je suis Obligé de passé par une déclaration public sinon il me recharge le FormLoad
   'Repertoire = frmImport.Dir1.Path <= ICI PAS BON
   Repertoire = m_Panel_Path
    If Right(Repertoire, 1) <> "" Then Repertoire = Repertoire & ""
   
    FichiersRecherchés = "*.avi"     
    '---Recherche de tous les fichiers souhaités sur le lecteur prévu---
    NombreOccurence = Rechercher(Repertoire, FichiersRecherchés, ResultatRecherche)
    ' Toutes les informations de la recherche sont dans la variables ResultatRecherche
End Sub






'--------------------------------------------------------
'---La fonction Rechercher : ---
'--- Cette fonction recherche tous les fichiers dans ---
'--- le répertoire spécifié et ses sous-repertoires ---
'--- Elle retourne le nombre d'occurences trouvées ---
'--------------------------------------------------------
Private Function Rechercher(Chemin As String, FichierR As String, _
                            ResultatRecherche As ListeFichier) As Long
   
    '---Déclaration des variables---
    Dim lpFindFileData As WIN32_FIND_DATA
    Dim hFindFile As Long
    Dim lgRep As Long
    Dim CheminRep As String
   
    Dim NomDuFichier As String
   
    '---Recherche tous les fichiers demandés dans le répertoire Chemin---
    hFindFile = FindFirstFile(Chemin & FichierR, lpFindFileData)
    If hFindFile <> INVALID_HANDLE_VALUE Then
        Do
            ' Mémorise
            ResultatRecherche.Nombre = ResultatRecherche.Nombre + 1
            ReDim Preserve ResultatRecherche.Chemin(1 To ResultatRecherche.Nombre)
            ReDim Preserve ResultatRecherche.Fichiers(1 To ResultatRecherche.Nombre)
            ResultatRecherche.Chemin(ResultatRecherche.Nombre) = Chemin
            ResultatRecherche.Fichiers(ResultatRecherche.Nombre) = lpFindFileData
   
            NomDuFichier = lpFindFileData.cFileName
            'Nettoyage du string renvoyé par l'API
            NomDuFichier = Replace(NomDuFichier, Chr(0), "")
            NomDuFichier = Trim(NomDuFichier)
           
            'S'il ne s'agit pas du dossier...
            If NomDuFichier <> "." And NomDuFichier <> ".." Then
'REMARQUE : prend en compte les fichiers de type
'           "~$ojet méd.socio-péd. SAJA.doc" pouvant résulter d'un plantage du PC
                'ajoute celui-ci à la liste des fichiers trouvés
                'frmRechercherFichiers.ListView1.ListItems.Add , , NomDuFichier
                'frmRechercherFichiers.ListView1.ListItems(frmRechercherFichiers.ListView1.ListItems.Count).ListSubItems.Add , , Chemin

'   Ici le prog repasse aussi par le Formload

                frmImport.ListView1.ListItems.Add , , NomDuFichier
                frmImport.ListView1.ListItems(frmImport.ListView1.ListItems.Count).ListSubItems.Add , , Chemin
            End If
           
            ' Initialise lpFindFileData (Variable texte uniquement)
            lpFindFileData.cAlternate = String$(14, 0)
            lpFindFileData.cFileName = String$(MAX_PATH, 0)
        Loop Until FindNextFile(hFindFile, lpFindFileData) = 0
    End If
   
    FindClose hFindFile
   
    '---Recherche dans les sous-répertoires---
    hFindFile = FindFirstFile(Chemin & "*.*", lpFindFileData)
    If (hFindFile <> INVALID_HANDLE_VALUE) Then
        Do
            ' Si c'est un répertoire on continu le recherche
            If (lpFindFileData.dwFileAttributes And _
                FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY Then
                ' Extraction du nom du répertoire
                CheminRep = Mid$(lpFindFileData.cFileName, 1, _
                            InStr(1, lpFindFileData.cFileName, Chr$(0)) - 1)
                ' Attention dans les sous-répertoire aux
                ' répertoires . et .. (Retour répertoire parent)
                If (CheminRep <> ".") And (CheminRep <> "..") Then
                    CheminRep = Chemin & CheminRep & ""
                    Rechercher = Rechercher(CheminRep, FichierR, ResultatRecherche)
                End If
            End If
        Loop Until FindNextFile(hFindFile, lpFindFileData) = 0
    End If
   
    FindClose hFindFile
   
    '---Retourne le nombre d'occurrences trouvées---
    Rechercher = ResultatRecherche.Nombre
End Function



Cordialement, Jean-Paul  

______________________________________________________________________

Le Savoir n'a de valeur que s'il est partagé
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
lol Dark, j'avais pas remarqué que tu utilisais encore la notation hongroise pour tes variables! Sais-tu qu'elle tombe en désuétude ? On ne l'utilise guère plus qu'en C je pense et encore, déjà il y a 10 à l'école on nous disait qu'elle était passée de mode.

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
Valtrase, je ne comprend toujours pas pourquoi tu repasse par le Form_Load de ta feuille. Ou alors frmImport n'est pas la feuille ou tu as le bouton cmdSuivant. Sinon pour moi c'est impossible, sans un gros bug dans ton soft.

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #
Messages postés
936
Date d'inscription
lundi 19 janvier 2004
Statut
Membre
Dernière intervention
17 mars 2017
4
Bon me revoilà.
Darksidious ta méthode ne marche pas.
cela refait la même chose.
j'en perds mon latin.
si je prends n'importe quel object sur la Form et que je change l'appel ça repassse par FormLoad
ex:
cmdsuivant.Enabled = True       Là ça marche
frmImport.cmdSuivant.Enabled = True    Là ça ne marche plus et ça repasse par FormLoad

NB:
- mon bouton cmdSuivant appelle un Sub Publique qui elle appelle une fonction 
   Privée, les deux sont dans le même module.

Cordialement, Jean-Paul  
______________________________________________________________________

Le Savoir n'a de valeur que s'il est partagé
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
133
Oulà, c'est pas normal alors !

Ton cmdSuivant est bien situé sur la feuille frmImport ?

Sinon casy : je ne savais pas que la notation hongroise était obsolète ! Elle est remplacée par quoi ? Non car franchement, je préfère largement lire des : "s_sName" ou autre "m_ptrObject" que des "i" ou "j" qui ne disent absolument rien sur la variable !
Messages postés
936
Date d'inscription
lundi 19 janvier 2004
Statut
Membre
Dernière intervention
17 mars 2017
4
Re,
Bon j'ai trouvé l'erreur si erreur il y a
donc en fait tout venais de l'appel de la Form:
Case "Search"
        Dim f1 As New frmImport
        f1.Show vbModal
        Set f1 = Nothing

Un simple frmImport.Show vbModal à résolu mon problème.
D'ou ma nouvelle question avec un appel comme ci-dessus peut-on accéder à notre feuille depuis un module ? et comment.

Cordialement, Jean-Paul  
______________________________________________________________________

Le Savoir n'a de valeur que s'il est partagé
Messages postés
792
Date d'inscription
vendredi 4 mars 2005
Statut
Membre
Dernière intervention
12 juin 2012
5
Salut 218510 valtrase, salut =13557 DARKSIDIOUS, salut 333139 casy,

navré valtrase, ta solution n'en est pas une! Comme le disait =13557 DARKSIDIOUS, pour ta fonction (ou plutôt ta procédure)LancerLaRecherche_API puisse accéder à l'instance de ton formulaire, il faut qu'elle en détienne une référence (reçue en argument, par exemple). Ainsi, elle pourrait la passer à la fonction Rechercher.

La méthode qu'utilisait ce que tu as "corrigé" était justement ce qu'on appelle l'affectation d'une référence à une instance de formulaire, à une variable.
Il faut comprendre
- frmImport comme une classe,
- New frmImport comme l'instanciation d'une classe de type frmImport ,
- Set fl = New frmImport comme l'affectation d'une référence à une instance de la classe frmImport, à la variable fl (qui devient à son tour une référence).

C'est ensuite cette même variable fl qu'il convient de passer, en argument, à la procédure.

Pour infos : quand on écrit frmImport.Show, on instancie implicitement la classe de type frmImport, en sollicitant une méthode de celle-ci (on a donc une instanciation implicite), et VB se charge de créer une variable de référence à cette instance (c'est une référence implicite), qui porte le même nom que le type (ce qui peut devenir embrouillant).

frmImport devient donc une variable de référence implicite à une instance implicite de la classe frmImport. Si le 1er à solliciter frmImport est le module (alors qu'on avait déjà une référence fl), l'instance est re-créée, ré-affichée et on a l'impression de repasser par le Form_Load (cf MSDN, cycles de vie des feuilles Visual Basic) de la classe frmImport, alors qu'on a à faire à une autre instance.

à+

rvblog<sup>n
Je veux ton bien....et je l'aurais....mieux vaut tard...que trop tard!</sup>