Avatar billede 3nickma Nybegynder
06. juni 2004 - 16:18 Der er 17 kommentarer

Hvorfor virker mit program ikke??

Jeg er ved at førsøge at lave en "rating calculator" i Visual Basic .NET, som jeg skal bruge til et projekt. Første udkast blev lavet i VB 6, men da jeg har VB.NET vil jeg hellere have det til at køre derigennem, og det burde der jo ikke være nogle problemer i! Jeg har derfor skrevet programmet én gang til helt fra bunden af i VB.NET - lille og simpelt program - men den nye VB.NET syntaks vil åbenbart ikke helt virke i forhold til VB 6...

Programmet skal kunne bruges til at beregne en "rating" værdi mellem to spillere, alt efter hvordan de klare sig. Jeg har derfor lavet bedt programmet om at skulle beregne denne rating ud fra en formel, men jeg kan ikke få resultatet vist i VB.NET! :-(

Jeg kan sende programmet til Jer hvis I er interesserede i at hjælpe, og jeg kan da lige forsøge at beskrive problemet her. Den formel jeg bruger er følgende:

Rating = Val(txtGammel) + Val(cbxK) * (Val(cbxScore) - ( 1/10^ ((Val(txtGammel ) - Val(txtModstand er)) / 400) + 1)
lblRatingNy.Tex t = Rating

Det giver sikkert ikke meget mening, men idéen er, at der er brugt labels til at vise den nye beregnede rating, comboboxes til at angive nogle værdier, og textfields til at indtaste ens gammel rating, samt ens modstanders rating...

Jeg kan ikke rigtig få programmet til at udføre beregningen, og efterfølgende vise resultatet i min label - lblRatingNy! Håber I forstå :D Eller evt. vil se på programmet :-)
Avatar billede arne_v Ekspert
06. juni 2004 - 16:24 #1
Det er nok svært at løse problemet uden at se koden eller i det mindste
få fejlene og relevante udsnit af kode
Avatar billede 3nickma Nybegynder
06. juni 2004 - 16:39 #2
Hehe, det har du jo nok ret i! Men det er mere eller mindre også "hele" koden :-O Det er et forholdsvist simpelt beregningsprogram, der indtil videre kun skal tage udgangspunkt i den ovenstående formel...

Jeg har dog ikke noget imod at sende programmet til dig (eller andre), så I kunne se hvor jeg har lavet ged i den. Det er nok umiddelbart den bedste måde. Og da programmet ikke er særligt omfattende burde det ikke være et problem for Jer, men jeg har selv stirret mig blind på problemet! Ved dog ikke lige hvordan det kan foregå herinde, da jeg er ny på Eksperten. Men giv mail og det kan sendes...

Fejlen består i, at når jeg har indtaste de oplysninger, der skal til for at kunne beregne den nye rating - placeret i 4 felter (combobox og textboks) - kommer følgende fejl:

"An unhandled exception has occured in your application. If you click Continue, the application will ignore this error and attempt to continue. If you click Quit, the application will be shut down immediately.

Argument 'Expression' cannot be converted to type 'TextBox'."

Hmm... Nu jeg kigger på det én gang til, hvad betyder så den sidste linje - Argument 'Expression' cannot be converted to type 'TextBox'.?? Kunne godt være problemet, hvis man ved hvordan det skal fikses! ;-)
Avatar billede arne_v Ekspert
06. juni 2004 - 16:44 #3
det lyder meget som du skal skrive:

textboxnavn.Text = noget

fremfor

textboxnavn = noget
Avatar billede 3nickma Nybegynder
06. juni 2004 - 16:56 #4
Har jeg ikke også gjort det med:
Rating = "formel osv. etc."
lblRatingNy.Text = Rating?

Eller mener du det skulle være sådan?
Rating.Text = "formel osv. etc."
lblRatingNy.Text = Rating.Text?

