/ 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
[Vb6] Reference til .dll under udvikling
Fra : Jesper Stocholm


Dato : 08-06-02 17:04

Jeg har lavet en lille dll [1]. Denne dll vil jeg nu gerne teste, og jeg
har lavet en lille test-applikation, der ved klik på en knap skulle sende
en tekst-streng til min dll-kode, der så gerne skulle svare tilbage med
en modificeret streng. Jeg har tidligere herinde fået at vide, at den
"gode" måde at teste koden i en dll (uden at skulle ind i dll-hell) er at
tilføje dll-projektet til min test-applikation via File/Add Project/
Dette har jeg så gjort, og mit dll-projekt kommer fint nok til syne, og
klassefilen fra min dll er også fint vist.

Men ... hvordan bruger jeg koden i min dll-projekt ?

Jeg lavede testkoden

Private Sub Command1_Click()
Dim str As String
Dim strTmp As String
strTmp = Chr(8) & "jesper" & Chr(10)
str = Txt2Hex.convertTxt2Hex(strTmp)
End Sub

i den tro, at jeg kunne referere til metoder i mit dll-projekt på samme
måde som man refererer til kode i andre forms ... men det virker ikke.

Hvordan gør jeg ?

Hvis nogen skulle have lyst til at kigge på koden, så ligger den på
http://vb.stocholm.dk/

:)

På forhånd mange tak ...

[1] Koden er

Public Function ConvertChars(strString As String) As String
Dim i As Integer
Dim strChar As String
Dim strStringTmp As String
Dim charBool As Boolean
strStringTmp = ""
For i = 0 To Len(strString) - 1
strChar = Mid(strString, i + 1, 1)
charBool = validateChar(Asc(strChar))
If charBool Then
strStringTmp = strStringTmp & strChar
Else
strStringTmp = strStringTmp & "[0x" & Hex(Asc(strChar)) & "]"
End If
Next
ConvertChars = strStringTmp
End Function

Private Function validateChar(intCharAt As Integer)
validateChar = False

If intCharAt >= 8 And intCharAt <= 14 Then
validateChar = True
End If
End Function



--
Jesper Stocholm
http://stocholm.dk
http://asp.stocholm.dk
Svar til gruppen og ikke til mig privat pr. email :|

 
 
Bjarke Walling Peter~ (08-06-2002)
Kommentar
Fra : Bjarke Walling Peter~


Dato : 08-06-02 18:44

Jesper Stocholm skrev:
> Jeg har lavet en lille dll [1]. Denne dll vil jeg nu gerne teste, og jeg
> har lavet en lille test-applikation, der ved klik på en knap skulle sende
> en tekst-streng til min dll-kode, der så gerne skulle svare tilbage med
> en modificeret streng. Jeg har tidligere herinde fået at vide, at den
> "gode" måde at teste koden i en dll (uden at skulle ind i dll-hell) er at
> tilføje dll-projektet til min test-applikation via File/Add Project/
> Dette har jeg så gjort, og mit dll-projekt kommer fint nok til syne, og
> klassefilen fra min dll er også fint vist.
>
> Men ... hvordan bruger jeg koden i min dll-projekt ?
[snip]

Klik på din klasse (convertTxt2Hex) og sæt propertien Instancing til 5 -
MultiUse ... ellers er det en privat klasse, som kun andre klasser og
moduler i din dll-fil kan se og bruge.
Marker dit testprojekt (Project1) og gå op i menuen Project og klik
References ... Klik checkboksen for dit dll-projekt til (den hvor der
står Txt2Hex). Skriv følgende kode i dit testprojekt:

Private Sub Command1_Click()
Dim str As String
Dim strTmp As String
Dim dll As Txt2Hex.convertTxt2Hex
Set dll = New Txt2Hex.convertTxt2Hex
strTmp = Chr(8) & "jesper" & Chr(10)
str = dll.ConvertChars(strTmp)
End Sub

