|
Eine Fortschrittsanzeige in einer Spalte eines ListView-Steuerelements? Auf den ersten Blick scheint das unmöglich zu sein. Auf den zweiten Blick fallen einem vielleicht Ansätze ein, wie etwa ein ProgressBar-Steuerelement (ebenfalls aus den Microsoft Common Controls) "irgendwie" in der richtigen Zeile und richtigen Spalte über dem ListView zu deponieren, gegebenenfalls werden mehrere Fortschrittsanzeigen gleichzeitig entsprechend positioniert; und wenn der Anwender im ListView blättert, dann... Oh je... Auf den dritten Blick kommen einem dann Dinge wie Subclassen, OwnerDrawn und mehr in den Sinn - horrend viel Aufwand für ein eigentlich schlichtes Vorhaben und einen schlichten Effekt.
Rudern wir also noch einmal zurück. Wahrscheinlich haben Sie bei der Fortschrittsanzeige an einen Balken gedacht, dessen Länge den Fortschritts-Zustand repräsentieren soll. Wenn Sie dabei nicht an einen massiven Balken gedacht haben, sondern an ein Aussehen wie beim ProgressBar-Steuerelement mit einer Reihe von kleinen Blöcken, sind Sie schon nahe an der Lösung dran - die so aussieht:
Es ist ganz einfach: Keine Grafik, sondern aneinander gereihte Zeichen lassen den "Balken" wachsen. In den meisten Schriften ist das Ascii-Zeichen 127 unbesetzt und wird als einfacher Block dargestellt. In der Standard-Schrift "MS Sans Serif" sogar als schmaler, gefüllter Block, in den meisten anderen Schriften als hohles Kästchen. Sie können im Prinzip auch jedes andere Zeichen wählen. Die Absicht der Anzeige wird jedem Anwender vollkommen klar sein - auch wenn es vielleicht nicht ganz so perfekt aussieht, wie bei einem "richtigen" ProgressBar-Steuerelement.
Es lohnt sich sogar gar nicht, weitere Worte über das Wie zu verlieren, das folgende Code-Beispiel (für Visual Basic 6, ein ähnliches Beispiel für Visual Basic 5 finden Sie im Download zu diesem Artikel) spricht wohl für sich. Sie brauchen lediglich eine Spalte beispielsweise mit dem Schlüssel "percent" in geeigneter Breite einzurichten.
Private Const kBlockChar = 127
Private Sub Form_Load()
With ListView1
With .ListItems
With .Add(, "text1", "Item 1").ListSubItems.Add(, "percent")
.Bold = True
.ForeColor = vbHighlight
End With
With .Add(, "text2", "Item 2").ListSubItems.Add(, "percent")
.Bold = True
.ForeColor = vbHighlight
End With
End With
.ColumnHeaders("percent").Width = 1410
End With
End Sub
Private Sub Timer1_Timer()
Dim nCount As Integer
With ListView1.ListItems("text1").ListSubItems("percent")
nCount = Len(.Text) \ 2
nCount = nCount + 1
If nCount > 10 Then
nCount = 0
End If
.Text = String$(nCount * 2, kBlockChar)
End With
End Sub
|