[VB] probleem met strings

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • martijn2008
  • Registratie: December 2009
  • Laatst online: 21-08-2022
Ik probeer een programma te maken die van een getal letters kan maken, die letters vormen dan een willekeurige letterreeks. Waar een 0 staat in het getal komt een 0 in het "wachtwoord".

Dit is de volledige code:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdMaak.Click
        Dim datum, password, getallen, alfabet(0 To 26) As String
        Dim nummer, nummer2, lang, teller, temp As Integer
        Dim datum2 As Array
        alfabet(0) = "a" : alfabet(1) = "b" : alfabet(2) = "c" : alfabet(3) = "d" : alfabet(4) = "e"
        alfabet(5) = "f" : alfabet(6) = "g" : alfabet(7) = "h" : alfabet(8) = "i" : alfabet(9) = "j"
        alfabet(10) = "k" : alfabet(11) = "l" : alfabet(12) = "m" : alfabet(13) = "n" : alfabet(14) = "o"
        alfabet(15) = "p" : alfabet(16) = "q" : alfabet(17) = "r" : alfabet(18) = "s" : alfabet(19) = "t"
        alfabet(20) = "u" : alfabet(21) = "v" : alfabet(22) = "w" : alfabet(23) = "x" : alfabet(24) = "y"
        alfabet(25) = "z" : alfabet(26) = "0"

        nummer = txtnummer.Text '105
        datum = txtdatum.Text '28-09-1993
        datum2 = Split(datum, "-")
        nummer2 = datum2(0) * datum2(1) * datum2(2) * nummer
        getallen = nummer2 '52734780
        lang = Len(getallen) '8
        teller = 1
        password = "4"
        Do While lang < teller
            If Val(Mid(getallen, teller, 2)) < 26 Then
                temp = Val(Mid(getallen, teller, 2))
                password = password + alfabet(temp - 1)
                teller = teller + 2
            Else
                temp = Val(Mid(getallen, teller, 1))
                password = password + alfabet(temp - 1)
                teller = teller + 1
            End If
        Loop
        txtpassword.Text = password 'komt de waarde "4" uit
        txtDEBUG2.Text = nummer2 'komt 52734780
    End Sub


Als ik het goed bekeken hebt gaat het fout bij het gedeelte
Visual Basic .NET:
1
2
temp = Val(Mid(nummer2, teller, 2))
password = password + alfabet(temp - 1)

Hij kan op een 1 of andere manier niets met de variabele temp, maar waarom niet?
Als ik alfabet(4) in een textvak laat zetten dan doet ie het, maar hij kan het niet bij de var. password toevoegen.

Alvast bedankt voor de moeite en de aandacht.

Acties:
  • 0 Henk 'm!

  • CasioMan468
  • Registratie: April 2005
  • Laatst online: 11-09 16:35
De functie 'Mid' werkt toch alleen maar met Strings?
Volgens mij is nummer2 een integer.

Acties:
  • 0 Henk 'm!

  • martijn2008
  • Registratie: December 2009
  • Laatst online: 21-08-2022
ow, ja sorry dat was een testje dit is mijn fout. Ik had eerst
getallen = nummer2 (getallen is string) // dit kan toch wel?

en dan temp = Val(Mid(getallen, teller, 2)) // maar dit werkt ook niet.
Ik heb de startpost aangepast, met commentaar bij een voorbeeld invoer.

[ Voor 15% gewijzigd door martijn2008 op 10-04-2010 12:43 ]


Acties:
  • 0 Henk 'm!

  • CasioMan468
  • Registratie: April 2005
  • Laatst online: 11-09 16:35
Do While lang < teller

moet dat niet Do While lang > teller zijn? Doe zolang lang groter is dan teller?

Anders pakt hij het hele stuk tussen de Do While loop niet eens mee.

[ Voor 20% gewijzigd door CasioMan468 op 10-04-2010 12:53 ]


Acties:
  • 0 Henk 'm!

  • martijn2008
  • Registratie: December 2009
  • Laatst online: 21-08-2022
CasioMan468 schreef op zaterdag 10 april 2010 @ 12:51:
Do While lang < teller

moet dat niet Do While lang > teller zijn? Doe zolang lang groter is dan teller?

