valtrase
Messages postés937Date d'inscriptionlundi 19 janvier 2004StatutMembreDernière intervention 9 mai 2022
-
22 sept. 2006 à 20:15
rvblog
Messages postés792Date d'inscriptionvendredi 4 mars 2005StatutMembreDernière intervention12 juin 2012
-
25 sept. 2006 à 17:07
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
______________________________________________________________________
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 22 sept. 2006 à 20:31
" ... 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 #
valtrase
Messages postés937Date d'inscriptionlundi 19 janvier 2004StatutMembreDernière intervention 9 mai 20223 22 sept. 2006 à 21:09
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
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 22 sept. 2006 à 21:27
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 #
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 22 sept. 2006 à 21:29
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 #
valtrase
Messages postés937Date d'inscriptionlundi 19 janvier 2004StatutMembreDernière intervention 9 mai 20223 23 sept. 2006 à 15:02
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.
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 23 sept. 2006 à 15:20
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 !
valtrase
Messages postés937Date d'inscriptionlundi 19 janvier 2004StatutMembreDernière intervention 9 mai 20223 24 sept. 2006 à 01:18
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.
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>