Gå til innhold

Anbefalte innlegg

Hvorfor får jeg "Compile Error: Method or Data Member not found" på dette? (.Value er markert ved debug)

Private Sub cmdPi_Click()
Dim Pi As Double
   Pi = "3,1415926535897932384626433832795"
   
       If frmOptions.chkPiIPrim.Value = 1 Then
           txtPrim.Text = Pi
       ElseIf frmOptions.chkPiISek.Value = 1 Then
           txtSek.Text = Pi
       ElseIf frmOptions.chkPiISum.Value = 1 Then
           txtSum.Text = Pi
       End If
End Sub

 

cmdPi skal legge inn verdien Variablen Pi i en eller flere TextBox'er om den gitte CheckBox'en er haket av (Value = 1). ChechBox'ene ligger i en frame (har det noe å si?) i formen frmOptions

Lenke til kommentar
Videoannonse
Annonse

Da jeg slettet CheckBox'ene og la dem inn på nytt igjen funket alt som bare juling igjen. :w00t:

 

Jonas: Hva mente du med at jeg ga Pi Sting-verdi? Hvor gjorde jeg det? :dontgetit:

Kan jeg Dim'e Pi som Sting når jeg skal regne med den da?

Endret av endrebjorsvik89
Lenke til kommentar
Da jeg slettet CheckBox'ene og la dem inn på nytt igjen funket alt som bare juling igjen. :w00t:

 

Jonas: Hva mente du med at jeg ga Pi Sting-verdi? Hvor gjorde jeg det? :dontgetit:

Kan jeg Dim'e Pi som Sting når jeg skal regne med den da?

Du definerer Pi som double, men når du gir den en verdi så bruker du "quote" tegnene, og disse forteller VB at det er en string, eller?

 

Alltså isteden for å gjøre slik

Pi = "3,1415926535897932384626433832795"

så gjør slik

Pi = 3,1415926535897932384626433832795

 

(Hva med komma? kan man bruke komma eller må man bruke punktum eller er det avhengig av maskin-innstillingene?)

Lenke til kommentar

Man skal ALLTID bruke punktum som desimaltegn - uavhengig av de regionale instillningene. Bare tenk deg konsekvensene hvis dette ikke var tilfellet; da ville man bare kunne komplimere kode hvis pcen var stilt inn nøyaktig etter det den var under utviklingen.

Lenke til kommentar

Alt funket plutselig fint da jeg slettet CheckBox'ene og la inn nye. :hmm:

 

Dargar: Takk! Når jeg tar vekk "" må jeg skrive punktum (.) i stedet for komma (,), men når programmet kjøres blir det uansett komma i TextBox'ene (har med OS-innstillinger).

 

Forresten, hvilken kommando er den beste å bruke for å lukke et program.

Jeg har prøvd med både Unload Me og Me End, men i begge tilfeller ligger programmet fremdeles i Prosess-listen i Win2000.

 

Når vi allikevel er igang: Er det noen som har forslag/tips til endringer som kan gjøre kalkulatoren enda mer brukervannlig/raskerere å bruke?

Se vedlagt arkiv.

Endret av endrebjorsvik89
Lenke til kommentar

Svært bra, endrebjorsvik89. Programmet er ypperlig til å regne med - enkel og oversiktelig. Men det er dog noen ørsmå irritasjonsmomenter som muligens burde utbedres:

  • Regning med potens viser ikke hele utregningen - bare summen, selv om programmet ikke er innstilt til det.
  • Du kan faktisk bruke operatøren "^" til å regne ut potenser.
  • Bruk ValEx (funksjon vedlagt) når du henter verdier fra tekstbokser, slik at du unngår feil ved eventuell inntasting av bokstaver.
  • "Option Explicit" kan være svært nyttig, spesielt for å hindre unødvendige bugger.

Koden er imidlertid solid og god, og du navngir alle objekter og variabler hensiktsfult. Bra! Fortsett med det.

 

 

 

Her har du koden til ValEx, en funksjon som konverterer "1,1" til 1,1. Dette er noe den vanlige funksjonen Val mangler, som bare forstår punktum som desimalseperator.

 

Private Declare Function GetLocaleInfo Lib "kernel32" Alias "GetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String, ByVal cchData As Long) As Long

Const LOCALE_USER_DEFAULT = &H400
Const LOCALE_SMONDECIMALSEP = &H16

Public Property Get DecimalSeparator() As String
   
   DecimalSeparator = GetUserLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SMONDECIMALSEP)

End Property

Private Function GetUserLocaleInfo(ByVal dwLocaleID As Long, ByVal dwLCType As Long) As String

   Dim sReturn As String, ret As Long
   
   ret = GetLocaleInfo(dwLocaleID, dwLCType, sReturn, Len(sReturn))
   
   If ret Then
    
       sReturn = Space$(ret)
       ret = GetLocaleInfo(dwLocaleID, dwLCType, sReturn, Len(sReturn))
         
       If ret Then
           GetUserLocaleInfo = Left$(sReturn, ret - 1)
       End If
   
   End If
   
