/ Forside / Teknologi / Udvikling / VB/Basic / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
VB/Basic
#NavnPoint
berpox 2425
pete 1435
CADmageren 1251
gibson 1230
Phylock 887
gandalf 836
AntonV 790
strarup 750
Benjamin... 700
10  tom.kise 610
ByVal vs. ByRef?
Fra : Stefan Kristensen


Dato : 18-11-04 12:24

Hej NG.

Jeg mener selv jeg ved hvad forskellen er på at bruge ByVal og ByRef i
deklarationen af en sub / proc. Derfor blev jeg noget forvirret da jeg fik
en .bas fil med deklarationerne på nogle kald til en ekstern dll fil skrevet
i C. I disse deklarationer er alle parametrer defineret so ByVal, men
alligevel indeholder variablene de rigtige værdier efter kaldet.
Hvordan kan det lade sig gøre?

mvh
Stefan



 
 
Morten Larsen (19-11-2004)
Kommentar
Fra : Morten Larsen


Dato : 19-11-04 20:32

Foreskellen på ByVal og ByRef er:

ByVal = Opretter en helt ny variabel i ram, til lagring af data.
ByRef = Deler variabel med den kaldende funktion.

Eks.:

Public Function TestByRef(ByVal InputStr As String, ByRef Chars As Integer)
As Boolean
On Error GoTo Err
Chars = Len(InputStr)
TestByRef = True
Exit Function
Err:
TestByRef = False
End Function

Private Sub KaldTestByRef()

Dim Chars As Integer ' Her deklareres variabelen der skal indeholde
ByRef returet fra kaldet.
Dim Resultat As Boolean

Chars = 35 ' Chars tildeles værdien 35

'Kald functionen
Resultat = TestByRef("Streng til test", Chars)
'Eftersom vi har ByRef så overføres værdien til den variabel vi har
deklareret her i denne sub, fra funktionen TestByRef.

If Resultat Then Me.Caption = Chars ' Her skulle gerne være værdien 15.
End Sub


Man kan sige at ByRef bruges hvis du skal have mere end 1 værdi retur fra en
function.

Med ByVal vil du altid have dine "orginale" variabler uændrede af kaldet.
Med ByRef kan kaldet ændre på de variabler du bruger i kaldet.

Som hoved regl bør man kun bruge ByVal hvis de eksisterende variabler ikke
må ændres
af det nye kald. Du får den hurtigste afvikling af koden med ByRef da der
ikke skal
bruges resourcer på at oprette nye variabler i dit kald.

Håber det var til at forstå :)

//Morten

"Stefan Kristensen" <stefank@asg.com> skrev i en meddelelse
news:419c8653$0$33735$14726298@news.sunsite.dk...
> Hej NG.
>
> Jeg mener selv jeg ved hvad forskellen er på at bruge ByVal og ByRef i
> deklarationen af en sub / proc. Derfor blev jeg noget forvirret da jeg fik
> en .bas fil med deklarationerne på nogle kald til en ekstern dll fil
> skrevet
> i C. I disse deklarationer er alle parametrer defineret so ByVal, men
> alligevel indeholder variablene de rigtige værdier efter kaldet.
> Hvordan kan det lade sig gøre?
>
> mvh
> Stefan
>
>



Stefan Kristensen (20-11-2004)
Kommentar
Fra : Stefan Kristensen


Dato : 20-11-04 08:12

> Foreskellen på ByVal og ByRef er:
> ByVal = Opretter en helt ny variabel i ram, til lagring af data.
> ByRef = Deler variabel med den kaldende funktion.
Jeg var måske ikke helt præcis med mit spm. Jeg ved godt hvad forskellen på
ByVal og ByRef er. Det er derfor jeg blev forviret over følgende:

Public Declare Function XYZ Lib "EnDllSkrevetIC.dll" (ByVal Text as String)
As Integer

Private Sub KaldXYZ()
Dim s As String
Dim r as Integer

s = "Noget text"
r = xyz(s)
End Sub

Efter kaldet ligger returværdien fra XYZ i r (som den skal), men s
indeholder ikke "Noget text", men "Noget helt andet".
Hvordan kan det lade sig gøre når Text er defineret som ByVal? Og tro mig:
Det er ByVal! Hvis jeg ændrer deklarationen ti ByRef får jeg en runtimefejl.

c",)
Stefan



Tomas Christiansen (21-11-2004)
Kommentar
Fra : Tomas Christiansen


Dato : 21-11-04 01:08

Stefan Kristensen skrev:
> Public Declare Function XYZ Lib "EnDllSkrevetIC.dll" (ByVal Text as
String)
....
> Efter kaldet ligger returværdien fra XYZ i r (som den skal), men s
> indeholder ikke "Noget text", men "Noget helt andet".

Det er fordi en streng ikke kan værdi-overføres, og bliver derfor altid
variabel-overført. Det samme gælder brugerdefinerede typer.
Hvis du angiver ByRef, sender du en pointer til en pointer til din streng,
og den går ikke (her).

Prøv at søge efter dette på Google:
"visual basic 6" byref byval declare dll site:microsoft.com
Klik på det første hit "Declaring a DLL Procedure (Visual Basic 6)" og led
efter teksten "String arguments are a special case". Læs dette afsnit. Læs
også gerne hele artiklen

-------
Tomas


Stefan Kristensen (21-11-2004)
Kommentar
Fra : Stefan Kristensen


Dato : 21-11-04 12:08

>> Public Declare Function XYZ Lib "EnDllSkrevetIC.dll" (ByVal Text as
> String)
> ...
>> Efter kaldet ligger returværdien fra XYZ i r (som den skal), men s
>> indeholder ikke "Noget text", men "Noget helt andet".
>
> Det er fordi en streng ikke kan værdi-overføres, og bliver derfor altid
> variabel-overført. Det samme gælder brugerdefinerede typer.
> Hvis du angiver ByRef, sender du en pointer til en pointer til din streng,
> og den går ikke (her).
>
> Prøv at søge efter dette på Google:
> "visual basic 6" byref byval declare dll site:microsoft.com
> Klik på det første hit "Declaring a DLL Procedure (Visual Basic 6)" og led
> efter teksten "String arguments are a special case". Læs dette afsnit. Læs
> også gerne hele artiklen
Jeg takker for 'linket' og især dit korte resume
Mvh
Stefan



Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409079
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste