Hei,
tahtoisin tehdä ohjelman, jolle käyttäjä antaa halauamansa funktion merkkijonona
esim "x^2+a" (x ja a tiedetään). . Miten tämän toteuttaisi helpoimmin ?
Otat projektiin mukaan ms scripting (Project -> References, ruksaat "Microsoft Scripting Runtime") ja ms scripting control (Project -> Components, ruksaat "Microsoft Script Control"
Sitten korvaat nuo tiedetyt arvot niitä vastaavilla luvuilla ja sitten ajat eval-funktiolla vastauksen.
Tein pienen esimerkin. Laitoin formille:
- ScriptControl (ScriptControl)
- SyöteTextbox (Textbox)
- LaskeButton (Commandbutton)
- TulosLabel (Label)
Private Arvot As New Scripting.Dictionary Private Sub Form_Load() 'Alustetaan arvot Arvot.Add "x", 7 Arvot.Add "a", 6 End Sub Private Sub LaskeButton_Click() Dim Kaava As String Kaava = SyöteTextbox.Text Dim i As Integer For i = 0 To Arvot.Count - 1 Kaava = Replace(Kaava, Arvot.Keys(i), _ Str(Arvot(Arvot.Keys(i)))) Next TulosLabel.Caption = ScriptControl.Eval(Kaava) End Sub
Kiitos. Tuo Replace kai korvaa kaavassa esiintyvät a:n ja X:n luvuilla 6 ja 7 ?
Joo, näin tapahtuu käytännössä. Eli jo sinne nyt antaisi x^2+a kaavaksi, niin Eval-funktiolle menisi "7^2+6"
-tuo Microsoft Scripting Runtime löytyy sieltä, mistä kerroitkin, mutta tuota
Microsoft Script Control ei löytynyt kohdasta Components. Mutta kohdasta References löytyi Microsoft Script Control 1.0. Ruksasin molemmat, mutta
kohdasta ScriptControl.Eval(Kaava) tulee käännösvirhe Variable not defined
jaanas kirjoitti:
Microsoft Script Control ei löytynyt kohdasta Components.
Kai sinulla oli ruksi pois kohdasta "Selected Items Only"?
jaanas kirjoitti:
Mutta kohdasta References löytyi Microsoft Script Control 1.0.
Jätin tosiaan versionumeron mainitsematta, kun sillä ei ole sinänsä tässä tapauksessa väliä.
Voit toki ottaa sen referensisnäkin. Silloin et voi lisätä sitä formille, mutta voit määritellä sen koodin puolella
Dim ScriptControl As New ScriptControl
Joku muu nimi voisi olla parempi, mutta laitoin nyt saman mikä esimerkissäni oli, että toimii suoraan.
Nyt kääntäjä ei valita, mutta ohjelmaa ajaessa tulee virheilmoitus:
The operation could not be completed because the script engine has not been initialized to a valid language
Nyt sain sen toimimaan asettamalla
ScriptControl.Language="VBScript"
Joo, se taitaa asettaa ton automaattisesti jos lisää sen formille enkä tullut testanneeksi tuota referenssien kautta käyttöä. Hyvä kun sait toimimaan.
Aihe on jo aika vanha, joten et voi enää vastata siihen.