.... og kør det. Nu skulle det virke.
Alternativt kan du også gøre noget andet - så du ikke skal klikke
projektet på i References. Skriv blot følgende kode i dit testprojekt:

Private Sub Command1_Click()
Dim str As String
Dim strTmp As String
Dim dll As Object
Set dll = CreateObject("Txt2Hex.convertTxt2Hex")
strTmp = Chr(8) & "jesper" & Chr(10)
str = dll.ConvertChars(strTmp)
End Sub

Ved denne metode bliver dll-filen loadet runtime. Derfor kommer der
heller ikke en liste over funktionerne der er i klassen convertTxt2Hex,
når man skriver dll., som der vil gøre i det førstnævnte tilfælde.

Mvh. Bjarke


--
Posted via Mailgate.ORG Server - http://www.Mailgate.ORG

Jesper Stocholm (08-06-2002)
Kommentar
Fra : Jesper Stocholm


Dato : 08-06-02 20:39

Bjarke Walling Petersen wrote in
news:80f0d3ff6d94d45d82d5431054d2ebaa.42843@mygate.mailgate.org:

> Jesper Stocholm skrev:
>> Jeg har lavet en lille dll [1]. Denne dll vil jeg nu gerne teste, og
>> jeg har lavet en lille test-applikation, der ved klik på en knap
>> skulle sende en tekst-streng til min dll-kode, der så gerne skulle
>> svare tilbage med en modificeret streng. Jeg har tidligere herinde
>> fået at vide, at den "gode" måde at teste koden i en dll (uden at
>> skulle ind i dll-hell) er at tilføje dll-projektet til min
>> test-applikation via File/Add Project/ Dette har jeg så gjort, og mit
>> dll-projekt kommer fint nok til syne, og klassefilen fra min dll er
>> også fint vist.
>>
>> Men ... hvordan bruger jeg koden i min dll-projekt ?
> [snip]
>
> Klik på din klasse (convertTxt2Hex) og sæt propertien Instancing til 5
> - MultiUse ... ellers er det en privat klasse, som kun andre klasser
> og moduler i din dll-fil kan se og bruge.
> Marker dit testprojekt (Project1) og gå op i menuen Project og klik
> References ... Klik checkboksen for dit dll-projekt til (den hvor der
> står Txt2Hex). Skriv følgende kode i dit testprojekt:
>
> Private Sub Command1_Click()
> Dim str As String
> Dim strTmp As String
> Dim dll As Txt2Hex.convertTxt2Hex
> Set dll = New Txt2Hex.convertTxt2Hex
> strTmp = Chr(8) & "jesper" & Chr(10)
> str = dll.ConvertChars(strTmp)
> End Sub

ok ... det var ikke helt det jeg mente. Selve koden i min dll er endnu
ikke færdig ... så jeg er ude efter at kunne teste min kode uden at
skulle kompilere min dll for hver bug jeg finder. Det var dette, som
tilføjelsen af mit projekt skulle kunne gøre for mig ... jeg kan blot
ikke få det til at virke.

Måske kan spørgsmålet stilles anderledes:

Hvordan tester man koden i en dll i udviklingsfasen ... uden at skulle
lave en ny kompileret dll for hver fejl der er rettet/feature der er lagt
til ?

Tak for din tid ... :)

--
Jesper Stocholm
http://stocholm.dk
http://asp.stocholm.dk
Svar til gruppen og ikke til mig privat pr. email :|

Kim Pedersen (08-06-2002)
Kommentar
Fra : Kim Pedersen


Dato : 08-06-02 21:16

Hej Jesper

> ok ... det var ikke helt det jeg mente. Selve
> koden i min dll er endnu ikke færdig ... så
> jeg er ude efter at kunne teste min kode uden
> at skulle kompilere min dll for hver bug jeg
> finder. Det var dette, som tilføjelsen af mit
> projekt skulle kunne gøre for mig ... jeg kan blot
> ikke få det til at virke.
>
> Måske kan spørgsmålet stilles anderledes:
>
> Hvordan tester man koden i en dll i
> udviklingsfasen ... uden at skulle lave en ny
> kompileret dll for hver fejl der er rettet/feature
> der er lagt til ?

