Rubrik: Controls · MSFlexGrid/DataGrid | VB-Versionen: VB4, VB5, VB6 | 24.01.02 |
MSFlexGrid ausdrucken Mit einfachen Mitteln und ohne zusätzliche kommerzielle Tools den Inhalt eines FlexGrid-Controls ausdrucken. | ||
Autor: Dieter Otter | Bewertung: | Views: 39.248 |
www.tools4vb.de | System: 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?
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