I den ældre VB 6 virker det umiddelbart fint nok, men kan det havde noget at gøre med, at man på én eller anden måde skal declare sin Rating betegnelse før man kan sætte den lig en formel f.eks.? Så det f.eks. bliver Dim Rating As Integer, Rating = "formel osv. etc.", lblRatingNy.Text = Rating?? Er blot et par forslag...
Avatar billede arne_v Ekspert
06. juni 2004 - 17:12 #5
Jeg tror at jeg skal se lidt mere kode
Avatar billede sovsekoder Nybegynder
06. juni 2004 - 17:12 #6
Det kan være mange ting! men dit problem er nok at holde styr på hvad der er tal / text / textbox osv. En god ide er at hente værdierne fra dine labels, comboboxe og tekstboxe ind i variable:

f.eks:
dGammelRating = System.Convert.ToDouble(txtGammel);

måske skulle du bruge System.Convert namespace som ovenfor for ikke at binde dig til de gamle VB-metoder (som Val) - du kan skrive ToDouble(txtGammel) hvis du importerer System.Convert namespacet...

når du har gjort det kan du stykke din rating formel sammen. Sørg for at alle dine værdier fra text og labels og comboboxe er læst ind som tal (brug ToDouble, ToInt32 osvosv. funktionerne)! - du vil nu sikkert få en anden fejl som er mere sigende.

Det kan f.eks være at (antaget at txtGammel er en Textbox) du skal skrive txtGammel.Text for at hente tekst værdien i din tekstbox... håber det hjælper (post gerne din nye fejl efter du har splittet din rating formel op, så kan du helt sikkert få en præcis løsning!
Avatar billede 3nickma Nybegynder
07. juni 2004 - 09:57 #7
Dette er al den kode, der er i programmet. Ikke meget, men nok til at det skulle virke - i teorien i hvert fald! ;-) Håber I får mere ud af det...

Du har sikkert nok ret i, at jeg bruger den ældre syntaks for meget, men er ikke helt ferm på tasterne i det nye VB.NET, endnu. Håber du kan fortælle mig, hvordan du vil have jeg skal bruge System.Convert korrekt i dette tilfælde, men vil også lige selv prøve at fumle lidt med det...

Private Sub btnCalcRating_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCalcRating.Click
        Dim Rating As System.Single
        Try
            Rating = Val(txtGammel) + Val(cbxK) * (Val(cbxScore) - (1 / 10 ^ ((Val(txtGammel) - Val(txtModstander)) / 400) + 1))
            lblRatingNy.Text = Rating
        Catch
            MessageBox.Show("Rating kan ikke beregnes...")
        End Try
    End Sub
End Class
Avatar billede 3nickma Nybegynder
07. juni 2004 - 10:11 #8
Jeg har prøvet at opdatere koden lidt, mht. det rettelser, der blev foreslået af sovsekoder. Det ser også umiddelbart også ud til at virke, men nu giver samtlige resultater 0 - lige meget hvilke tal jeg sætter ind i formel, giver resultater bare 0, hvilket jo ikke er helt hensigtsmæssigt! Har sikkert overset ét eller andet i det nye VB...

Private Sub btnCalcRating_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCalcRating.Click
        Dim Rating As System.Single
        Dim txtGammel = ToInt32(txtGammel)
        Dim txtModstander = ToInt32(txtModstander)
        Dim cbxScore = ToInt32(cbxScore)
        Dim cbxK = ToInt32(cbxK)
        Try
            Rating = txtGammel + cbxK * (cbxScore - (1 / 10 ^ ((txtGammel - txtModstander) / 400)) + 1)
            lblRatingNy.Text = Rating
        Catch
            MessageBox.Show("Rating kan ikke beregnes...")
        End Try
    End Sub
End Class
Avatar billede 3nickma Nybegynder
07. juni 2004 - 18:24 #9
Har I virkelig godt nok ikke nogle flere råd og vejledninger, til hvad der evt. kunne være galt, nu I har fået lidt kode at kigge på?? Håber da I har, og skal nok sende programmet hvis det er, for har lidt brug for det skidt virker ;-)
Avatar billede arne_v Ekspert
07. juni 2004 - 22:44 #10
<jsp:useBean id="f" scope="request" class="test.UtilBean"/>
<jsp:setProperty name="f" property="*"/>