Fra den kode du skriver, kan jeg ikke se, om du også har lavet en
reference til din class fil. Du har kon dimensioneret de to variabler
str og strTmp. Ud fra koden kan jeg se, at du har oprettet dit objekt
under navnet Txt2Hex. Har du et sted i dit program skrevet f.eks. Dim
Txt2Hex As New cMinCls (hvor cMinCls er navnet på Class filen)??? Ellers
skal du sørge for at gøre dette. Og husk også at slette dit objekt fra
hukommelsen igen med Set Txt2Hex = Nothing i slutningen af koden.
F.eks.:

Private Sub Command1_Click()
Dim str As String
Dim strTmp As String
Dim Txt2Hex As New cMinCls
strTmp = Chr(8) & "jesper" & Chr(10)
str = Txt2Hex.convertTxt2Hex(strTmp)
Set Txt2Hex = Nothing
End Sub

Venlig hilsen/Best regards
Kim Pedersen, vbCode Magician
http://www.vbcodemagician.dk



Bjarke Walling Peter~ (08-06-2002)
Kommentar
Fra : Bjarke Walling Peter~


Dato : 08-06-02 22:58

Jesper Stocholm skrev:
> ok ... det var ikke helt det jeg mente. Selve koden i min dll er endnu
> ikke færdig ... så jeg er ude efter at kunne teste min kode uden at
> skulle kompilere min dll for hver bug jeg finder. Det var dette, som
> tilføjelsen af mit projekt skulle kunne gøre for mig ... jeg kan blot
> ikke få det til at virke.
>
> Måske kan spørgsmålet stilles anderledes:
>
> Hvordan tester man koden i en dll i udviklingsfasen ... uden at skulle
> lave en ny kompileret dll for hver fejl der er rettet/feature der er lagt
> til ?
>
> Tak for din tid ... :)

[Jeg kunne ikke svare på andre beskeder end denne af en underlig grund,
så det var min eneste mulighed for at svare.]

Det var nu også det jeg havde svaret på ... hvis det ikke virker undrer
det mig, for jeg kunne godt selv få det til at virke - selvfølgelig uden
at compilere. :)

Mvh. Bjarke


--
Posted via Mailgate.ORG Server - http://www.Mailgate.ORG

Jesper Stocholm (08-06-2002)
Kommentar
Fra : Jesper Stocholm


Dato : 08-06-02 23:02

Bjarke Walling Petersen wrote in
news:b173bef88f88bfd2b23769b13692b083.42843@mygate.mailgate.org:

> Jesper Stocholm skrev:
>> ok ... det var ikke helt det jeg mente. Selve koden i min dll er
>> endnu ikke færdig ... så jeg er ude efter at kunne teste min kode
>> uden at skulle kompilere min dll for hver bug jeg finder. Det var
>> dette, som tilføjelsen af mit projekt skulle kunne gøre for mig ...
>> jeg kan blot ikke få det til at virke.
>>
>> Måske kan spørgsmålet stilles anderledes:
>>
>> Hvordan tester man koden i en dll i udviklingsfasen ... uden at
>> skulle lave en ny kompileret dll for hver fejl der er rettet/feature
>> der er lagt til ?
>>
>> Tak for din tid ... :)
>
> [Jeg kunne ikke svare på andre beskeder end denne af en underlig
> grund, så det var min eneste mulighed for at svare.]
>
> Det var nu også det jeg havde svaret på ... hvis det ikke virker
> undrer det mig, for jeg kunne godt selv få det til at virke -
> selvfølgelig uden at compilere. :)

Det var faktisk Kims metode jeg ledte efter ... nemlig så jeg kunne bruge
den rå kode i min dll (fra klasse-filen) uden at skulle registrere dll
eller lignende. Det virker nu fortrinligt, så tak til jer begge to.

