Pourqoi cette fonction ne retourne de valeur de variable?

Monocle2 Messages postés 13 Date d'inscription lundi 24 janvier 2011 Statut Membre Dernière intervention 19 février 2011 - 10 févr. 2011 à 20:30
Monocle2 Messages postés 13 Date d'inscription lundi 24 janvier 2011 Statut Membre Dernière intervention 19 février 2011 - 11 févr. 2011 à 00:06
Voici mon problème, j'ai cette fontion:

Public Function Lire(ByVal sender As System.Object, ByVal e As System.EventArgs, ByVal Section As String, ByVal Clé As String, ByVal Valeur As String) As String
Dim sb As New StringBuilder(200)
Dim Ret As Integer = GetPrivateProfileString(Section, Clé, Valeur, sb, 200, "C:\Penses-y.ini")
Valeur = sb.ToString
MsgBox("Valeur =" & Valeur)
MsgBox(sb.ToString)
Return Valeur


End Function

Et voici mon appel:

Lire(sender, e, Section, Clé, Valeur)



À la suite de cet appel la variable valeur est vide, pourtant à l'intérieur de la fonction elle

a bel et bien une valeur

Quelqu'un pourrait me dire ce qui se passe?

Merci à l'avance!

6 réponses

CGSI3 Messages postés 416 Date d'inscription vendredi 22 février 2008 Statut Membre Dernière intervention 7 janvier 2018 1
10 févr. 2011 à 21:03
Bonjour Monocle02,

, ByVal Valeur As String

ByRef a la place de byval

http://www.vbfrance.com/tutoriaux/BYREF-BYVAL-SANS-DOULEUR_991.aspx

Je n'ai pas trop épluché ton code mais c'est surement cela.

MsgBox("Valeur =" & Valeur)
MsgBox(sb.ToString)
>
MsgBox("Valeur =" & Valeur & vbcrlf & sb.ToString)
(Cela te permet d'inserer des sauts de lignes mais ne connaissant
pas StringBuilder ce n'est peut etre pas ce que tu veux faire)

Bonne soirée et
Bonne Prog CGSI3
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
10 févr. 2011 à 21:19
TU as 2 soucis dans ton code.

1er : Les paramètres sont toujours passés par défaut par valeur (ByVal). De fait, à l'intérieur de la fonction tu travaille pas avec le paramètre mais une copie de celui-ci. C'est copie qui est modifiée dans la fonction et détruite dès la sortie de fonction. Si tu veux modifier directement le paramètre, il faut qu'il soit passé par référence (adresse) en utilisant ByRef.

2nd : Tu utilise une fonction. Une fonction à une valeur de retour. Une fonction s'utilise ainsi :
ValeurRetour = MaFonction(....)
D'ailleur tu utilise le rincipe puisque dans ta fonction tu met Return Valeur.


Alors, soit tu utilse la fonction avec la valeur de retour pas besoin du paramètre valeur dans ce cas là :
Public Function Lire(ByVal sender As System.Object, ByVal e As System.EventArgs, ByVal Section As String, ByVal Clé As String) As String
Dim sb As New StringBuilder(200)
Dim valeur as string
Dim Ret As Integer = GetPrivateProfileString(Section, Clé, Valeur, sb, 200, "C:\Penses-y.ini")
Valeur = sb.ToString
MsgBox("Valeur =" & Valeur)
MsgBox(sb.ToString)
Return Valeur


End Function 

Appel :
Valeur = Lire(sender, e, Section, Clé) 

Soit tu retourne la valeur par le paramètre, pas besoin de function dans ce cas là, une sub suffit :
Public Sub Lire(ByVal sender As System.Object, ByVal e As System.EventArgs, ByVal Section As String, ByVal Clé As String, ByRef Valeur As String)
Dim sb As New StringBuilder(200)
Dim Ret As Integer = GetPrivateProfileString(Section, Clé, Valeur, sb, 200, "C:\Penses-y.ini")
Valeur = sb.ToString
MsgBox("Valeur =" & Valeur)
MsgBox(sb.ToString)
End Sub


[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
0
CGSI3 Messages postés 416 Date d'inscription vendredi 22 février 2008 Statut Membre Dernière intervention 7 janvier 2018 1
10 févr. 2011 à 21:35
Désolé pour le doublon Casy,

Par contre c'est pas dans le sujet mais quel est l'intéret d'une tel classe: StringBuilder
" ne peut être modifiée après sa création par ajout, suppression, remplacement ou insertion de caractères "
voici sa propriétée semble t'il
Pourquoi tu l'utilise ? Quel est son interet ici?

Bonne prog CGSI3
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
10 févr. 2011 à 21:56
L'interet de la classe StringBuilder est de pouvoir créer une "string" mutable, c'est à dire modifiable après sa création (contrairement à ce que tu écrit, mauvais copier/coller).

En reprenant le code de Monocle2, en réalité, tu crée une "chaine de caractère" (c'est pas vraiment une chaine, mais pas non plus un tableau de caractères, c'est objet hybride entre les 2) de longueur nulle mais pouvant avoir une longueur maxi de 200 caractères. C'est à dire que la zone mémoire pour pouvoir contenir les 200 caractères est déjà réservée même si la chaine est vide. Cela est nécessaire pour les api windows car celle-ci ne reçoive qu'une adresse mémoire et remplisse la zone correspondante avec les caractères qu'elles doivent retournées. Il faut donc que cet espace mémoire soit déjà réservé car sinon elles vont écrire sur des zone correspondant à d'autres variables.

On pourrait très bien faire cela avec une simple string, mais cela nécessiterait de créer une string non vide qu'il faudrait, par exemple, initialiser avec 200 espaces (ou tout autre caractère) pour que la zone mémoire correspondante soit déjà réservée (et en l'occurrence déjà rempli par la string) à l'appel de l'api. Et il faudrait surtout, au retour, redécouper la string pour ne garder que la partie effectivement retournée par l'api et s'affranchir du reste des caractères venant de l'initialisation préalable.


[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
CGSI3 Messages postés 416 Date d'inscription vendredi 22 février 2008 Statut Membre Dernière intervention 7 janvier 2018 1
10 févr. 2011 à 22:05
Un Grand Merci Casy,
(J'ai mal lu l'aide microsoft)
J'ai du boulot avec ceci pour toute ma soirée.
C'est très interessant.

Bonne soirée CGSI3
0
Monocle2 Messages postés 13 Date d'inscription lundi 24 janvier 2011 Statut Membre Dernière intervention 19 février 2011
11 févr. 2011 à 00:06
Salut,
Merci beaucoup Casy, ça fonctionne c'était bien ByVal le problème...

Monocle2
Bonne soirée ou plutôt bonne nuit!
0
Rejoignez-nous