Byval ou byref ? (les bases pour newbies)

Soyez le premier à donner votre avis sur cette source.

Vue 6 950 fois - Téléchargée 337 fois

Description

Je vois souvent cette question sur le forum. Voici une réponse que j'espère claire.
Y-a même un Zip avec ces lignes de code !
Vous ètes pas chouchoutés sur vbFrance ??

Conclusion :


Question :
comment faire sortir 2 fichier à une fonction où l'on ne rentre qu'un fichier ? public function(fichier1 As string,...???) de zapping
-----------------------------------------------------------
Ah, voilà un sujet intéressant :
Rassure toi, c'est possible !

Quand tu crées une Sub ou une Function, tu défines des paramètres que tu passes à cette Sub :
Private Function MaSub(ByVal Fichier1 as String, ByVal Fichier2 as String, ...)

Tu auras remarqué le ByVal devant le paramètre : Il dit simplement que tu vas passer la VALEUR de la variable. Avec ByVal, cet échange ne fonctionne que dans un sens : Entrant.
De plus, si ta variable Fichier1 est modifiée dans ta Sub, cette modif sera perdue quand tu en sortiras.

Pour avoir un sens Sortant (pour que ta Sub te renvoie un ou plusieurs paramètres), il suffit :
-- D'utiliser ByRef au lieu de ByVal
Dans ce cas, VB va chercher l'adresse mémoire de la variable et pas seulement son contenu. Maintenant que VB connait l'adresse, quand il va modifier son contenu, il le modifiera pour tout le projet.
-- Par contre, il y a une contrainte : Il faut absolument que la variable que tu passes en Fichier2 (avec ByRef Fichier2 as String) soit dimensionnée dans le code qui appelle la fonction, puisque dans la Sub, VB va rechercher son adresse mémoire. Exemple :
Dans la Sub que tu crées :
Private Function MaSub(ByVal Fichier1 as String, ByRef Fichier2 as String)
Fichier2 = Fichier1
Fichier1 = ""
End Sub

tu vas l'appeler dans ton code, dans Form_Load par exemple :
Private Sub Form_Load ()
Dim MonFichier as String
Dim Destination as String
MonFichier = "Coucou.txt"
Destination = "Je sais pô.txt"
' Affiche le contenu des 2 variables dans le Log (Ctrl-G)
Debug.Print "Avant :"
Debug.Print "Mon fichier : "; MonFichier
Debug.Print "Destination : "; Destination
Call MaSub(MonFichier, Destination)
' Reaffiche le contenu des 2 variables dans le Log
Debug.Print "Après :"
Debug.Print "Mon fichier : "; MonFichier
Debug.Print "Destination : "; Destination
End Sub

Conclusions :
Tu remarqueras
-- que MonFichier n'a pas été vidé et que Destination a bien pris la valeur de MonFichier.

-- aussi que, bien qu'on ait utilisé ByRef pour le deuxième paramètre, on n'es pas obligé de l'appeler pareil dedans et dehors de la Sub : Liberté totale.

-- de l'importance du dimensionnement des variables dans un projet. Je ne saurais que te conseiller de mettre systématiquement un Option Explicit en haut de chaque page de code : Ceci t'impose à dimensionner toutes tes variables. C'est peut-être chiant, mais ça permet de n'en mettre que quand c'est nécessaire (sinon, on se perd vite), et en plus de s'apercevoir de l'importance d'utiliser :
-- des simples "Dim" dans les Sub/Function pour que la variable n'existe que dans cette Sub/Fonction
-- des "Private" dans la partie déclaration de tes formes : Ta variable ne sera visible que dans code de cette forme.
-- des "Public" dans un module (fichier .BAS) lorsque tu veux que cette variable soit visible depuis n'importe quel endroit dans ton projet.
-- des "Static" dans une Sub/Function quand tu veux que la valeur de la variable ne soit pas perdue à la fin, mais qu'elle soit mémorisée entre deux passages dans cette Sub/Function. <-- Très pratique

C'est beau, non ?
Vala

Si vous avez besoin d'éclaircissement, laissez vos questions en dessous, là VVV et j'y répondrais là aussi pour que tout le monde en profite.

Jack

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
70
Aucun rapport avec le sujet de cette code.
Fais des recherches parmi les questions du forum, charge des sources qui manipulent des fichiers, tu sauras tout.
Messages postés
21
Date d'inscription
mardi 21 novembre 2006
Statut
Membre
Dernière intervention
27 décembre 2009

Bonjour,

En clair, comment tu fais pour écrire un chaine dans un fichier .txt a partir d'une textbox ??
J ai essayé avec un module mais j arrive pas a importer ma chaine de la Form !!

Merci d'avance

F92
Messages postés
86
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
9 mars 2006

Merci pour cette explication, j'ai compri maintenant le sens de "ByRef ByVal" qui m'etait inconue jusqu'a present

10/10

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.