laver en test.UtilBean med navn id og for alle felter i den henter den
form parameter med det samme navn og fylder i
Avatar billede arne_v Ekspert
07. juni 2004 - 22:45 #11
Ignorer lige sidste kommentar - det skulle i en anden tråd !!!!
Avatar billede arne_v Ekspert
07. juni 2004 - 23:17 #12
Jeg er ikke GUI programmør men her er et eksempel som kører.

Jeg tror dog ar formlen er forkert, men den kan du jo ændre:

Imports System
Imports System.Drawing
Imports System.Windows.Forms

Public Class MainForm
    Inherits System.Windows.Forms.Form
    Private txtK As System.Windows.Forms.TextBox
    Private labNy As System.Windows.Forms.Label
    Private txtModstander As System.Windows.Forms.TextBox
    Private butBeregn As System.Windows.Forms.Button
    Private labModstander As System.Windows.Forms.Label
    Private txtNy As System.Windows.Forms.TextBox
    Private labScore As System.Windows.Forms.Label
    Private labK As System.Windows.Forms.Label
    Private labGammel As System.Windows.Forms.Label
    Private txtScore As System.Windows.Forms.TextBox
    Private txtGammel As System.Windows.Forms.TextBox
   
    Public Shared Sub Main
        Dim fMainForm As New MainForm
        fMainForm.ShowDialog()
    End Sub
       
    Public Sub New()
        MyBase.New
        '
        ' The Me.InitializeComponent call is required for Windows Forms designer support.
        '
        Me.InitializeComponent
        '
        ' TODO : Add constructor code after InitializeComponents
        '
    End Sub
       
    #Region " Windows Forms Designer generated code "
    ' This method is required for Windows Forms designer support.
    ' Do not change the method contents inside the source code editor. The Forms designer might
    ' not be able to load this method if it was changed manually.
    Private Sub InitializeComponent()
            Me.txtGammel = New System.Windows.Forms.TextBox
            Me.txtScore = New System.Windows.Forms.TextBox
            Me.labGammel = New System.Windows.Forms.Label
            Me.labK = New System.Windows.Forms.Label
            Me.labScore = New System.Windows.Forms.Label
            Me.txtNy = New System.Windows.Forms.TextBox
            Me.labModstander = New System.Windows.Forms.Label
            Me.butBeregn = New System.Windows.Forms.Button
            Me.txtModstander = New System.Windows.Forms.TextBox
            Me.labNy = New System.Windows.Forms.Label
            Me.txtK = New System.Windows.Forms.TextBox
            Me.SuspendLayout
            '
            'txtGammel
            '
            Me.txtGammel.Location = New System.Drawing.Point(112, 8)
            Me.txtGammel.Name = "txtGammel"
            Me.txtGammel.TabIndex = 0
            Me.txtGammel.Text = ""
            '
            'txtScore
            '
            Me.txtScore.Location = New System.Drawing.Point(112, 72)
            Me.txtScore.Name = "txtScore"
            Me.txtScore.TabIndex = 2
            Me.txtScore.Text = ""
            '
            'labGammel
            '
            Me.labGammel.Location = New System.Drawing.Point(16, 8)
            Me.labGammel.Name = "labGammel"
            Me.labGammel.Size = New System.Drawing.Size(88, 23)
            Me.labGammel.TabIndex = 6
            Me.labGammel.Text = "Gammel"
            '
            'labK
            '
            Me.labK.Location = New System.Drawing.Point(16, 104)
            Me.labK.Name = "labK"
            Me.labK.Size = New System.Drawing.Size(88, 23)
            Me.labK.TabIndex = 9
            Me.labK.Text = "K"
            '
            'labScore
            '
            Me.labScore.Location = New System.Drawing.Point(16, 72)
            Me.labScore.Name = "labScore"
            Me.labScore.Size = New System.Drawing.Size(88, 24)
            Me.labScore.TabIndex = 8
            Me.labScore.Text = "Score"
            '
            'txtNy
            '
            Me.txtNy.Location = New System.Drawing.Point(112, 136)
            Me.txtNy.Name = "txtNy"
            Me.txtNy.TabIndex = 4
            Me.txtNy.Text = ""
            '
            'labModstander
            '
            Me.labModstander.Location = New System.Drawing.Point(16, 40)
            Me.labModstander.Name = "labModstander"
            Me.labModstander.Size = New System.Drawing.Size(88, 23)
            Me.labModstander.TabIndex = 11
            Me.labModstander.Text = "Modstander"
            '
            'butBeregn
            '
            Me.butBeregn.Location = New System.Drawing.Point(200, 216)
            Me.butBeregn.Name = "butBeregn"
            Me.butBeregn.TabIndex = 5
            Me.butBeregn.Text = "Beregn"
            AddHandler Me.butBeregn.Click, AddressOf Me.ButBeregnClick
            '
            'txtModstander
            '
            Me.txtModstander.Location = New System.Drawing.Point(112, 40)
            Me.txtModstander.Name = "txtModstander"
            Me.txtModstander.TabIndex = 1
            Me.txtModstander.Text = ""
            '
            'labNy
            '
            Me.labNy.Location = New System.Drawing.Point(16, 136)
            Me.labNy.Name = "labNy"
            Me.labNy.Size = New System.Drawing.Size(88, 23)
            Me.labNy.TabIndex = 10
            Me.labNy.Text = "Ny"
            '
            'txtK
            '
            Me.txtK.Location = New System.Drawing.Point(112, 104)
            Me.txtK.Name = "txtK"
            Me.txtK.TabIndex = 3
            Me.txtK.Text = ""
            '
            'MainForm
            '
            Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
            Me.ClientSize = New System.Drawing.Size(292, 266)
            Me.Controls.Add(Me.labModstander)
            Me.Controls.Add(Me.labNy)
            Me.Controls.Add(Me.labK)
            Me.Controls.Add(Me.labScore)
            Me.Controls.Add(Me.labGammel)
            Me.Controls.Add(Me.butBeregn)
            Me.Controls.Add(Me.txtNy)
            Me.Controls.Add(Me.txtK)
            Me.Controls.Add(Me.txtScore)
            Me.Controls.Add(Me.txtModstander)
            Me.Controls.Add(Me.txtGammel)
            Me.Name = "MainForm"
            Me.Text = "MainForm"
            Me.ResumeLayout(false)
        End Sub
    #End Region
       
    Private Sub ButBeregnClick(sender As System.Object, e As System.EventArgs)
        Dim gammel As Integer = Integer.Parse(txtGammel.Text)
        Dim modstander As Integer = Integer.Parse(txtModstander.Text)
        Dim score As Integer = Integer.Parse(txtScore.Text)
        Dim k As Integer = Integer.Parse(txtK.Text)
        Dim ny As Integer
        ny = gammel + k * (score - Math.Pow(0.1, (gammel - modstander) / 400) + 1)
        txtNy.Text = ny.ToString
    End Sub
       
