Rubrik: Controls · ListView | VB-Versionen: VB4, VB5, VB6 | 21.07.03 |
ProgressBar im ListView-Control Wie? Eine ProgressBar in einer ListView-Spalte anzeigen? Geht nicht! Weit gefehlt... geht doch :-) | ||
Autor: Dietmar G. Bayer | Bewertung: | Views: 24.033 |
ohne Homepage | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Letzte Woche haben wir Ihnen eine Möglichkeit gezeigt, wie sich eine ProgressBar in einer StatusBar anzeigen lässt. Wie wäre es nun, eine ProgressBar in einer ganz bestimmten Spalte im ListView-Control anzuzeigen?
Sie werden sich jetzt sicherlich denken:
"Wie? Eine ProgressBar in einer ListView-Spalte anzeigen? Geht nicht!"
Weit gefehlt... geht nämlich doch
Voraussetzung:
Sie verwenden ein ListView-Control, dessen Spalte der Anwender nicht verändern darf!
"Wie? Spalten nicht verändern? Das lässt sich doch gar nicht einstellen! Der Anwender kann die Spaltenbreiten doch immer und sowieso ändern!"
Nochmals weit gefehlt... mit einem kleinen Trick werden aus dem Resizable-Columns mal eben ganz schnell Fix-Columns
Hierzu erstellen wir zur Laufzeit einfach ein paar CommandButtons und legen diese exakt auf die Spaltenbezeichner im ListView. Nicht mehr und nicht weniger.
"Und die ProgressBar?"
Ja stimmt: diese verpflanzen wir wieder mit "SetParent" in das ListView - genau so, wie wir es beim Tipp mit der StatusBar getan haben.
Nun genug Gerede... jetzt wird gecodet
Erstellen Sie ein neues Projekt und ziehen auf die Form:
- ein ListView-Control (ListView1)
- eine ProgressBar (ProgressBar1)
- ein Command-Button (cmdColumn) mit der Eigenschaft Index = 0
- ein weiteren Command-Button (cmdStart) zum Starten der ProgressBar
- sowie ein Timer-Control (Timer1)
Option Explicit ' Benötigte API-Deklarationen Private Declare Function SetParent Lib "user32" ( _ ByVal hWndChild As Long, _ ByVal hWndNewParent As Long) As Long
Private Sub Form_Load() Dim i As Long Dim oColumn As ColumnHeader Dim oItem As ListItem ' ListView-Eigenschaften festlegen With ListView1 .View = lvwReport .FullRowSelect = True .LabelEdit = lvwManual .GridLines = True .HideSelection = True End With ' Spalten erstellen With ListView1.ColumnHeaders .Add , , "File", 1200 .Add , , "Version", 900 .Add , , "Download", 1800 .Add , , "Date", ListView1.Width - 3900 - 330 End With ' ein paar Test-Einträge For i = 1 To 3 Set oItem = ListView1.ListItems.Add() With oItem .Text = "File" + CStr(i) .SubItems(1) = "1.0.0.0" .SubItems(3) = Now End With Next i ' CommandButtons über ListView-Columns legen lvw_SetNewHeader ' ProgressBar zunächst ausblenden ProgressBar1.Visible = False End Sub
Private Sub lvw_SetNewHeader() ' CommandButtons über ListView-Columns legen Dim i As Long cmdColumn(0).Visible = False With ListView1.ColumnHeaders For i = 1 To .Count ' CommandButton laden Load cmdColumn(i) ' Größe festlegen cmdColumn(i).Top = 0 cmdColumn(i).Left = .Item(i).Left cmdColumn(i).Width = .Item(i).Width + 15 cmdColumn(i).Height = ListView1.ListItems.Item(1).Height ' Beschriften, Anzeigen... cmdColumn(i).Caption = .Item(i).Text cmdColumn(i).Visible = True ' ...und ab ins ListView SetParent cmdColumn(i).hwnd, ListView1.hwnd cmdColumn(i).ZOrder Next i End With End Sub
Die ProgressBar selbst soll jederzeit in einer beliebigen Zeile/Spalte angezeigt werden können:
Private Sub lvw_ShowProgressBar(ByVal nRow As Long, _ ByVal nCol As Long) ' ProgressBar in beliebiger ' Zeile/Spalte anzeigen Dim i As Long Dim nLeft As Long Dim nTop As Long Dim nHeight As Long Dim nWidth As Long ' Positon: Left, Width With ListView1.ColumnHeaders For i = 1 To nCol - 1 nLeft = nLeft + .Item(i).Width Next i nWidth = .Item(nCol).Width End With ' Position: Top, Height With ListView1.ListItems For i = 1 To nRow nTop = nTop + .Item(i).Height Next i nHeight = .Item(nRow).Height End With ' ProgressBar anzeigen With ProgressBar1 SetParent .hwnd, ListView1.hwnd .Left = nLeft .Top = nTop .Width = nWidth .Height = nHeight .Visible = True .Value = 0 End With End Sub
Beim Klick auf den Start-Button soll die ProgressBar in der 2. Zeile und 3. Spalte angezeigt werden:
Private Sub cmdStart_Click() ' ProgressBar sichtbar machen lvw_ShowProgressBar 2, 3 ' Timer initialisieren Timer1.Interval = 25 Timer1.Enabled = True ' CommandButton deaktivieren cmdStart.Enabled = False End Sub
' Fortschrittsbalken Private Sub Timer1_Timer() With ProgressBar1 If .Value < .Max Then .Value = .Value + 1 Else Timer1.Enabled = False cmdStart.Enabled = True ProgressBar1.Visible = False End If End With End Sub
Sollen mehrere ProgressBar-Controls gleichzeitig angezeigt werden, einfach ein Steuerelementfeld erstellen und die Prozdur lvw_ShowProgressBar um einen "Index"-Paramater erweitern
Stop! Da fehlt doch noch etwas!
Da die CommandButtons nun direkt auf den ListView-Spaltenbezeichner liegen, lassen sich diese ja gar nicht mehr anklicken - z.B. für eine autom. Sortierung.
Also noch schnell folgenden Code einfügen, und schon geht's wieder:
Private Sub cmdColumn_MouseUp( Index As Integer, _ Button As Integer, Shift As Integer, _ X As Single, Y As Single) ' Sortierung Select Case Index Case 1, 2, 4 With ListView1 .SortKey = Index - 1 .SortOrder = lvwDescending .Sorted = True End With Case Else Beep End Select End Sub