En sidste ting: min dll skal bruges på et website, så det er meget
vigtigt, at den kan bruges af flere brugere på samme tid. Er der noget
jeg skal være opmærksom på i den forbindelse ... eller kan en dll
automatisk bruges af flere brugere på samme tid ?

:)

--
Jesper Stocholm
http://stocholm.dk
http://asp.stocholm.dk
Svar til gruppen og ikke til mig privat pr. email :|

Jesper Stocholm (10-06-2002)
Kommentar
Fra : Jesper Stocholm


Dato : 10-06-02 09:54

"Kim Pedersen" <codemagician@nospam.get2net.dk> wrote in message news:<adtoij$7id$1@sunsite.dk>...
> Hej Jesper
[snip]
> Fra den kode du skriver, kan jeg ikke se, om du også har lavet en
> reference til din class fil. Du har kon dimensioneret de to variabler
> str og strTmp. Ud fra koden kan jeg se, at du har oprettet dit objekt
> under navnet Txt2Hex. Har du et sted i dit program skrevet f.eks. Dim
> Txt2Hex As New cMinCls (hvor cMinCls er navnet på Class filen)??? Ellers
> skal du sørge for at gøre dette. Og husk også at slette dit objekt fra
> hukommelsen igen med Set Txt2Hex = Nothing i slutningen af koden.
> F.eks.:
>
> Private Sub Command1_Click()
> Dim str As String
> Dim strTmp As String
> Dim Txt2Hex As New cMinCls
> strTmp = Chr(8) & "jesper" & Chr(10)
> str = Txt2Hex.convertTxt2Hex(strTmp)
> Set Txt2Hex = Nothing
> End Sub

som fortalt tidligere, så virkede dette perfekt ... og også de andre
metoder til at referere til den nye dll fra mit vb-projekt.

Jeg har nu kompilet og registreret dll'en på min webserver, og jeg
skal nu bruge den i min ASP-applikation. Jeg instatierer min dll via
Server.Createobject, og det ser indledende ud til at virke fint ...
med intellisense og alt muligt :)

Men: Når jeg afvikler koden:

01 <%@Language="VBScript"%>
02    option explicit
03    dim dll
04    set dll = server.CreateObject("Txt2HexConv.txt2Hex")
05    dim strTmp,str
06    strTmp = chr(7) & "jesper" & chr(19)
07    str = dll.ConvertChars(strTmp)
08 %>
09
10 <html>
11    <head><title>my new dll</title></head>
12    <body>
12       <span><% = str %></span>
13    </body>
14 </html>

Får jeg fejlen:

Error Type:
Microsoft VBScript runtime (0x800A000D)
Type mismatch: 'ConvertChars'
/desktop/conv.asp, line 7

.... hvilket jeg ikke forstår. Den næsten identiske kode i ren VB

Dim dll As New Txt2HexConv.txt2Hex
Set dll = New Txt2HexConv.txt2Hex
Dim str As String
str = Chr(7) & "jesper" & Chr(19)
MsgBox dll.ConvertChars(str)

virker uden problemer.

Mit dll-projekt hedder "Txt2HexConv" og min klassefil hedder "txt2Hex"
[1]

Har I nogen idéer til, hvad der går galt ?


mvh

Jesper Stocholm
http://stocholm.dk





[1] Koden i min klassefil er:
Public Function ConvertChars(strString As String) As String
Dim i As Integer
Dim strChar As String
Dim strStringTmp As String
Dim charBool As Boolean
strStringTmp = ""
charBool = False
For i = 0 To Len(strString) - 1
strChar = Mid(strString, i + 1, 1)
charBool = validateChar(Asc(strChar))
If charBool Then
strStringTmp = strStringTmp & strChar
Else
strStringTmp=strStringTmp&"[0x"&Hex(Asc(strChar))&"]"
End If
Next
ConvertChars = strStringTmp
End Function