End Function

Public Function ValEx(Text As String) As Double

   ValEx = Val(Replace(Text, DecimalSeparator, "."))

End Function

Lenke til kommentar
  • Du kan faktisk bruke operatøren "^" til å regne ut potenser

:blush:

Jeg som endelig hadde lært meg loop, jaja. :)

 

  • Bruk ValEx (funksjon vedlagt) når du henter verdier fra tekstbokser, slik at du unngår feil ved eventuell inntasting av bokstaver.
     
  • "Option Explicit" kan være svært nyttig, spesielt for å hindre unødvendige bugger.
     

...masse stilig kode som jeg ikke forstår så veldig mye av...

:dontgetit:

Jeg prøvde å lime den rett inn, men første "avsnitt" (Private Declare Function...) legger seg sammen med en av de andre funksjonene/avsnittene (vet ikke hva jeg skal kalle det, mellom de lange strekene liksom) i kodeboksen, f.eks cmdPotens og lager feil (Kommando etter End Sub, eller noe liknende).

 

Er det slik at den nekter alle kommandoene å kjøre om det står bokstaver i TextBox'ene? Hva er "Option Explicit"? Hva mente du med ValEx og konvertering av "1,1" til 1,1? (at jeg da kan bruke 3,14 med komma uten "", istedetfor å bruke punktum når jeg tar vekk ""?)

 

Og se forøvrig et annet spørsmål jeg editerte midt inni den forrige posten min om du har tid.

Lenke til kommentar

Koden må limes inn helt øverst i Index-formen, altså omtrent som dette:

 

Private Declare Function GetLocaleInfo Lib "kernel32" Alias "GetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String, ByVal cchData As Long) As Long

Const LOCALE_USER_DEFAULT = &H400
Const LOCALE_SMONDECIMALSEP = &H16

Public Property Get DecimalSeparator() As String

[... blir litt mye å gjenta hele koden ...]

Public Function ValEx(Text As String) As Double

  ValEx = Val(Replace(Text, DecimalSeparator, "."))

End Function

Private Sub cmdKvadrat_Click()
Dim Ledd As Double, Sum As Double
   Ledd = txtPrim.Text
   Sum = Ledd * Ledd
               
   If frmOptions.optSporsmalSvar.Value = True Then
       txtSum.Text = "Kvadratet av " & Ledd & " = " & Sum
   ElseIf frmOptions.optBareSvar.Value = True Then
       txtSum.Text = Sum
   End If

[...]

 

Du kan avslutte et program på to måter. Enten den direkte, ikke anbefalte metoden:

 

' Du risikerer at mye allokert minne ikke gis tilbake til operativsystemet; spesielt i Win9x.
End

 

Eller denne:

 

Dim Form As Form

For Each Form In Forms
   Unload Form
Next

 

Den siste går igjennom alle åpne former og lukker dem. Når VB registerer at ingen former er lastet inn i prosjektet, og ingenting kjører, anroper den deallokeringsprossedyren som avslutter prosjektet.

 

Det jeg mente med ValEx-funksjonen, er at den fikser et stort problem med funksjonen Val. Det har seg nemlig slik at Val kun støtter konvertering av tall med punktum som desimalseperator; den stopper konsekvent med komma og lignede. Det betyr at hvis vi brukte Val på denne måten, så ville vi fått tallet to som sum hvis brukeren skrev "1,6" i primærboksen og "1,9" i sekundærboksen:

 

Private Sub cmdProsent_Click()
Dim Ledd As Double, Ledd2 As Double, Sum As Double
   Ledd = Val(txtPrim.Text) ' Fjerner alle bokstaver
   Ledd2 = Val(txtSek.Text)
[...]

 

Du må altså legge inn ValEx og bruke denne koden for at det skal fungere:

 

Private Sub cmdProsent_Click()
Dim Ledd As Double, Ledd2 As Double, Sum As Double
   Ledd = ValEx(txtPrim.Text) ' Fjerner alle bokstaver. Tar ikke med komma hvis dette er desimalseperatoren.
   Ledd2 = ValEx(txtSek.Text)
[...]

Endret av aadnk
Lenke til kommentar
  • 4 uker senere...
Da jeg prøvde dette, så fikk jeg beskjed om at jeg ikke kunne gjøre det med Me. Jeg bytta ut Me med Form, og da funka det.. mulig det er feil måte å gjøre det på, men det funka i hvertfall her :)

Uff, enkelte ganger kan det gå litt fort i svingene. Du har så absolutt rett - det skal stå Form, ikke Me.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...