If Not (x1=0 Or x2=0) Then resultat = x1*x2 End If
Synes godt om
Slettet bruger
25. november 2003 - 21:51#4
virker stadig ikke..
Synes godt om
Slettet bruger
25. november 2003 - 21:53#5
den vil heller ikke lige skrive plus.. men det er + ikke gange!
Synes godt om
Slettet bruger
25. november 2003 - 21:54#6
inspriantionen er fra
Private Sub Beregncmd_Click() x = xtxt.Text y = ytxt.Text If x = "" And y = "" Then GoTo 10 End If If x = "" Then x = y / 2 - 5 Else y = 2 * x + 5 End If ytxt.Text = y xtxt.Text = x
global resultat as long private sub kodeeksempel_click() dim x1 as long dim x2 as long if (x1=0) and (x2=0) then goto 10 resultat = x1+x2 exit sub 10: end sub
Papir: Du roder gevaldigt rundt i det. Du dim'mer resultat som en Long, og skriver resultat.text. Det er vrøvl. Og så forsøger du at lægge strings sammen.
Her et par hints:
Hint 1:
Det en bruger skriver i en textbox (fx. text1.text) er en String. Hvis brugeren skriver "3" opfattes det som "bogstavet 3" og ikke som værdien 3. Hvis du vil udregne sommen af nogle tal der står i nogle textboxe, skal du først omregne teksten til et tal, fx. med funktionen Val Reusltat = val(text1.text) + val(text2.text)
Hint 2:
Og at bruge GoTo er en dårlig måde at programmere på, og i din kode kan du sagtens undgå det. Så gør det, for din egen skyld :o)
Hist 3: Hvis du skriver Dim tal1, talt, tal3 as Long er der KUN tal3 der bliver en Long, resten bliver variant. Skal alle tre være Long, skal du skrive Dim tal1 as Long Dim tal2 as Long Dim tal3 as Long
martin modth>> Dine hints er alle OK bortset fra hint1: man bør ikke bruge val i nogen som helst sammenhænge, da du aldrig vil få en fejkode retur fra val: val("a")=0 val(3)=3 val("3,3")=3 Så benyt istedet funktionen int, cint, dbl eller cdbl - dem kan du stole på :-)
Og rent grundlæggende, så burde man istedet benytte en function til løsning af dette problem og ikke en sub, da man så ikke behøver hardcode resultat-feltet i functionen. Så den rigtige løsning burde se således ud:
function addfunction(x1 as long, x2 as long) as long if (x1=0) and (x2=0) then ' What to do at previous line 10 exit function end if addfunction = x1+x2 end function
Jeg har mange steder anvendt 'val' i mine programmer, men jeg lader jo kun noget udføre, når 'val' returnerer et tal. En del steder tester jeg forinden med IsNumeric. Hvis de 4 funktioner du omtaler anvendes på andet end tal, skal der så benyttes ErrorHandling for at undgå at programmet standser?
Jeg har lige kigget i hjælpen til min VB5, dér står ikke hvad der sker, hvis funktionen cint anvendes på en streng.
joern>> Du bør altid have en fejlprocedure i både funktioner og procedurer for at styre eventuelle fejl, som måtte opstå, da programmet ellers vil stoppe og give brugeren af programmet en fejltekst (på engelsk) som brugeren kun vil blive forvirret af - og programmet vil efterfølgende terminere. Alle string->integer funktionerne (undtagen val) vil give en fejlkode 13 type mismatch hvis input ikke er numerisk af indhold. De nævnte funktioner vil alle forsøge at typecaste paramtrene som de korrekte typer og vil derfor også kunne akceptere numerisk input - f.eks. vil cint("5") og cint(5) begge give resultatet 5 men en cint("abe") eller cint("5,5") vil begge give en fejl 13, da "abe" er en streng og da "5,5" ikke er et tal i VB, da VB taler engelsk skulle tallet have heddet "5.5" eftersom VB's decimalpoint er et punktum og ikke et komma. Komma er tusindetals seperator på engelsk.
Man kan selvfølgelig benytte en IsNumeric og en efterfølgende Val - det giver samme effekt :-) men hvorfor benytte 2 funktionskald, når man kan nøjes med et ? Det er meget enklere og mere korrekt at benytte VB's errorhandling (ikke at den er for smart, for det er den ikke), men det giver et væsenlig bedre overblik og struktur på dit program. Den omtalte funktion kunne i givet fald se således ud:
function addfunction(x1 as long, x2 as long, resultat as long) as integer on error goto err_handler 'x1 og x2 bliver checket ved funktionskaldet if (x1=0) and (x2=0) then ' What to do at previous line 10 addfunction = err.number exit function end if resultat = x1+x2 addfunction=err.number end function
Og kaldet til funktionen ville se således ud:
if addfunction(felt1, felt2, myresult) then debug.print "Addering gav resultatet " & myresult else debug.print "Der skete en fejl : " & err.number & " " & err.description end if
Nu udestår så blot det problem, at det kun er brugeren som får denne fejl at se - og han/hun måske ikke fortæller det til udvikleren så derfor vil man i større installationer benytte/have udviklet en Component til at gemme de nødvendige oplysninger om opstående fejl i en database, som driftafdeling/udviklere kan tilgå via et web-interface og på denne måde finde fejl og rette dem - måske endda før brugeren når at fejlmelde dem (!) :-) Og det vil være noget der rykker!
Mange tak for det fyldige svar. Jeg prøver mine programmer af med at indtaste 'forkert', så jeg kan se om mine fejlmeddelelser giver mening. Ingen af mine programmer modtager data som ikke er genereret af det selv eller et andet af mine egne.
Ang. fejlhåndtering. Kan man 'afstille' en On Error Goto? Når jeg har indsat en 'On Error', sker det at en fejl 'længere nede' i sub'en udløser en fejl. Så passer meddelelsen ikke mere. Jeg opretter gerne et spørgsmål så du kan få nogle point, det fortjener du for ovenstående redegørelse.
joern>> Du kan de-aktivere en on error goto med en on error resume next (=standard: brugeren får fejlen kastet op i ansigtet) eller en ny on error goto. Eks.: function addfunction(x1 as long, x2 as long, y1 as long, y2 as long, resultat as long) as integer
on error goto err_handler_1 'x1 og x2 bliver checket ved funktionskaldet if (x1=0) and (x2=0) then ' What to do at previous line 10 addfunction = err.number exit function end if resultat = x1+x2 ' step1 calculations here.... ' and more coding wich may raise errors on error goto err_handler_2 ' step2 calculations here.... ' and more coding wich may raise errors
addfunction=err.number
exit function err_handler_1: addfunction=err.number exit function
err_handler_2: addfunction=err.number exit function
end function
I dette eksempel vil du kunne styre hvilken fejlprocedure som udføres afhængig af hvor i koden at fejlen sker, men vær opmærksom på at om du kalder ned i andre subs/functions fra denne function med errorhandler, så vil du - i fald de underliggende subs/functions ikke har en error handler - fange fejlen hér i denne function. Hvis du indsætter en On error resume next inaktiveres din On error goto.
Det blev lidt rodet, men jeg håber du forstår hvad jeg forsøgte at sige :-) mvh Jesper
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.