Private Function validateChar(intCharAt As Integer)
Dim vBool As Boolean
vBool = False

If intCharAt >= 9 And intCharAt <= 14 Then
vBool = True
End If

If intCharAt >= 19 And intCharAt <= 21 Then
vBool = True
End If

If intCharAt = 27 Then
vBool = True
End If

If intCharAt >= 30 And intCharAt <= 126 Then
vBool = True
End If

If intCharAt = 128 Then
vBool = True
End If

If intCharAt >= 130 And intCharAt <= 140 Then
vBool = True
End If

If intCharAt = 142 Then
vBool = True
End If

If intCharAt >= 145 And intCharAt <= 156 Then
vBool = True
End If

If intCharAt >= 158 And intCharAt <= 172 Then
vBool = True
End If

If intCharAt >= 174 And intCharAt <= 254 Then
vBool = True
End If
validateChar = vBool
End Function

Jesper Stocholm (10-06-2002)
Kommentar
Fra : Jesper Stocholm


Dato : 10-06-02 15:31

Jesper Stocholm wrote in
news:51db3fc1.0206100054.3396e97@posting.google.com:

jeg fandt en løsning.

> Public Function ConvertChars(strString As String) As String

jeg indsatte et ByVal i input-erklæringen i min funktion ... og nu virker
det som det skal.

:)

--
Jesper Stocholm
http://stocholm.dk
http://asp.stocholm.dk
Svar til gruppen og ikke til mig privat pr. email :|

Tomas Christiansen (10-06-2002)
Kommentar
Fra : Tomas Christiansen


Dato : 10-06-02 21:34

Jesper Stocholm skrev:
> jeg fandt en løsning.
>
> > Public Function ConvertChars(strString As String) As String
>
> jeg indsatte et ByVal i input-erklæringen i min funktion ... og nu
virker
> det som det skal.

....og ved du også _hvorfor_ det nu virker (og dermed hvorfor det ikke
virkede), så du undgår lignende problemer i fremtiden?

-------
Tomas


Jesper Stocholm (10-06-2002)
Kommentar
Fra : Jesper Stocholm


Dato : 10-06-02 23:07

Tomas Christiansen wrote in news:ae32fo$2q2g$1@news.cybercity.dk:

> Jesper Stocholm skrev:
>> jeg fandt en løsning.
>>
>> > Public Function ConvertChars(strString As String) As String
>>
>> jeg indsatte et ByVal i input-erklæringen i min funktion ... og nu
> virker
>> det som det skal.
>
> ...og ved du også _hvorfor_ det nu virker (og dermed hvorfor det ikke
> virkede), så du undgår lignende problemer i fremtiden?

nej ... det må jeg indrømme ... det er noget med, at ByVal overfører den
eksakte værdi af variablen ... hvorimod ByRef "kun" overfører en pointer*
til variablen ... men hvorfor det virker er jeg ikke helt klar over.

Hvis du kan klargøre det for mig, så vil jeg blive meget glad.

:)

--
Jesper Stocholm
http://stocholm.dk
http://asp.stocholm.dk
Svar til gruppen og ikke til mig privat pr. email :|

Tomas Christiansen (10-06-2002)
Kommentar
Fra : Tomas Christiansen


Dato : 10-06-02 23:38

Jesper Stocholm skrev:
> nej ... det må jeg indrømme ... det er noget med, at ByVal overfører
den
> eksakte værdi af variablen ... hvorimod ByRef "kun" overfører en
pointer*
> til variablen ... men hvorfor det virker er jeg ikke helt klar over.
>
> Hvis du kan klargøre det for mig, så vil jeg blive meget glad.

Da jeg skimmede gennem din kode, anede det mig, at der er en del ting
omkring VB, som du ikke er klar over.

Dit konkrete problem er, at i ASP's har man kun datatypen Variant,
hvorimod man i VB, som oftest, vil undgå at bruge typen Variant, men
hellere vil bruge "stærke" typer som String, Long og Double.

