vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: Drucker   |   VB-Versionen: VB606.07.01
Sauberer ListView-Ausdruck

Eine Routine, die es erlaubt eine mehrspaltige Liste sauber untereinander auszudrucken.

Autor:   Dieter OtterBewertung:  Views:  34.715 
www.tools4vb.deSystem:  Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 Beispielprojekt auf CD 

Oftmals hat mein eine kleinere Liste, z.B. in einem ListView-Steuerelement, welche man bei Bedarf auch ausdrucken möchte. Der Crystal-Reportgenerator eignet sich hier eigentlich weniger, da er für diesen Zweck viel zu umständlich ist. Also bleibt meist nur der Weg über das VB Printer-Objekt.

Der nachfolgende Tipp zeigt, wie sich die Einträge eines mehrspaltigen ListView-Elementes sauber untereinander ausdrucken lassen. Übergeben Sie der Druckroutine die linke Startposition (xPos) und die gewünschten Spaltenbreiten, und zwar in folgendem Format...

Breite1|^Breite1|>Breite3

...und die zu drucken Daten, wobei die einzelnen Spalten-Inhalte ebenfalls durch das |-Zeichen voneinander getrennt sind.

Das ^-Zeichen bedeutet, daß der Inhalt dieser Spalte zentriert dargestellt werden soll. > gibt an, daß der Inhalt rechtsbündig ausgerichtet werden soll.

Alle Maßangaben erfolgen hier in mm.

Die Druckroutine

' Einzelne Zeile (alle Spalten) drucken
Private Sub PrintRow(ByVal xPos As Integer, _
  ByVal fmt As String, ByVal sRow As String)
 
  Dim OldScaleMode As Integer
  Dim sColWidth() As String
  Dim sColText() As String
  Dim I As Integer
 
  With Printer
    OldScaleMode = .ScaleMode
    .ScaleMode = 6              ' Maßeinheit "mm"
 
    sColWidth = Split(fmt, "|")
    sColText = Split(sRow, "|")
    If UBound(sColText) < UBound(sColWidth) Then _
      ReDim Preserve sColText(UBound(sColWidth))
 
    ' alle Spalten nacheinander drucken
    For I = 0 To UBound(sColWidth)
      .CurrentX = xPos
      Printer.Print PrintCheckLength(sColText(I), _
        sColWidth(I));
 
      If IsNumeric(Left$(sColWidth(I), 1)) Then
        xPos = xPos + Val(sColWidth(I))
      Else
        xPos = xPos + Val(Mid$(sColWidth(I), 2))
      End If
    Next I
    Printer.Print
 
    .ScaleMode = OldScaleMode
  End With
End Sub
 
' Länge prüfen und ggf. abschneiden
Private Function PrintCheckLength(ByVal sText As String, _
  ByVal sWidth As String) As String
 
  Dim iLen As Integer
 
  If Left$(sWidth, 1) = "^" Or Left$(sWidth, 1) = ">" Then
    iLen = Val(Mid$(sWidth, 2))
  Else
    iLen = Val(sWidth)
  End If
 
  With Printer
    ' wenn Text zu lang, Text am Ende kürzen
    While .TextWidth(sText) > iLen
      sText = Left$(sText, Len(sText) - 1)
    Wend
 
    If Left$(sWidth, 1) = "^" Then
      ' Text zentrieren
      While .TextWidth(sText) < iLen
        sText = " " + sText + " "
      Wend
    ElseIf Left$(sWidth, 1) = ">" Then
      ' Text rechtsbündig
      While .TextWidth(sText) < iLen
        sText = " " + sText
      Wend
    End If
  End With
 
  PrintCheckLength = RTrim$(sText)
End Function

Das nachfolgende Beispiel verwendet ein ListView-Steuerelement, um die einzelnen Positionen einer Rechnung anzuzeigen. Die einzelnen Spalten sind wie folgt festgelegt: Pos, Menge (rechtsbündig), Bezeichnung, Preis (rechtsbündig) und Gesamt (rechtsbündig). Unterhalb der Liste wird dann noch die Gesamtsumme angezeigt (lblSumme). Über einen CommandButton cmdPrint soll die Positionsauflistung ausgedruckt werden.

' Auflistung drucken
Private Sub cmdPrint_Click()
  Dim fmt As String
  Dim sRow As String
  Dim xPos As Long
  Dim I As Integer
 
  Screen.MousePointer = 11
  With Printer
    .ScaleMode = 6    ' Maßeinheit "mm"
    xPos = 20         ' 20mm Rand link
 
    .Font.Name = "Arial"
    .Font.Size = 12
 
    .CurrentY = 20
    .CurrentX = xPos
    .Font.Bold = True
    Printer.Print "POSITIONEN" + vbCrLf
    .Font.Bold = False
 
    ' Format (Spaltenbreiten)
    fmt = "^10|>15|5|85|>20|>25"
 
    ' Listenkopf
    .Font.Bold = True
    .Font.Size = 10
    sRow = "Pos|Menge||Bezeichnung|Preis|Gesamt"
    PrintRow xPos, fmt, sRow
    .Font.Bold = False
 
    ' Artikelpositionen
    .CurrentY = .CurrentY + 5
    For I = 1 To ListView1.ListItems.Count
      With ListView1.ListItems(I)
        sRow = .Text & "|" & .SubItems(1) & "||" & _
          .SubItems(2) & "|" & .SubItems(3) & "|" & _
          .SubItems(4)
      End With
      PrintRow xPos, fmt, sRow
    Next I
 
    ' Gesamtsumme
    .CurrentY = .CurrentY + 5
    .Font.Bold = True
    fmt = ">20|>25"
    sRow = "Gesamt:|" & lblSumme.Caption
    PrintRow 135, fmt, sRow
    .Font.Bold = False
 
    ' Druckauftrag beenden
    .EndDoc
  End With
  Screen.MousePointer = 0
 
  MsgBox "Artikel-Auflistung wurde ausgedruckt!", 64, _
    "Drucken..."
End Sub



Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
(einschl. Beispielprojekt!)

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
 
Copyright ©2000-2024 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.