Anders pakt hij het hele stuk tussen de Do While loop niet eens mee.
Goed gezien, bedankt nu werkt het. Het zijn jammer genoeg altijd de kleine dingen die niet opvallen fout zijn. Hartstikke bedankt

Nog een vraag dat stuk van het alfabet opslaan in een array, kan dat niet korter? Zoiets als:
alfabet = ("a","b","c", enz enz )

[ Voor 12% gewijzigd door martijn2008 op 10-04-2010 13:45 ]


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
http://msdn.microsoft.com/en-us/library/y13tek7e.aspx
Alternatief:
Visual Basic:
1
2
        Dim alfabet = Enumerable.Range(Asc("a"), 26).Select(Function(a) Chr(a)). _
                      Union(New Char() {"0"}).ToArray()

Iets zegt me enkel dat 0 niet in het alfabet zit.. :9

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • CasioMan468
  • Registratie: April 2005
  • Laatst online: 11-09 16:35
martijn2008 schreef op zaterdag 10 april 2010 @ 12:40:
getallen = nummer2 (getallen is string) // dit kan toch wel?
Geen idee of dat kan/mag, maar netter is via getallen = Str$(nummer2) natuurlijk. Dat is ook leesbaarder.

Kun je trouwens je alfabet niet gewoon in een string zetten en dan met Mid(alfabet,x,1) uitlezen?

Zomaar een idee...

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
CasioMan468 schreef op zaterdag 10 april 2010 @ 14:41:
Kun je trouwens je alfabet niet gewoon in een string zetten en dan met Mid(alfabet,x,1) uitlezen?
Wat gelijk is aan alfabet(x). Maar als je dan toch bezig bent kan Chr(Val(Mid(getallen, teller, 2)) + Asc("a") -1) ook in 1x en heb je die hele string niet nodig... :p

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • CasioMan468
  • Registratie: April 2005
  • Laatst online: 11-09 16:35
pedorus schreef op zaterdag 10 april 2010 @ 14:59:
[...]

Wat gelijk is aan alfabet(x). Maar als je dan toch bezig bent kan Chr(Val(Mid(getallen, teller, 2)) + Asc("a") -1) ook in 1x en heb je die hele string niet nodig... :p
Dat wou ik eerst voorstellen, maar had geen zin om die regel uit te spitten. Tof dat jij dat ff deed. :)

Maar op deze manier moet je nog wel ff de "0" afvangen trouwens...

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
CasioMan468 schreef op zaterdag 10 april 2010 @ 15:16:
[...]


Dat wou ik eerst voorstellen, maar had geen zin om die regel uit te spitten. Tof dat jij dat ff deed. :)

Maar op deze manier moet je nog wel ff de "0" afvangen trouwens...
Dat geval wordt sowieso nog niet afgehandeld. :p Het zou aan de andere kant van die if moeten denk ik, maar die if werkt nog niet goed... (iets als if (teller+1<lengte) andalso (getallen(teller)="1"c orelse (getallen(teller)="2"c andalso getallen(teller+1)<"7"c)) ofzo)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • CasioMan468
  • Registratie: April 2005
  • Laatst online: 11-09 16:35
pedorus schreef op zaterdag 10 april 2010 @ 15:35:
[...]

Dat geval wordt sowieso nog niet afgehandeld. :p Het zou aan de andere kant van die if moeten denk ik, maar die if werkt nog niet goed... (iets als if (teller+1<lengte) andalso (getallen(teller)="1"c orelse (getallen(teller)="2"c andalso getallen(teller+1)<"7"c)) ofzo)
Klopt.
En als lang=8 en teller=7 dan kan Mid(getallen, teller, 2) niet meer.
Weet niet of VB dit slikt, of dat ie een foutmelding geeft.

Trouwens, als temp = 0 dan klopt dit ook niet meer: password = password + alfabet(temp - 1)
En dit: If Val(Mid(getallen, teller, 2)) < 26 Then zal ))<= 26 moeten worden denk ik?

Ik denk dat Martijn er nog even naar moet kijken :)

[ Voor 19% gewijzigd door CasioMan468 op 10-04-2010 16:37 ]


Acties:
  • 0 Henk 'm!

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 09-09 10:50
Dit is toch VB.NET of niet? Aan je event signature te zien wel.
Waarom gebruik je zoveel oude VB functies, zoals Mid en Val? En dan wordt ook nog Str$(..) gesuggereerd, daar ga ik al helemaal van draaien.