Nå du fra ASP kalder en procedure eller funktion i en DLL, som har
f.eks. en Long parameter:

Public Sub Proc1 (ByVal Par1 As Long)

som du fra ASP kalder nogenlunde sådan her:

Dim MinPar1
MinPar1 = 123
MinDLL.Proc1 MinPar1

Så vil der, idet parameteren værdioverføres (dvs. ByVal), blot blive
konverteret fra heltalsværdien i Variant-variablen MinPar1 til den
tilsvarende heltalsværdi i Long-variablen Par1. Denne konvertering
frembyder ikke det store problem.

Hvis du derimod har en procedure, med en variabel-overført parameter
(ByRef eller intet er angivet):

Public Sub Proc2 (ByRef Par1 As Long)

Så får du problemer, når du kalder Proc2 på samme måde som Proc1
kaldes ovenfor.

Idet det ikke er VÆRDIEN i MinPar1, som skal overføres til Proc2, men
REFERENCEN til det sted i lageret, hvor MinPar1's data rent faktisk
ligger gemt, går det galt hvis datatyperne ikke er NØJAGTIG ens. Og
det er en Long og en Variant(Long) ikke.

Løsningen, hvis man virkelig har brug for at variabel-overføre, er
derfor enkel: Brug mindste fællesnævner, nemlig datatypen Variant.

Du kan eksempelvis lave ASP-kompatible versioner af dine rutiner, som
denne Proc2_ASP:

Public Sub Proc2_ASP (ByRef Par1 As Variant)

Når blot datatypen i VB er Variant, går det fint at variabel-overføre
(dvs. ByRef) fra/til ASP.


Noget helt andet var, at jeg lagde mærke til at du gjorde brug af en
lang række If-sætning, hvor kun én If-sætning var nødvendig, og hvor
en Select Case ville være endnu bedre:

> Private Function validateChar(intCharAt As Integer)
> Dim vBool As Boolean
> vBool = False
>
> If intCharAt >= 9 And intCharAt <= 14 Then
> vBool = True
> End If
>
> If intCharAt >= 19 And intCharAt <= 21 Then
> vBool = True
> End If
>
> If intCharAt = 27 Then
> vBool = True
> End If
....

Kunne i stedet være skrevet:

Private Function validateChar(ByVal intCharAt As Integer) As Boolean
Select Case intCharAt
Case 9 To 14, 19 To 21, 27 'osv.osv.osv.
validateChar = True
Case Else
validateChar = False
End Function

Bemærk de ret fine muligheder der er i en Select Case for at teste for
flere ting på samme variabel, uden at skulle gentage variablens navn
mange gange.

-------
Tomas


jan (11-06-2002)
Kommentar
Fra : jan


Dato : 11-06-02 09:10

Hej
Selv om jeg ikke lige havde et problem her og nu vil jeg alligevel sige tak
til Thomas for forklaringen. Den satte også meget på plads for mig.

m.v.h.
Jan

