Lathund - Arrayer, egna datatyper och numreringar
Förord
Att använda arrayer (kallas vektorer eller matriser på svenska) är effektivt.Innehåll
»»
»
»
Relaterade artiklar
» Lathund - API-anrop» Lathund - Databaser
» Lathund - Felhantering
» Lathund - Grundläggande syntax
» Lathund - Inbyggda funktioner
» Lathund - Klassmoduler
» Lathund - Kortkommandon
» Lathund - Namngivning och deklarationer
» Lathund - Några extra tips
» Lathund - Slingor och operatorer
» Lathund - Spara, öppna och skriva ut filer
» Lathund - Variablers och konstanters räckvidd
Arrayer
Några exempel på hur man deklarerar och använder arrayer:
Dim strMyFriends(2) As String
strMyFriends(0) = "Kalle"
strMyFriends(1) = "Pelle"
strMyFriends(2) = "Lisa"
Dim intMyLuckyNumbers(1 To 3) As Integer
intMyLuckyNumbers(1) = 4
intMyLuckyNumbers(2) = 7
intMyLuckyNumbers(3) = 8
Man kan även använda en array som argument i en subrutin eller funktion:
Private Sub cmdMyButton_Click()
Dim strMembers(1 To 3) As String
strMembers(1) = "Kalle"
strMembers(2) = "Pelle"
strMembers(3) = "Lisa"
Welcome strMembers, "Hej "
End Sub
Sub Welcome(strNames() As String, strGreeting As String)
Dim lngLower As Long
Dim lngUpper As Long
Dim lngX As Long
lngLower = LBound(strNames)
lngUpper = UBound(strNames)
For lngX = lngLower To lngUpper
MsgBox strGreeting & strNames(lngX)
Next lngX
End Sub
Lägg märke till att man måste skriva argumentet strNames() med parenteser i subrutinens argumentlista, för att visa att endast en array accepteras. Däremot spelar det ingen roll om man använder dessa parenteser när man anropar en subrutin eller funktion. I exemplet ovan kan man skriva strMembers eller strMembers(), det spelar ingen roll.
I Visual Basic 6.0 kan en funktion t o m ha en array som returvärde.
När man vill skapa en subrutin eller funktion med ett varierande antal argument skriver man som i detta exempel:
Sub SayHello(strGreeting As String, ParamArray vntMyFriends() As Variant)
Dim strMessage As String
Dim lngUpper As Long
Dim lngCounter As Long
lngUpper = UBound(vntMyFriends)
For lngCounter = 0 To lngUpper
strMessage = strGreeting & vntMyFriends(lngCounter)
MsgBox strMessage
Next lngCounter
End Sub
Subrutinen SayHello kan säga hej till hur många vänner som helst, så länge du inte har fler än 2147483648. Det högsta index man kan använda i en array är nämligen 2147483647, men det kräver mycket arbetsminne! Lägg märke till att det argument som är ParamArray alltid placeras sist bland argumenten. Datatypen för en ParamArray är alltid Variant.
Index för en array börjar alltid med 0 om man inte deklarerar något annat. Det kan man ändra genom att skriva
Option Base 1
i huvudet av en modul. Då kommer index alltid att börja med 1 om man inte deklarerar något annat. Observera att detta endast gäller den aktuella modulen. En ParamArray påverkas inte. En ParamArray har alltid ett index som börjar med 0.
Om man inte vet hur många element som behövs i en array kan man börja med att deklarera den utan bestämt antal element:
Dim strMyFriends() As String
Senare i koden kan man ändra antalet element med uttrycket ReDim:
ReDim strMyFriends(1 To 20) As String
Om man inte vill att innehållet ska försvinna när man ändrar antalet element använder man uttrycket ReDim Preserve:
ReDim Preserve strMyFriends(1 To 20) As String
Upp till 60 dimensioner kan man använda i arrayer. En tredimensionell array skulle kunna deklareras så här:
Dim strMulti(1 To 10, 1 To 50, 1 To 30) As String
I en flerdimensionell array kan man endast bevara innehållet i den sista dimensionen med uttrycket ReDim Preserve och ReDim kan inte ändra antalet dimensioner. ReDim kan heller inte ändra datatypen för en array, om den inte var deklarerad som Variant från början.
Funktionerna LBound och UBound, som returnerar lägsta respektive högsta index för en array, är mycket användbara. Man kan även tillämpa dessa funktioner på flerdimensionella arrayer. Antag att variabeln lngSecondLimit ska tilldelas det tal som är högsta index i den andra dimensionen av strMulti. Då kan man skriva
lngSecondLimit = UBound(strMulti, 2)
VARNING!
Om lägsta index är 1, så är högsta index lika med antalet element och funktionen UBound returnerar i så fall antalet element, men om lägsta index inte är 1 returnerar funktionen UBound inte antalet element!
VARNING!
Använd bara 0 som lägsta index om du vill underlätta övergången till Visual Basic .NET.
Egna datatyper
I Visual Basic kan man definiera egna datatyper. Det kan vara mycket praktiskt. I huvudet av en standardmodul kan man t ex skriva
Public Type Member
FirstName As String
LastName As String
PhoneNumber As String
End Type
I en procedur i samma projekt kan man sedan skriva
Dim typNewMember As Member
och senare i samma procedur
typNewMember.FirstName = "Lisa"
typNewMember.LastName = "Karlsson"
typNewMember.PhoneNumber = "123456"
Om man definierar egna datatyper i huvudet av en formulärmodul måste man använda ordet Private och då kan dessa egna datatyper bara användas för att deklarera modulära variabler (se avsnittet Variablers och konstanters räckvidd) i det aktuella formuläret. Vill man använda en egen datatyp i hela projektet måste man definiera den i huvudet av en standardmodul och använda ordet Public.
När det passar dina syften kan du göra en array av en egen datatyp:
Dim typAllMembers(1 To 10) As Member
typAllMembers(1).FirstName = "Lisa"
typAllMembers(1).LastName = "Karlsson"
typAllMembers(1).PhoneNumber = "123456"
VARNING!
Gör gärna en array av en egen datatyp, men använd inte en array i en egen datatyp om du vill underlätta övergången till Visual Basic .NET. Av samma skäl bör du inte använda en sträng med fast längd i en egen datatyp.
Numreringar
Med uttrycket Enum kan man skapa en speciell sorts egna datatyper, som kallas numreringar. En sådan passar bra för en variabel vars tillåtna värden är begränsade till ett antal numrerade alternativ.Som följande exempel visar är numreringar bra att använda som argument i procedurer. När proceduren anropas får man som synes en praktisk lista över argumentets tillåtna värden.
Numreringar har samma begränsningar som datatypen Long, så alla heltal mellan -2147483648 och 2147483647 kan användas, även i hexadecimal form.
Typkonvertering
En vanlig situation för programmerare är att man vill tilldela variabeln A till variabeln B, men blir osäker, eftersom A och B råkar vara deklarerade med olika datatyper. Visual Basic är ett mycket snällt språk i den situationen och tillåter det mesta.I Visual Basic kan man alltid tilldela en Byte, Integer, Long, Currency, Single, Double, Date eller Boolean till en String, utan att använda typkonverteringsfunktionen CStr.
Man kan till och med konkatenera (sammanfoga) en Byte med en Integer och en Long och en Currency och en Single och en Double och en Date och en Boolean och tilldela resultatet till en String.
Motsatsen, att tilldela en String till en Byte, Integer, Long, Currency, Single, Double, Date eller Boolean går också bra, under förutsättning att värdet av variabeln med datatypen String är "lämpligt" för den andra variabelns datatyp.
Variabler med de numeriska datatyperna Byte, Integer, Long, Currency, Single, Double, Date och Boolean kan även tilldelas till varandra om de har "lämpliga" värden.
När det gäller datatypen Date är det bra att veta att alla datum sedan år 1900 numreras med positiva heltal. Den 25 januari 2001 numreras 36916. Den dagen hade det gått 36916 dagar sedan förrförra sekelskiftet. (Så gör kalkylprogrammet Excel också, men det finns en skillnad: Visual Basic 6.0 räknar konstigt nog inte år 1900 som ett skottår, vilket Excel gör, men den 1 januari 1900 numreras 1 i Excel och 2 i Visual Basic 6.0, så det uppstår inte någon förskjutning mellan Excel och Visual Basic 6.0 efter skottdagen 1900.)
Visual Basic kan hantera alla datum mellan år 100 och år 9999.
Följande kod fungerar:
Sub Test()
Dim lngX As Long
Dim blnY As Boolean
lngX = -1
blnY = lngX
End Sub
Följande kod fungerar inte:
Sub Test()
Dim lngX As Long
Dim intY As Integer
lngX = 750000
intY = lngX
End Sub
I det andra exemplet har variabeln lngX ett värde som är för stort för datatypen Integer.
När det gäller datatypen Boolean är det bra att veta att False kan bytas ut mot 0 och True kan bytas ut mot -1.
Nu kommer en hemlighet om datatypen Boolean. Det är inte bara -1 som motsvarar True. Alla tal överhuvudtaget motsvarar True, utom 0, som motsvarar False! Faktum är att alla textsträngar också motsvarar True! Utom "0", som motsvarar False! Vad motsvarar datumet 1899-12-30? Rätt gissat! False! Alla andra datum motsvarar True! Låt oss säga att vi har en variabel med datatypen Integer. Variabeln heter intX. Vi vill kontrollera om intX = 0 och meddela resultatet av kontrollen. Då kan vi kort och gott skriva
If intX Then
MsgBox "Den är inte 0!"
Else
MsgBox "Den är 0!"
End If
Skriv inte svårtolkad kod i Visual Basic! Skriv istället
If intX <> 0 Then
MsgBox "Den är inte 0!"
Else
MsgBox "Den är 0!"
End If
Vid anrop av procedurer kan Visual Basic vara strängare. I vissa fall kräver Visual Basic att de variabler som den anropande proceduren skickar som argument har rätt datatyp. Då kan man bli tvungen att använda typkonverteringsfunktionerna CStr, CByte, CInt, CLng, CCur, CSng, CDbl, CDate, CBool, CDec och CVar för att undvika "type mismatch".
Kravet på rätt datatyp gäller inte när den anropade procedurens argument har deklarerats med orden ByVal eller As Any.
0 Kommentarer