Listviewskola
Förord
Hej och välkomna till Listviewskolan. Jag har valt att skriva en kurs om den utmärkta kontrollen Listview eftersom den är väldigt flexibel och användbar i många sammanhang. Staffan Berg, email: staffan.b.berg@telia.comDu hittar knappen för Listviewkontrollen i verktygslådan. Skulle den inte finnas framme högerklickar du någonstans i verktygslådan och väljer Components (alternativt samma menyval i Project-menyn). Bocka sedan för Microsoft Windows Common Controls för att lägga till kontrollen (med flera andra) i verktygslådan.
I följande exempel tänker jag använda Listviewkontrollen för att presentera ett enkelt telefonregister. Du kommer att mata in efternamn, förnamn och telefonnummer från tre textrutor. Jag använder sedan en textfil för att spara alla inmatade uppgifter i.
Starta upp ett nytt projekt och skapa en listviewkontroll med följande egenskaper:
General
View: 3 - lvwReport
Multiselect: True
Sorted: True
Width: 5535
Column Headers
1 - Efternamn
2 - Förnamn
3 - Telefon
Som ni säkert lade märke till valde jag i detta exempel ett visningsläge (3 - lvwReport) som är detsamma som visas som standard i utforskarens högra fönster. Jag väljer detta visningsläge för att jag tycker att Listviewkontrollen då kommer till sin fulla rätt med bäst översikt i kolumner över innehållet. De tre övriga visningslägena (0 - lvwIcon, 2 - lvwSmallIcon och 3 - lvwList) bör innehålla ikoner som är kopplade till en ImageList. En sådan koppling utförs under fliken Image Lists i Properties-rutan.
Skapa sedan tre textrutor och två kommandoknappar med följande namnegenskaper:
txtEfternamn
txtFornamn
txtTelefon
cmdLaggTill - Caption: Lägg till
cmdTaBort - Caption: Ta bort
Skapa också tre etiketter för textrutorna med lämpliga textinnehåll. Låt alla andra egenskapsvärden behålla sina standardvärden.
När du är klar med designen borde det se ut något i den här stilen.
Skapa nu en tom textfil med namnet Telefon.txt.
Nästa steg blir att lägga in Visual Basic-kod till formuläret och kommandoknapparna.
Vi börjar med att lägga in de namn och telefonnummer du skrivit i Listviewrutan och det gör vi genom att skriva in följande kod under knappen 'Lägg till'.
Koden som kommer ett läggas till under cmdTaBort raderar alla markerade rader i Listviewkontrollen. Sedan skrivs det återstående innehållet i Listview1 in i textfilen.
Det första som händer när formuläret laddas är att textfilen med dess innehåll läses in i listviewkontrollen. Koden som läses in ser ut så här:
När man markerar en rad i en listviewkontroll med flera kolumner blir endast elementet i den första kolumnen markerad. Det kan vara snyggare och mer lättarbetat om hela raden blev markerad istället. För att göra detta möjligt krävs det att man skriver ett s k API-anrop. Har du tillgång till VB 6.0 eller senare versioner behöver du bara bocka för rutan FullrowSelect under General. För VB 5 och tidigare versioner tillämpas följande kod.
Placera följande kod i en modul:
Lägg sedan till nedanstående kod i Form_Load().
På höger skärmdump ovan ser ni exempel på vad API-anropet åstadkommer.
Under fliken Sorting under Properties (eller i egenskapsfältet) hittar du egenskaperna SortOrder och SortKey.
Gör så här för att ställa in önskade sorteringsegenskaper:
n Sätt egenskapen SortOrder till antingen lvWAscending (0) för att sortera i stigande ordning eller lvWDescending (1) för att sortera i fallande ordning.
n Ange vilket SubItem-objekt som du vill sortera med avseende på genom att sätta egenskapen SortKey antingen till ett tal för ett av SubItem-objekten eller till 0 för att sortera med avseende på objektets text.
Naturligtvis måste Sorted vara förbockad under Generalfliken eller i egenskapsfältet.
Du kan implementera en sökfunktion för en Listviewkontroll med metoden FindItem. Den här metoden söker efter text i objektens textegenskap, tag-egenskap eller i ett av dess underobjekt (SubItem). I metodens (.FindItem) andra argument specificerar du efter vilken egenskap sökningen skall ske.
Här följer ett exempel på hur metoden FindItem kan tillämpas.
Det sista argumentet i metoden FindItem anger jämförelsemetod som ska användas om sökningen görs med avseende på egenskapen Text. Använd lvwWholeWord (0) för att matcha det första hela ordet i textsträngen eller lvwPartial (1) för att matcha en delsträng som startar i början av texten.
I följande exempel tänker jag använda Listviewkontrollen för att presentera ett enkelt telefonregister. Du kommer att mata in efternamn, förnamn och telefonnummer från tre textrutor. Jag använder sedan en textfil för att spara alla inmatade uppgifter i.
Nytt projekt
Starta upp ett nytt projekt och skapa en listviewkontroll med följande egenskaper: General
View: 3 - lvwReport
Multiselect: True
Sorted: True
Width: 5535
Column Headers
1 - Efternamn
2 - Förnamn
3 - Telefon
Som ni säkert lade märke till valde jag i detta exempel ett visningsläge (3 - lvwReport) som är detsamma som visas som standard i utforskarens högra fönster. Jag väljer detta visningsläge för att jag tycker att Listviewkontrollen då kommer till sin fulla rätt med bäst översikt i kolumner över innehållet. De tre övriga visningslägena (0 - lvwIcon, 2 - lvwSmallIcon och 3 - lvwList) bör innehålla ikoner som är kopplade till en ImageList. En sådan koppling utförs under fliken Image Lists i Properties-rutan.
Skapa sedan tre textrutor och två kommandoknappar med följande namnegenskaper:
txtEfternamn
txtFornamn
txtTelefon
cmdLaggTill - Caption: Lägg till
cmdTaBort - Caption: Ta bort
Skapa också tre etiketter för textrutorna med lämpliga textinnehåll. Låt alla andra egenskapsvärden behålla sina standardvärden.
När du är klar med designen borde det se ut något i den här stilen.
Skapa nu en tom textfil med namnet Telefon.txt.
Nästa steg blir att lägga in Visual Basic-kod till formuläret och kommandoknapparna.
Kommandoknappen Lägg till
Vi börjar med att lägga in de namn och telefonnummer du skrivit i Listviewrutan och det gör vi genom att skriva in följande kod under knappen 'Lägg till'.
Private Sub cmdLaggTill_Click()
Dim f As Integer, strEfternamn as String, strFornamn as String
Dim strTele As String, itmX as ListItem, strApp as String
On Error GoTo Err
f = Freefile
strApp = App.Path
'Kontrollera först så att sökvägen inte slutar med en backslash
If Right(strApp, 1) <> "\" Then
strApp = strApp & "\"
End If
strEfternamn=txtEfternamn.Text
strFornamn=txtFornamn.Text
strTele=txtTelefon.Text
'Öppna textfilen för att lägga till text i slutet av den.
Open strApp & "telefon.txt" For Append As f
Write #f, strEfternamn, strFornamn, strTele
Close f
'Lägg till samma text i Listviewkontrollen
Set itmX = ListView1.ListItems.Add()
itmX.Text = strEfternamn
itmX.SubItems(1) = strFornamn
itmX.SubItems(2) = strTele
txtEfternamn.Text=""
txtFornamn.Text=""
txtTelefon.Text=""
Exit Sub
Err: MsgBox "Det blev något fel", 4, "Telefonlista"
End Sub
Kommandoknappen Ta bort
Koden som kommer ett läggas till under cmdTaBort raderar alla markerade rader i Listviewkontrollen. Sedan skrivs det återstående innehållet i Listview1 in i textfilen.
Private Sub cmdTaBort_Click()
Dim filnr As Integer, itm As ListItem
Dim n As Integer, svar As Integer, strApp As String
strApp = App.Path
If Right(strApp, 1) <> "\" Then
strApp = strApp & "\"
End If
On Error GoTo Err
'Ta bort markerade item
If ListView1.SelectedItem Is Nothing Then Exit Sub
For i = ListView1.ListItems.Count To 1 Step -1
If ListView1.ListItems(i).Selected = True Then
ListView1.ListItems(i).Ghosted = True
ListView1.ListItems.Remove (i)
End If
Next i
filnr = FreeFile
'Skriv in återstoden av item i en textfil.
Open strApp & "telefon.txt" For Output As filnr
For Each itm In ListView1.ListItems
With itm
Write #filnr, .Text, .SubItems(1), .SubItems(2)
End With
Next
Close filnr
txtEfternamn.Text = ""
txtFornamn.Text = ""
txtTelefon.Text = ""
Exit Sub
Err: MsgBox "Det blev något fel", 4, "Telefonlista"
End Sub
Formulärets uppstart
Det första som händer när formuläret laddas är att textfilen med dess innehåll läses in i listviewkontrollen. Koden som läses in ser ut så här:
Private Sub Form_Load()
Dim itmX As ListItem
Dim f As Integer
Dim strEfternamn As String, strFornamn As String, strTele As String, strApp As String
strApp = App.Path
If Right(strApp, 1) <> "\" Then
strApp = strApp & "\"
End If
f = FreeFile
'Läs in textfilen och fyll listviewkontrollen.
Open strApp & "telefon.txt" For Input As f
Do While Not EOF(f)
Input #f, strEfternamn, strFornamn, strTele
Set itmX = ListView1.ListItems.Add()
itmX.Text = strEfternamn
itmX.SubItems(1) = strFornamn
itmX.SubItems(2) = strTele
Loop
Close f
End Sub
Anrop till Windows API
När man markerar en rad i en listviewkontroll med flera kolumner blir endast elementet i den första kolumnen markerad. Det kan vara snyggare och mer lättarbetat om hela raden blev markerad istället. För att göra detta möjligt krävs det att man skriver ett s k API-anrop. Har du tillgång till VB 6.0 eller senare versioner behöver du bara bocka för rutan FullrowSelect under General. För VB 5 och tidigare versioner tillämpas följande kod. Placera följande kod i en modul:
Public Declare Function SendMessageLong Lib "user32" Alias "SendMessageA" _
(ByVal hWnd As Long, _
ByVal Msg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Public Const LVM_FIRST = &H1000
Public Const LVM_SETEXTENDEDLISTVIEWSTYLE = LVM_FIRST + 54
Public Const LVM_GETEXTENDEDLISTVIEWSTYLE = LVM_FIRST + 55
Public Const LVS_EX_FULLROWSELECT = &H20
Lägg sedan till nedanstående kod i Form_Load().
rStyle = SendMessageLong(ListView1.hWnd, LVM_GETEXTENDEDLISTVIEWSTYLE, 0&, 0&)
rStyle = rStyle Or LVS_EX_FULLROWSELECT
r = SendMessageLong(ListView1.hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE, 0&, rStyle)
På höger skärmdump ovan ser ni exempel på vad API-anropet åstadkommer.
Sortera listan
Under fliken Sorting under Properties (eller i egenskapsfältet) hittar du egenskaperna SortOrder och SortKey. Gör så här för att ställa in önskade sorteringsegenskaper:
n Sätt egenskapen SortOrder till antingen lvWAscending (0) för att sortera i stigande ordning eller lvWDescending (1) för att sortera i fallande ordning.
n Ange vilket SubItem-objekt som du vill sortera med avseende på genom att sätta egenskapen SortKey antingen till ett tal för ett av SubItem-objekten eller till 0 för att sortera med avseende på objektets text.
Naturligtvis måste Sorted vara förbockad under Generalfliken eller i egenskapsfältet.
Söka i listan
Du kan implementera en sökfunktion för en Listviewkontroll med metoden FindItem. Den här metoden söker efter text i objektens textegenskap, tag-egenskap eller i ett av dess underobjekt (SubItem). I metodens (.FindItem) andra argument specificerar du efter vilken egenskap sökningen skall ske. Konstant | Värde | Beskrivning |
---|---|---|
lvwText | 0 | Söker igenom egenskapen Text |
lvwSubItem | 1 | Söker igenom egenskapen SubItems |
lvwTag | 2 | Söker igenom egenskapen Tag |
Här följer ett exempel på hur metoden FindItem kan tillämpas.
Private Sub cmdSök_Click()
Dim itmX as ListItem
If IsNull(txtSök) Then
Exit Sub
End If
Set itmX = Listview1.FindItem(txtSök.Value, lvwText, , lvwPartial)
If itmX Is Nothing Then
MsgBox "Listposten hittades inte!"
Exit Sub
End If
itmX.Selected = True
Listview1.Refresh
End Sub
Det sista argumentet i metoden FindItem anger jämförelsemetod som ska användas om sökningen görs med avseende på egenskapen Text. Använd lvwWholeWord (0) för att matcha det första hela ordet i textsträngen eller lvwPartial (1) för att matcha en delsträng som startar i början av texten.
0 Kommentarer