RSS
StartseiteKnowledge LibraryTop 10Impressum

Sichtbarkeitszähler

Feststellen, wie viele Einträge ein ListView momentan anzeigt

Wie viele Einträge in einem ListView insgesamt vorhanden sind und welcher Eintrag der zuerst angezeigte ist, lässt sich ohne Umwege beim ListView abfragen. Aber wie sieht es aus, wenn man wissen möchte, wie viele Einträge im Moment angezeigt werden? Dieser Artikel verrät es ihnen.

Das ListView kann locker einige Tausend Einträge aufnehmen und verwalten, aber darstellen kann es immer nur eine begrenzte Anzahl, da auch der Bildschirm nur eine begrenzte Fläche zu Darstellung bietet. Der Benutzer kann daher den Inhalt des Listviews scrollen und damit immer eine bestimmte Auswahl einsehen. Doch in welchen Bereich diese Auswahl liegt lässt sich nur erahnen, denn liefert die GetFirstVisible-Methode wenigstens noch die Informationen zu dem ersten angezeigten Listeneintrag, bleibt es ein Geheimnis des ListView, wie viele Einträge es maximal anzeigen kann.

Zumindest wenn es nur nach Entwicklern der Schnittstelle des ListView Steuerelements ginge, denn das ListView selber ist gerne bereit diese Information zu liefern. Die freundliche Anfrage in Form der Nachricht LVM_GETCOUNTPERPAGE wird daher über die API Funktion SendMessage, direkt an das ListView weitergegeben. Die Antwort auf diese Frage, ist die Anzahl der Einträge, die das ListView momentan maximal darstellen kann. Dabei werden nur die Einträge berücksichtigt, die vollständig dargestellt werden können, partiell angezeigte Einträge werden nicht gezählt.

Die Verpackung des Aufrufs in eine kompakte Property-Prozedur CountPerPage, erlaubt gleichzeitig eine adäquate Anpassung des Ergebnisses vorzunehmen. Denn wie schon erwähnt, wird immer die Anzahl der maximal darstellbaren Einträge ermittelt. Wenn aber nur 10 Einträge vorhanden sind, wäre ein Ergebnis von z.B. 30 Einträgen mitunter höchst verwirrend. Ähnlich verhält es sich, wenn sich das Listview in der Listenansicht befindet und der Benutzer bis ans Ende gelangt ist – auch hier werden nicht mehr unbedingt die maximal darstellbaren Einträge, sondern nur noch der verbleibende Rest angezeigt. Dementsprechend erfolgt auch hier ein Abgleich, der über den Parameter OnlyVisibleItems gesteuert wird:

Private Const LVM_FIRST = &H1000
Private Const LVM_GETCOUNTPERPAGE = (LVM_FIRST + 40)

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
       (ByVal hwnd As Long, ByVal wMsg As Long, _
        ByVal wParam As Long, ByRef lParam As Any) As Long

Public Property Get CountPerPage(ByRef ListView As ListView, _
                        Optional ByVal OnlyVisibleItems As Boolean) As Long
                        
  CountPerPage = SendMessage(ListView.hwnd, LVM_GETCOUNTPERPAGE, 0, ByVal 0&)
  
  If (OnlyVisibleItems) Then
    With ListView
      If (.View >= lvwList) Then
        If (CountPerPage > .ListItems.Count) Then
          CountPerPage = .ListItems.Count
        ElseIf (CountPerPage > (.ListItems.Count - .GetFirstVisible.Index)) Then
          CountPerPage = .ListItems.Count - .GetFirstVisible.Index + 1
        End If
      End If
    End With
  End If
End Property

Eine kleine, logische Einschränkung soll nicht verschwiegen werden: Diese Methode funktioniert nur –wie auch die GetFirstVisible-Methode-, wenn sich das ListView in der Listen- bzw. Reportansicht befindet. Andernfalls erhält man als Wert immer die Anzahl der insgesamt enthaltenen Einträge, ungeachtet dessen diese auch alle dargestellt werden (können).