"Tomas Christiansen" <toc@blikroer.removethis.dk> skrev i en meddelelse
news:ae39p0$67a$1@news.cybercity.dk...
> Jesper Stocholm skrev:
> > nej ... det må jeg indrømme ... det er noget med, at ByVal overfører
> den
> > eksakte værdi af variablen ... hvorimod ByRef "kun" overfører en
> pointer*
> > til variablen ... men hvorfor det virker er jeg ikke helt klar over.
> >
> > Hvis du kan klargøre det for mig, så vil jeg blive meget glad.
>
> Da jeg skimmede gennem din kode, anede det mig, at der er en del ting
> omkring VB, som du ikke er klar over.
>
> Dit konkrete problem er, at i ASP's har man kun datatypen Variant,
> hvorimod man i VB, som oftest, vil undgå at bruge typen Variant, men
> hellere vil bruge "stærke" typer som String, Long og Double.
>
> Nå du fra ASP kalder en procedure eller funktion i en DLL, som har
> f.eks. en Long parameter:
>
> Public Sub Proc1 (ByVal Par1 As Long)
>
> som du fra ASP kalder nogenlunde sådan her:
>
> Dim MinPar1
> MinPar1 = 123
> MinDLL.Proc1 MinPar1
>
> Så vil der, idet parameteren værdioverføres (dvs. ByVal), blot blive
> konverteret fra heltalsværdien i Variant-variablen MinPar1 til den
> tilsvarende heltalsværdi i Long-variablen Par1. Denne konvertering
> frembyder ikke det store problem.
>
> Hvis du derimod har en procedure, med en variabel-overført parameter
> (ByRef eller intet er angivet):
>
> Public Sub Proc2 (ByRef Par1 As Long)
>
> Så får du problemer, når du kalder Proc2 på samme måde som Proc1
> kaldes ovenfor.
>
> Idet det ikke er VÆRDIEN i MinPar1, som skal overføres til Proc2, men
> REFERENCEN til det sted i lageret, hvor MinPar1's data rent faktisk
> ligger gemt, går det galt hvis datatyperne ikke er NØJAGTIG ens. Og
> det er en Long og en Variant(Long) ikke.
>
> Løsningen, hvis man virkelig har brug for at variabel-overføre, er
> derfor enkel: Brug mindste fællesnævner, nemlig datatypen Variant.
>
> Du kan eksempelvis lave ASP-kompatible versioner af dine rutiner, som
> denne Proc2_ASP:
>
> Public Sub Proc2_ASP (ByRef Par1 As Variant)
>
> Når blot datatypen i VB er Variant, går det fint at variabel-overføre
> (dvs. ByRef) fra/til ASP.
>
>
> Noget helt andet var, at jeg lagde mærke til at du gjorde brug af en
> lang række If-sætning, hvor kun én If-sætning var nødvendig, og hvor
> en Select Case ville være endnu bedre:
>
> > Private Function validateChar(intCharAt As Integer)
> > Dim vBool As Boolean
> > vBool = False
> >
> > If intCharAt >= 9 And intCharAt <= 14 Then
> > vBool = True
> > End If
> >
> > If intCharAt >= 19 And intCharAt <= 21 Then
> > vBool = True
> > End If
> >
> > If intCharAt = 27 Then
> > vBool = True
> > End If
> ...
>
> Kunne i stedet være skrevet:
>
> Private Function validateChar(ByVal intCharAt As Integer) As Boolean
> Select Case intCharAt
> Case 9 To 14, 19 To 21, 27 'osv.osv.osv.
> validateChar = True
> Case Else
> validateChar = False
> End Function
>
> Bemærk de ret fine muligheder der er i en Select Case for at teste for
> flere ting på samme variabel, uden at skulle gentage variablens navn
> mange gange.
>
> -------
> Tomas
>



Jesper Stocholm (11-06-2002)
Kommentar
Fra : Jesper Stocholm


Dato : 11-06-02 10:52

Tomas Christiansen wrote in news:ae39p0$67a$1@news.cybercity.dk:

> Jesper Stocholm skrev:
>> nej ... det må jeg indrømme ... det er noget med, at ByVal overfører
> den
>> eksakte værdi af variablen ... hvorimod ByRef "kun" overfører en
> pointer*
>> til variablen ... men hvorfor det virker er jeg ikke helt klar over.
>>
>> Hvis du kan klargøre det for mig, så vil jeg blive meget glad.
>
> Da jeg skimmede gennem din kode, anede det mig, at der er en del ting
> omkring VB, som du ikke er klar over.

:)

[snip en meget god forklaring]

Jeg har nu kodet ASP i et par år, og har også kodet en del VB-
applikationer, men det er første gang, at jeg skal kode en VB-
applikation, der skal arbejde sammen med ASP ... og det er lissom det,
der har givet mig problemer. Problemet med (kun) at kode Vbs er, at man
meget nemt bliver lidt af en slam-koder ... givet at man kun kan arbejde
med datatypen variant. Så meget desto mere er jeg lykkelig over
fremkomsten af .Net :)

> Noget helt andet var, at jeg lagde mærke til at du gjorde brug af en
> lang række If-sætning, hvor kun én If-sætning var nødvendig, og hvor
> en Select Case ville være endnu bedre:

[snip]

> Kunne i stedet være skrevet:
>
> Private Function validateChar(ByVal intCharAt As Integer) As Boolean
> Select Case intCharAt
> Case 9 To 14, 19 To 21, 27 'osv.osv.osv.
> validateChar = True
> Case Else
> validateChar = False
> End Function
>
> Bemærk de ret fine muligheder der er i en Select Case for at teste for
> flere ting på samme variabel, uden at skulle gentage variablens navn
> mange gange.

jeg kender godt til SELECT-CASE formuleringen, men jeg var ikke klar
over, at man kunne bruge den med intervaller :) Mht de mange IF-
sætninger, så var det udelukkende for overskuelighedens skyld ... den
enkelte IF-sætning med alle konditionerne indlejret er imo meget svær at
gennemskue, og da jeg ikke regnede med den store performance-nedgang, så
lavede jeg den som x antal enkeltstående IF-sætninger.

Igen ... tak for hjælpen og forklaringerne

:)

PS: jeg kan se i dit bud på validateChar()-funktionen, at du har skrevet
ByVal i input-erklæringen. Er det "blot god skik" ... eller er der en
dybere mening ? Jeg mener, variablen intCharAt initialiseres jo i den
foregående VB-funktion, hvor funktionen Asc() returnerer en int. Derfor
burde det jo strengt taget ikke at være nødvendigt her, da variablen ikke
kommer fra VBs ... men direkte fra en anden vb-funktion.
--
Jesper Stocholm
http://stocholm.dk
http://asp.stocholm.dk
Svar til gruppen og ikke til mig privat pr. email :|

Tomas Christiansen (11-06-2002)
Kommentar
Fra : Tomas Christiansen


Dato : 11-06-02 21:38

Jesper Stocholm skrev:
> PS: jeg kan se i dit bud på validateChar()-funktionen, at du har
skrevet
> ByVal i input-erklæringen. Er det "blot god skik" ... eller er der
en
> dybere mening ? Jeg mener, variablen intCharAt initialiseres jo i
den
> foregående VB-funktion, hvor funktionen Asc() returnerer en int.
Derfor
> burde det jo strengt taget ikke at være nødvendigt her, da variablen
ikke
> kommer fra VBs ... men direkte fra en anden vb-funktion.

Helt generelt: Brug altid ByVal.
Kun hvis du VIRKELIG ønsker ByRef, bør du bruge denne mulighed.
Angiv ALTID ByVal eller ByRef, så at man (andre eller dig selv 12
måneder senere) kan se, at du har taget stilling, og ikke blot "glemt"
at skrive noget.

Du havde heller ikke givet funktionens returværdi en type, og derfor
blev typen Variant.
Angiv ALTID typen af funktionernes returværdi, også selvom det er en
Variant. På den måde viser du for andre eller dig selv 12 måneder
senere, at du har taget stilling, og at du ikke vlot har "glemt" at
skrive Variant.

Det samme kan siges om brugen af Public/Private foran variabler, typer
og konstanter på kodemodul/klasse/form-niveau (dvs. ikke inde i en
procedure/funktion), samt procedurer og funktioner. Angiv ALTID
Private eller Public selvom det er standard-værdien du angiver. Det
giver samtidig den fordel, at du lettere vil kunne flyttet koden fra
f.eks. en form til et globalt kodemodul, uden at det giver de store
problemer.

Med andre ord: Gør dine intentioner tydelige. Det kræver lidt mere
tastearbejde, men det gør dig gladere i længden.

-------
Tomas


Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408849
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste