vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Mails senden, abrufen und decodieren - ganz easy ;-)  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
Rubrik: Controls · MSFlexGrid/DataGrid   |   VB-Versionen: VB4, VB5, VB624.01.02
MSFlexGrid ausdrucken

Mit einfachen Mitteln und ohne zusätzliche kommerzielle Tools den Inhalt eines FlexGrid-Controls ausdrucken.

Autor:   Dieter OtterBewertung:     [ Jetzt bewerten ]Views:  39.222 
www.tools4vb.deSystem:  Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 Beispielprojekt auf CD 

Standen Sie auch schon einmal vor dem Problem, den gesamten Inhalt eines FlexGrid-Controls ausdrucken zu wollen / zu müssen - und wussten nicht wie?

Klar, man könnte nun irgendwelche (teure) Entwicklerkomponenten hierfür verwenden, denen man einfach die einzelnen Zellen als Parameter übergibt und der Ausdruck erfolgt dann von selbst. Aber gibt es überhaupt ein solches Tool?

Egal - kümmern wir uns einfach selber um den Ausdruck - und zwar verwenden wir hierfür das Printer-Objekt, denn das kostet ja nichts extra

Welche Anforderungen stellen wir uns?

  • a) Tabellenbeschriftung anhand der Spaltenbezeichner automatisch drucken
  • b) aktuell eingestellten Spaltenbreiten prozentual zum Papierformat berücksichtigen
  • c) Spaltenformat berücksichtigen (links-/rechtsbündig und zentriert)
  • d) alle Spalten schön sauber untereinander ausdrucken

    Bereits vor längerer Zeit haben wir Ihnen hier im vb@rchiv schon einmal einen ähnlichen Tipp vorgestellt. Und zwar ging es darum, den Inhalt eines mehrspaltigen ListView-Controls sauber untereinander auszudrucken.
    Siehe auch:  Sauberer ListView-Ausdruck

    In diesem Tipp haben wir Ihnen eine recht universelle Prozedur PrintRow vorgestellt (einschliesslich der Hilfsfunktion PrintCheckLength), welche wir wiederum für das Drucken des FlexGrid-Inhaltes verwenden. Lediglich die Funktion PrintCheckLength wurde noch ein wenig verbessert.

    Hier also zunächst die beiden "bekannten" Prozeduren

    ' 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 Text 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
     
      sText = RTrim$(sText)
      With Printer
        ' wenn rechtsbündig, Platz für ein
        ' abschliessendes Leerzeichen lassen
        ' (als Trenner zum nachfolgenden Text)
        If Left$(sWidth, 1) = ">" Then _
          iLen = iLen - .TextWidth(" ")
     
        ' 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
          sText = sText + " "
        End If
      End With
     
      PrintCheckLength = sText
    End Function

    Zur Erinnerung
    Die Druckroutine PrintRow erwartet als ersten Parameter die linke Startposition (xPos), dann die gewünschten Spaltenbreiten, und zwar in folgendem Format...

    Breite1|^Breite1|>Breite3

    ...und zuletzt natürlich die zu druckenden 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.

    Inhalt des MSFlexGrid drucken
    Was waren wieder schnell die Anforderungen?

    a) Tabellenbeschriftung anhand der Spaltenbezeichner ermitteln
    Die Tabellenebschriftung ermitteln wir, indem wir die Spalten des Grids durchlaufen und die Texte der ersten Zeile in einem String zusammenfassen.

    With MSFlexGrid
      For I = .FixedCols To .Cols - 1
        sHeader = sHeader + .TextMatrix(0, I) + "|"
      Next I
    End With

    b) aktuell eingestellten Spaltenbreiten prozentual zum Papierformat berücksichtigen
    c) Spaltenformat berücksichtigen (links-/rechtsbündig und zentriert)
    Hier wird es schon ein wenig aufwendiger. Zunächst berechnen wir die Gesamtbreite aller Spalten im Grid. Hierzu werden die ColWidth-Werte der einzelnen Spalten aufaddiert.

    With MSFlexGrid1
      For I = .FixedCols To .Cols - 1
        GridWidth = GridWidth + .ColWidth(I)
      Next I
    End With

    Jetzt berechnen wir für jede einzelne Spalte die benötigte Spaltenbreite in Prozent der Gesamtbreite. Wenn wir dann die auf dem Ausdruck verfügbare maximale Druckbreite durch 100 dividieren und mit der berechneten Spaltenprozentzahl multiplzieren, erhalten wir die Spaltenbreite, die uns für den Ausdruck zur Verfügung steht.

    With MSFlexGrid1
      For I = .FixedCols To .Cols - 1
        ' Ausrichtung berücksichtigen
        Select Case .ColAlignment(I)
          Case 3, 4, 5 ' zentriert
            fmt = fmt + "^"
          Case 6, 7, 8  ' rechtsbündig
            fmt = fmt + ">"
        End Select
     
        intProz = (.ColWidth(I) / GridWidth * 100)
        ColWidth = (PageWidth / 100 * intProz + 0.5)
        fmt = fmt + Format$(ColWidth, "0") + "|"
      Next I
    End With

    d) alle Spalten schön sauber untereinander ausdrucken
    Mit einer doppelten For...Next Schleife durchlaufen wir alle Zellen des Grids zeilen- und spaltenweise und drucken die so zusammengestellten Tabellenzeilen per PrintRow-Aufruf.

    With MSFlexGrid1
      For U = .FixedRows To .Rows - 1
        sRow = ""
        For I = .FixedCols To .Cols - 1
          sRow = sRow + .TextMatrix(U, I)
          If I < .Cols - 1 Then sRow = sRow + "|"
        Next I
        PrintRow xPos, fmt, sRow
      Next U
    End With

    Zusammenfassung
    Im nachfolgenden finden Sie ein vollständiges und funktionierendes Beispiel für den Ausdruck des FlexGrid-Inhaltes.

    Private Sub cmdPrint_Click()
      Dim fmt As String
      Dim sRow As String
      Dim xPos As Long
      Dim I As Long
      Dim U As Long
      Dim intProz As Integer
      Dim GridWidth As Long
      Dim ColWidth As Long
      Dim PageWidth As Long
      Dim sHeader As String
     
      Screen.MousePointer = 11
      With Printer
        .ScaleMode = 6    ' Maßeinheit "mm"
        xPos = 10         ' 10mm Rand link
     
        .Font.Name = "Arial"
        .Font.Size = 12
     
        ' Listen-Bezeichnung
        .CurrentY = 10
        .CurrentX = xPos
        .Font.Bold = True
        Printer.Print "BÜCHER" + vbCrLf
        .Font.Bold = False
     
        ' Format (Spaltenbreiten) + Tabellenkopf
        ' anhand Bildschirm-Spaltenbreite ermitteln
        PageWidth = .ScaleWidth - (xPos * 2)
        With MSFlexGrid1
          ' Gesamtbreite
          For I = .FixedCols To .Cols - 1
            GridWidth = GridWidth + .ColWidth(I)
          Next I
     
          ' Prozentuale Verteilung auf die Spalten
          ' plus Tabellenkopf
          For I = .FixedCols To .Cols - 1
            ' zunächst Spaltenausrichtung berücksichtigen
            Select Case .ColAlignment(I)
              Case 3, 4, 5
                ' zentriert
                fmt = fmt + "^"
              Case 6, 7, 8
                ' rechtsbündig
                fmt = fmt + ">"
            End Select
     
            ' jetzt Spaltenbreite
            intProz = (.ColWidth(I) / GridWidth * 100 + 0.5)
            ColWidth = (PageWidth / 100 * intProz + 0.5)
            fmt = fmt + Format$(ColWidth, "0")
     
            ' Tabellenkopf
            sHeader = sHeader + .TextMatrix(0, I)
     
            If I < .Cols - 1 Then
              fmt = fmt + "|"
              sHeader = sHeader + "|"
            End If
          Next I
        End With
     
        ' Tabellenkopf drucken
        .Font.Bold = True
        .Font.Size = 9
        PrintRow xPos, fmt, sHeader
        .Font.Bold = False
     
        ' Grid-Inhalt zeilenweise drucken
        .Font.Size = 8
        .CurrentY = .CurrentY + 5
        With MSFlexGrid1
          For U = .FixedRows To .Rows - 1
            sRow = ""
            For I = .FixedCols To .Cols - 1
              sRow = sRow + .TextMatrix(U, I)
              If I < .Cols - 1 Then sRow = sRow + "|"
            Next I
            PrintRow xPos, fmt, sRow
          Next U
        End With
     
        ' Druckauftrag beenden
        .EndDoc
      End With
      Screen.MousePointer = 0
     
      MsgBox "Grid wurde ausgedruckt!", 64, "Drucken..."
    End Sub

  • Dieser Tipp wurde bereits 39.222 mal aufgerufen.

    Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

    Über diesen Tipp im Forum diskutieren
    Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

    Aktuelle Diskussion anzeigen (1 Beitrag)

    nach obenzurück


    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.
     
       

    Druckansicht Druckansicht Copyright ©2000-2024 vb@rchiv Dieter Otter
    Alle 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.

    Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel