Hei!
Taas pitäisi apua kysellä viisaammilta tietäjiltä. :) Alla tehtävän anti ja koodit.
Harjoitus 6.3
Muuta vanhaa laskin -ohjelmaa niin, että laskutoimitus tapahtuu aliohjelmassa. Aliohjelmaan (Function) välitetään luku1, luku2 ja laskutoimituksen kuvaava merkki.
Tee virheenkäsittely aliohjelmaan. Esim. tapaus yritetään jakaa 0:lla.
Vanhan laskimen koodi
Private Sub cmdLaske_Click()
Dim Yksi As Double, Kaksi As Double
Yksi = Val(txtMuuttuja1.Text)
Kaksi = Val(txtMuuttuja2.Text)
If optYhteenlasku.Value = True Then
lblTulos1.Caption = Yksi + Kaksi
End If
If optVähennyslasku.Value = True Then
lblTulos1.Caption = Yksi - Kaksi
End If
If optKertolasku.Value = True Then
lblTulos1.Caption = Yksi * Kaksi
End If
If optJakolasku.Value = True Then
lblTulos1.Caption = Yksi / Kaksi
End If
If optKokonaisluku.Value = True Then
lblTulos1.Caption = Yksi \ Kaksi
End If
If optJakojäännös.Value = True Then
lblTulos1.Caption = Yksi Mod Kaksi
End If
If optPotenssi.Value = True Then
lblTulos1.Caption = Yksi ^ Kaksi
End If
End Sub
Private Sub cmdLopeta_Click()
Unload Me
End SubNykyinen yritelmä
Jossa siis funktion sisällä oleva laskutoimitus ei toimi.
Function Laske(Yksi As Double, Toimitus As String, Kaksi As Double) As Double
Laske = "Yksi Toimitus Kaksi"
End Function
Private Sub cmdLaske_Click()
Dim Yksi As Double
Dim Kaksi As Double
Dim Toimitus As String
Yksi = Val(txtMuuttuja1.Text)
Kaksi = Val(txtMuuttuja2.Text)
If optYhteenlasku.Value = True Then
Toimitus = "+"
End If
If optVähennyslasku.Value = True Then
Toimitus = "-"
End If
If optKertolasku.Value = True Then
Toimitus = "*"
End If
If optJakolasku.Value = True Then
Toimitus = "/"
End If
If optKokonaisluku.Value = True Then
Toimitus = "\"
End If
If optJakojäännös.Value = True Then
Toimitus = "Mod"
End If
If optPotenssi.Value = True Then
Toimitus = "^"
End If
lblTulos1.Caption = Laske(Yksi, Toimitus, Kaksi)
End Sub
Private Sub cmdLopeta_Click()
Unload Me
End SubEi. Merkkijonossa olevaa koodia ei voi ajaa kuin muistaakseni .NETillä. Sekin tulkataan erillisenä VBScriptinä. Olen itsekin haaveillut RunVBCode -aliohjelmasta. Tämä aliohjelma tepsisi (anteeksi, sisennykset jäivät):
Function Laske(Luku1 As Double, Luku2 As Double, Toimitus As String,) As Double Select Case Toimitus Case "+" Laske = Luku1 + Luku2 Case "-" Laske = Luku1 - Luku2 Case "*" Laske = Luku1 * Luku2 Case "/" Laske = Luku1 / Luku2 Case "Mod" Laske = Luku1 Mod Luku2 End Select End Function
EDIT: Pahoittelen, koodini on suoraan sanottuna PURKKAA. En saanut parempaa.
KingOfTheWorld kirjoitti:
Ei. Merkkijonossa olevaa koodia ei voi ajaa kuin muistaakseni .NETillä. Sekin tulkataan erillisenä VBScriptinä. Olen itsekin haaveillut RunVBCode -aliohjelmasta...
KingOfTheWorld Muistit väärin!
Homma pelaa esim VB6:ssa aivan loistavasti
' Lisää referenssi: Microsoft Script Control 1.0
' jos ei löydy niin lataa alla olevasta URL-osoitteesta
' http://www.microsoft.com/downloads/details.aspx?FamilyID=d7e31492-2595-49e6-8c02-1426fec693ac&DisplayLang=en
'Formille 1 tekstiboxi ja komentopainike
Private Sub Command1_Click()
Dim scriptiKone As MSScriptControl.ScriptControl
Set scriptiKone = New MSScriptControl.ScriptControl
strSuorita = "Sub Laske()" & vbCrLf & _
"vastaus = " & Text1.Text & vbCrLf & _
"Text1.Text = vastaus" & vbCrLf & _
"End Sub"
With scriptiKone
.Language = "VBScript"
.AddObject "Form1", Me, True
.AllowUI = True
.AddCode strSuorita
.Run "Laske"
End With
Set scriptiKone = Nothing
End SubThäh. Enhän minä tuommoista hokannut. En muista nähneeni tuommoista. Näin tuonlaisen skriptimaatin jossain, mutta en nähnyt missään tietoa, että tommonen ScriptControl olisi ollut. *tyhmä minä*
KingOfTheWorld kirjoitti:
Ei. Merkkijonossa olevaa koodia ei voi ajaa kuin muistaakseni .NETillä. Sekin tulkataan erillisenä VBScriptinä. Olen itsekin haaveillut RunVBCode -aliohjelmasta. Tämä aliohjelma tepsisi (anteeksi, sisennykset jäivät):
Jos nyt sotkisit vähän faktoja kehiin. .NETissä ei kyllä ajella merkkijonosta koodia saati tulkata sitä ja vielä vähemmän mitään VBScriptiä. Voit kyllä kääntää lennossa koodia assemblyksi ja ajella sieltä mitä haluat.
Tietysti voi jostain kaivaa palikan joka moistakin tekisi muttei se mitenkään .NETiin liity.
Kiitos kovasti kaikille! Sain koodin toimimaan ja myös virheenkäsittelyn lisättyä. :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.