End Class
Avatar billede 3nickma Nybegynder
08. juni 2004 - 00:04 #13
Hej Arne

Det lyder godt det der, det er helt sikkert ;-) Jeg har dog fået hjælp af en venlig sjæl inde fra IT Svar, som kunne fikse det for mig på GUI form, men endnu engang mange, mange tak for, at du har forsøgt dig, og din hjælp har været yderværdsat, samt sovesekoder selvfølgelig, ej at glemme ;-)
Avatar billede 3nickma Nybegynder
08. juni 2004 - 00:08 #14
Derfor skal du også have 'belønningen' i form af et accepteret svar! :-) Jeg er ny herinde, så jeg er ikke sikker på jeg har gjort det korrekt, men har trykket accepter et par gange, og håber på det virker :P Ellers må du lige skrive herinde og fortælle mig, hvad jeg helt præcist skal gøre, for at du får dine fortjente point. Igen tak...
Avatar billede arne_v Ekspert
08. juni 2004 - 07:25 #15
Jeg skal først ligge et svar ...
Avatar billede arne_v Ekspert
16. juni 2004 - 22:03 #16
OK ?
Avatar billede 3nickma Nybegynder
17. juni 2004 - 14:20 #17
?! OK... Har fået et til at virke nu så det passer til de krav jeg har selv har stillet til det. Tak for hjælpen?
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester