zippro4012
Messages postés216Date d'inscriptionmardi 15 juin 2004StatutMembreDernière intervention26 février 20061 18 févr. 2005 à 18:53
C'est simple :
- Avec ByVal, les valeurs seule des variables seronts passées en
paramètres : si la procédure appelée change ces valeur, elles n'auront
pas changé dans la procédure appelante.
- Avec ByRef, les références des variables sont passées en
paramètres : si la procédure appelée change la valeur de ces variables,
elle auronts changé au retour dans la procédure appelante.
Gobillot
Messages postés3140Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention11 mars 201934 19 févr. 2005 à 01:00
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Sub Command1_Click()
Dim x As Long
Dim s As String
x = 123
s = "chaine"
MsgBox "Adresse de x: " & VarPtr(x)
MsgBox "Adresse de s: " & VarPtr(s)
Test x, x, s, s
MsgBox "la valeur de x est modifié: " & x
End Sub
Private Sub Test(x1 As Long, ByVal x2 As Long, s1 As String, ByVal s2 As String)
Dim Z As Long
Dim Z1 As Long
Dim Z2 As Long
Dim Z3 As Long
Dim P As Long
' même adresse que x
MsgBox "Adresse de x1: " & VarPtr(x1)
' adresse différente de x
MsgBox "Adresse de x2: " & VarPtr(x2)
' même adresse que s
MsgBox "Adresse de s1: " & VarPtr(s1)
' adresse différente de s
MsgBox "Adresse de s2: " & VarPtr(s2)
' quand les adresses sont les mêmes ça veut dire que c'est la même variable
' x1 et x sont la même variable avec des noms différents
' quand les adresses sont diffentes ça veut dire que les zones sont différentes
' x2 et x sont 2 variables différentes avec la même valeur
' pour un API c'est différent BYval renvoie un pointeur sur la variable
x2 = VarPtr(x1)
CopyMemory Z, ByVal x2, 4
MsgBox "on retrouve la valeur de x: " & Z
' explications:
' x2 et x1 sont 2 variables différentes
' dans x2 on met l'adresse de x1 donc l'adresse de x puisque c'est la même variable
' ByVal x2 renvoie la valeur qui se trouve à l'adresse contenue dans x2
' l'adresse contenue dans x2 c'est bien celle de x
' donc dans Z on retrouve x
' on peut même modifier x en passant par ByVal x2
' voir le dernier MsgBox
Z = 456
CopyMemory ByVal x2, Z, 4
' en VB l'adresse d'une chaîne est un pointeur sur la chaîne en Unicode
P = VarPtr(s1)
CopyMemory Z, P, 4
MsgBox "toujours Adresse de s1: " & Z
P = Z
CopyMemory Z, ByVal P, 4
MsgBox "pointeur sur s1: " & Z & " = " & StrPtr(s1)
P = Z
CopyMemory Z1, ByVal P, 4
P = P + 4
CopyMemory Z2, ByVal P, 4
P = P + 4
CopyMemory Z3, ByVal P, 4
' REMARQUE: le contenu des zones numériques est inversée
' 680063 - 690061 - 65006E --> hc - ia - en
' API: une chaîne passée avec ByRef est un pointeur sur une chaîne clonée en non Unicode
CopyMemory Z, s1, 4
' ATTENTION: pas de manipulation de chaîne sous peine de perdre la chaîne clonée
' MsgBox "pseudo pointeur sur s1= " & (Z)
' Longueur de la chaîne sur 4 caractères (= 6)
P = Z - 4
CopyMemory Z1, ByVal P, 4
' ensuite contenu de la chaîne
P = Z
CopyMemory Z2, ByVal P, 4
P = Z + 4
CopyMemory Z3, ByVal P, 4
' 6 - 69616863 - 656E --> iahc - en
MsgBox "contenu du clone de s1: " & Hex$(Z1) & " - " & Hex$(Z2) & " - " & Hex$(Z3)
' API: une chaîne passée avec ByVal est directement l'adresse de la chaîne clonée
P = Z
CopyMemory Z, ByVal s1, 4
MsgBox "contenu du clone de s1: " & Hex$(Z) '69616863
' comment l'API peut elle modifier une chaîne alors qu'elle travaille sur un clone ?
' il semblerait que VB intervient et remodifie la chaîne d'origine
cs_Jack
Messages postés14007Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201578 19 févr. 2005 à 15:28
Salut
Si tu avais tapé ces mots dans la recherche, tu serais tombé sur cette source spécialement déposée pour y répondre, alors un peu de courage, fait des recherches avant de poser ce genre de questions : http://www.vbfrance.com/code.aspx?id=7081
Vala
Jack
NB : Je ne répondrai pas aux messages privés
Le savoir est la seule matière qui s'accroit quand on la partage. (Socrate)
cs_CanisLupus
Messages postés3757Date d'inscriptionmardi 23 septembre 2003StatutMembreDernière intervention13 mars 200618 19 févr. 2005 à 17:21
A savoir, question différences entre vb6 et vb.net :
en vb6, par défaut les parametres sont passés ByRef
en vb.net, par défaut les parametres sont passés ByVal
Dans tous les cas, il faut mieux préciser le mode de transmission des valeurs pour éviter les surprises.
Loup Gris
Vous n’avez pas trouvé la réponse que vous recherchez ?
ludovicanceaux
Messages postés440Date d'inscriptionmardi 21 octobre 2003StatutMembreDernière intervention 6 mai 2010 20 févr. 2005 à 17:05
Car en fait moi je demande ca car en fait j'orai voulu appelé un procédure ki se trouve sur un module ke j'ai fai, et importer dc ds cette procédure la structure k'il y a sur ma form de ce style:
Structure Fiche
Dim DateCréation
As
String
Dim Nom
As
String
Dim NomOriginale
As
String
Dim Acteurs
As
String
Dim Réalisateur
As
String
Dim Année
As
String
Dim Durée
As
String
Dim Genre
As
String
Dim Nationalité
As
String
Dim Pour
As
String
Dim Photo
As
String
Dim Avis
As
String
Dim Histoire
As
String
Dim Disponible
As
String
Dim NbCDS
As
String
Dim Numéro
As
String
Dim Support
As
String
End
Structure
Dim Structure_Fiche
As Fiche
et en fait le module doit me rapporter les différentes valeurs k'il trouve, ds ma structure de ma form,
Dc ds ma form je met:
Module_Allociné.Aspi_GaleriePhoto(
Structure_Fiche,
Me.TextBox_Adresse.Text)
et ds mon module je dois mettre si je compren bien:
Public
Sub Aspi_GaleriePhoto(
ByRef MyStructure
As Gestion_dune_vidéothéque.Form_Insérer1sur3.Fiche,
ByVal Adresse
As
String)
et non:
Public
Sub Aspi_GaleriePhoto(
ByVal MyStructure
As Gestion_dune_vidéothéque.Form_Insérer1sur3.Fiche,
ByVal Adresse
As
String)