In principe werkt het wel allemaal, maar als je in VB.NET programmeert, waarom gebruik je dan niet de nieuwe VB.NET functies? Mid kan vervangen worden door String.SubString. Val kan vervangen worden (in de meeste gevallen) door Integer.(Try)Parse of Double.(Try)Parse oid. En Str$(..) door ofwel de ToString functie of de CStr operator.

Ten slotte heb je ook zeer veel impliciete conversies in je code. Je hebt variabelen van het type Integer, en geeft die de Text property uit een textbox; een String! Dat kan natuurlijk niet, en de enige reden waarom dat legaal is, is dat VB.NET de string impliciet naar een string converteert. Dat zal heel vaak mis gaan. Typ maar eens iets als "abc" in je textbox, dan zal het goed mis gaan. Zoiets moet je gewoon afvangen, door bijvoorbeeld Integer.TryParse te gebruiken.

Als je Option Strict aan zet, dan zul je zien dat VB.NET dit niet meer toelaat, en dat je alle conversies expliciet moet maken. Dat zal je zeker helpen in 'the long run'.

[ Voor 43% gewijzigd door NickThissen op 10-04-2010 19:12 ]

Mijn iRacing profiel


Acties:
  • 0 Henk 'm!

  • martijn2008
  • Registratie: December 2009
  • Laatst online: 21-08-2022
CasioMan468 schreef op zaterdag 10 april 2010 @ 16:12:
[...]
Klopt.
En als lang=8 en teller=7 dan kan Mid(getallen, teller, 2) niet meer.
Weet niet of VB dit slikt, of dat ie een foutmelding geeft.

Trouwens, als temp = 0 dan klopt dit ook niet meer: password = password + alfabet(temp - 1)
En dit: If Val(Mid(getallen, teller, 2)) < 26 Then zal ))<= 26 moeten worden denk ik?

Ik denk dat Martijn er nog even naar moet kijken :)
Ik heb nu If temp = 0 Then password = password + alfabet(26)
maar dan kan ik net zo goed "0" gebruiken, en is het programmatje korter met Mid(alfabet,x,1)

en het is voor school dus ik denk dat dat wel goed is om dat te doen.

@NickThissen, dat ik allemaal oude codes gebruik, komt doordat ik het op school heb geleerd en een boekje heb gekregen met een duidelijke uitleg, maar het programma wat ik gebruik om dit te maken is toch gratis en VB6 niet. En het ziet er iets mooier uit niet zo windows95.

Ik moet er zeker nog naar kijken, maar ik heb ook al dingen opgelost die jullie aankaarten voor dat jullie ze aankaarten :P
Over integer en string met textboxen, het komt uiteindelijk in een MSacces/SQL project. |:(
De geboorte datum komt uit een database en het lidnummer moet de "klant" zelf invullen.

Het gaat er over dat: Klanten films kunnen huren en dat een gast (niet registreerde klant) zich zelf kan aanmelden. En dat werknemers ook filmskunnen zoeken en klanten kunnen zoeken. Films kunnen toevoegen en gegevens aanpassen,

[ Voor 40% gewijzigd door martijn2008 op 10-04-2010 23:59 ]


Acties:
  • 0 Henk 'm!

  • boe2
  • Registratie: November 2002
  • Niet online

boe2

'-')/

Even eerlijk, op welke pauperschool geven ze in hemelsnaam nog VB6 :X


En waarom de moeite doen om zo'n array aan te maken? Als je nu eens gewoon de ascii waarde van een letter neemt?

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind.' - Pratchett.


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
martijn2008 schreef op zaterdag 10 april 2010 @ 23:48:
Over integer en string met textboxen, het komt uiteindelijk in een MSacces/SQL project. |:(
De geboorte datum komt uit een database en het lidnummer moet de "klant" zelf invullen.
Tsja, als het straks in Access-VBA moet komen, dan werken bepaalde VB.NET zaken uit je startpost niet. Zo heeft dat dim-statement een andere uitwerking (niet allen string/integer), zal je bijvoorbeeld Value ipv Text moeten gebruiken en gaat dat "as array" niet werken. Het lijkt me handig om code in het juiste dialect te maken... :p

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • martijn2008
  • Registratie: December 2009
  • Laatst online: 21-08-2022
Boeboe schreef op zondag 11 april 2010 @ 00:32:
Even eerlijk, op welke pauperschool geven ze in hemelsnaam nog VB6 :X
En waarom de moeite doen om zo'n array aan te maken? Als je nu eens gewoon de ascii waarde van een letter neemt?
Gewoon een middelbare school
En hoe dat met die ASCII moet weet ik niet, maar ik ga dat met alfabet = abcdefgh... gebruiken, wat dan begrijp ik nog waar ik mee bezig ben.
pedorus schreef op zondag 11 april 2010 @ 00:42:
[...]
Het lijkt me handig om code in het juiste dialect te maken... :p
Goed gedacht, maar ik denk dat dat niet zo veel werk is om het even om te zetten, dus ik ga er gewoon mee door.
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
   Private Sub txtnummer_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtnummer.TextChanged
        Dim woord, woord2, woord3 As String
        Dim lengte, teller As Integer
        woord = txtnummer.Text
        woord3 = ""
        teller = 1
        lengte = Len(woord)
        Do While teller <= lengte
            woord2 = Mid(woord, teller, 1)
            If Val(woord2) = 0 Then
                If woord2 = "0" Then
                    woord3 = woord3 + woord2
                Else
                    MsgBox("Foute Invoer")
                End If
            Else
                woord3 = woord3 + woord2
            End If
            teller = teller + 1
        Loop
        txtnummer.Text = woord3
    End Sub
End Class

gemaakt, kan niemand tekst invoeren, want tekst word gelijk weer verwijderd uit het tekstbox, maar de getallen laat hij staan. Of is deze code ook weer heel erg omslachtig???

[ Voor 39% gewijzigd door martijn2008 op 11-04-2010 11:51 ]


Acties:
  • 0 Henk 'm!

  • P-Storm
  • Registratie: September 2006
  • Laatst online: 13:55
Op internet zijn er genoeg ASCII tabellen te vinden, en gelukkig zitten a t/m z op een rij. Maar volgens mij is dat alleen een beetje micro-optimalisatie, al ben ik daar niet zeker van.

Acties:
  • 0 Henk 'm!

  • CasioMan468
  • Registratie: April 2005
  • Laatst online: 11-09 16:35
... Of is deze code ook weer heel erg omslachtig???
Beetje wel denk ik. Maar als je foute tekens toch wist, waarom dan nog een messagebox?

Daar komt bij dat ik pas zou checken op het moment dat de gebruiker alles heeft ingevoerd. Als er dan een foute tekst in staat geef je een duidelijke error aan en de gebruiker vult zijn ID (of wat het ook is) opnieuw in.

Maar als je het toch zo wilt:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
   Private Sub txtnummer_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtnummer.TextChanged
        Dim Woord, Woord3 As String
        Dim  Teller, C As Integer
        Woord = txtnummer.Text
        Woord3 = ""
        For Teller = 0 to Len(Woord)
            C = Asc(Mid(Woord, Teller+1, 1))
            If ((C>=48) AND (C<=57)) Then
                Woord3 = Woord3 + Chr$(C)
             Else
                 MsgBox("Foute Invoer! Alleen cijfers a.u.b.")
             End If
        Next Teller
        txtnummer.Text = woord3
    End Sub
End Class


of:

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
   Private Sub txtnummer_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtnummer.TextChanged
        Dim C, Woord, Woord3 As String
        Dim Teller As Integer
        Woord = txtnummer.Text
        Woord3 = ""
        For Teller = 0 to Len(Woord)
             C = Mid(Woord, teller + 1, 1)
             If Instr("0123456789",C) Then
                Woord3 = Woord3 + C
             Else
                 MsgBox("Foute Invoer! Alleen cijfers a.u.b.")
             End If
        Next Teller
        txtnummer.Text = woord3  'BTW, op dit punt, wordt dit Event nogmaals getriggert!!!
                                 'txtnummer.Text veranderd immers (als er foute tekens zijn)
    End Sub
End Class



Niet uitgeprobeerd of het werkt!

Edit:Verhip! Het kan nog simpeler. Zoek maar eens naar IsNumeric. Dan is het nog makkelijker!

[ Voor 75% gewijzigd door CasioMan468 op 11-04-2010 15:26 ]

Pagina: 1