ze5400 Skrevet 14. mars 2005 Del Skrevet 14. mars 2005 Jeg har lagd en enkel kalkulator, men jeg får omtren en millioon desimaltall, hvordan kan jeg begrense dette. Gjerne et eksemplel. Jeg lurer også på hvordan jeg kan gi en feilmelding hvis den skrives inn tekst istenen for tall. Takk for alle svar. Lenke til kommentar
aadnk Skrevet 14. mars 2005 Del Skrevet 14. mars 2005 Du kan begrense antall desimaltall med Round-funksjonen: Dim dValue As Double ' Begrens til to desimaler dValue = Round(txtNumber.Text, 2) Når det gjelder å umuliggjøre inntasting av annet enn tall, finnes det flere metoder. En metode, kan hende den enkleste, er å sette Locked til True og bruke ymse kommandoknapper til å legge til tall og tegn, likesom calc.exe. En annen måte er å bekrefte gyldigheten av inntastingen fortløpende: 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 ' For å finne det lokale desimaltegnet Const LOCALE_SMONDECIMALSEP = &H16 Const LOCALE_USER_DEFAULT = &H400 ' Desimaltegn Dim sDecimal As String ' Siste markørposisjon Dim lLastPos As Long ' For å forhindre uønsket kjøring av hendelsen Dim bIgnoreEvent As Boolean Private Sub Form_Load() Dim Ret As Long ' Alloker nok plass sDecimal = Space(255) ' Finn desimaltegn Ret = GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SMONDECIMALSEP, sDecimal, Len(sDecimal)) ' Vi trenger ikke ta mer enn hva som er nødvendig sDecimal = Left(sDecimal, Ret - 1) End Sub Private Sub txtNumber_Change() Dim sNumberic As String If bIgnoreEvent Then ' Ignorer denne Exit Sub End If ' Fjern alt unntatt tall og desimaltegn sNumberic = ConvertNumberic(txtNumber.Text) If Not txtNumber.Text = sNumberic Then ' Vi må så absolutt ikke reagere på tekstendringen neste gang den kjører bIgnoreEvent = True ' Tilbakestill inntastingen txtNumber.Text = sNumberic ' Idet dette medfører at markøren blir nullstilt, må vi tilbakestille dette òg txtNumber.SelStart = lLastPos ' Vi er ferdige bIgnoreEvent = False Else ' Lagre informasjon lLastPos = txtNumber.SelStart End If End Sub Public Function ConvertNumberic(sText As String) As String Dim Tell As Long, sChar As String, bDecimal As Boolean ' Gå gjennom hele strengen og returner kun tall og desimaltegn For Tell = 1 To Len(sText) sChar = Mid(sText, Tell, 1) If IsNumeric(sChar) Or (sChar = "." Or sChar = "," And (Not bDecimal)) Then ' Vi kan ikke ha mer enn et desimaltegn If sChar = "." Or sChar = "," Then bDecimal = True End If ' Returner tegnet ConvertNumberic = ConvertNumberic & sChar End If Next End Function Private Sub txtNumber_Click() ' Lagre markørposisjonen også når brukeren klikker lLastPos = txtNumber.SelStart End Sub Private Sub txtNumber_KeyDown(KeyCode As Integer, Shift As Integer) ' Samt når brukeren klikker på en tast lLastPos = txtNumber.SelStart End Sub En tredje metode er å sette Style i tekstboksen til ES_NUMERIC, men det er sannsynligvis uaktuelt her, idet tekstboksen da ikke vil akseptere desimaltall. Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå