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. 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 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. Inhalt des MSFlexGrid drucken a) Tabellenbeschriftung anhand der Spaltenbezeichner ermitteln 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 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 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 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.569 mal aufgerufen.
Anzeige
![]() ![]() ![]() (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. |
sevZIP40 Pro DLL ![]() Zippen und Unzippen wie die Profis! Mit nur wenigen Zeilen Code statten Sie Ihre Anwendungen ab sofort mit schnellen Zip- und Unzip-Funktionen aus. Hierbei lassen sich entweder einzelnen Dateien oder auch gesamte Ordner zippen bzw. entpacken. Tipp des Monats ![]() Dieter Otter Zeilen einer MultiLine-TextBox ermitteln (VB.NET) Dieser Zipp zeigt, wie man die Zeilen einer MultiLine-TextBox exakt so ermitteln kann, wie diese auch in der TextBox dargestellt werden. TOP Entwickler-Paket ![]() TOP-Preis!! Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR... |
||||||||||||||||
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. |