Sub GridPrint(Grid As Control, szTitle As String, bLines As Integer)
' *** Print a grid control ***
Dim nRow As Long
Dim nCol As Long
Dim sCurrentX As Single
Dim sCurrentY As Single
Dim sMaxLine As Single
Dim nPage As Integer
Dim szPage As String
Dim sOldY As Single
Dim sPageWidth As Single
Dim sBeginLeft As Single
Dim sBeginGrid As Single
If (Grid.Rows = 0) Then Exit Sub
' *** We resize the grid ***
GridSize Grid
' *** We look for the maximum size for the fontsize ***
sMaxLine = 99999999
' *** By default, we set the fontsize of the grid ***
Printer.FontSize = Grid.FontSize
' *** Here is the maximum width of the page
sPageWidth = Printer.Width * 0.94 - 200
' *** We calculate the maximum possible fontsize ***
Do While (sMaxLine > sPageWidth) And (Printer.FontSize > 0)
sMaxLine = 0
For nCol = 0 To Grid.Cols - 1
sMaxLine = sMaxLine + (Printer.FontSize / Grid.FontSize) * Grid.ColWidth(nCol)
Next
' *** We change the fontsiz if needed ***
If (sMaxLine > sPageWidth) Then Printer.FontSize = Printer.FontSize - 1
Loop
' *** We begin on page 1 ***
nPage = 1
' *** We put The title ***
' *** and the headers of each column ***
GoSub PRINT_HEADERS
For nRow = 1 To Grid.Rows - 1
If (bLines = True) Then Printer.Line (sBeginLeft, sCurrentY)-(sMaxLine, sCurrentY)
' *** We print on a new page if needed ***
If (sCurrentY >= Printer.Height * 0.93 - Printer.TextHeight("A")) Then
If (bLines = True) Then
' *** Bottom line
Printer.Line (sBeginLeft, sCurrentY - 4 * Printer.TwipsPerPixelY)-(sMaxLine, sCurrentY - 4 * Printer.TwipsPerPixelY)
' *** Left line ***
Printer.Line (sBeginLeft, sBeginGrid)-(sBeginLeft, sCurrentY - 4 * Printer.TwipsPerPixelY)
' *** Right line ***
Printer.Line (sMaxLine, sBeginGrid)-(sMaxLine, sCurrentY - 4 * Printer.TwipsPerPixelY)
End If
Printer.NewPage
nPage = nPage + 1
' *** We put The title ***
' *** and the headers of each column ***
GoSub PRINT_HEADERS
End If
sCurrentX = 4 * Printer.TwipsPerPixelX
For nCol = 0 To Grid.Cols - 1
If (nCol > 0) Then
sCurrentX = sCurrentX + (Printer.FontSize / Grid.FontSize) * Grid.ColWidth(nCol - 1)
If bLines = True Then Printer.Line (sCurrentX - 4 * Printer.TwipsPerPixelX, sBeginGrid)-(sCurrentX - 4 * Printer.TwipsPerPixelX, Printer.CurrentY + (Printer.TextHeight("A") / 2) - 4 * Printer.TwipsPerPixelY)
End If
' *** Print cell text ***
Grid.Col = nCol
Grid.Row = nRow
Printer.CurrentX = sCurrentX
Printer.CurrentY = sCurrentY + (Printer.TextHeight("A") / 2)
Printer.Print Grid.Text
Next
sCurrentY = sCurrentY + (Printer.TextHeight("A") * 2)
Next
If (bLines = True) Then
' *** Bottom line
Printer.Line (sBeginLeft, sCurrentY - 4 * Printer.TwipsPerPixelY)-(sMaxLine, sCurrentY - 4 * Printer.TwipsPerPixelY)
' *** Left line ***
Printer.Line (sBeginLeft, sBeginGrid)-(sBeginLeft, sCurrentY - 4 * Printer.TwipsPerPixelY)
' *** Right line ***
Printer.Line (sMaxLine, sBeginGrid)-(sMaxLine, sCurrentY - 4 * Printer.TwipsPerPixelY)
End If
Printer.EndDoc
Exit Sub
PRINT_HEADERS:
' *** We print the title ***
sCurrentY = Printer.CurrentY
Printer.FontBold = True
Printer.Print szTitle
Printer.FontBold = False
Printer.Print ""
' *** We print the page number on the first line ***
sOldY = Printer.CurrentY
szPage = "Page " & CStr(nPage)
Printer.FontItalic = True
Printer.CurrentX = sPageWidth - Printer.TextWidth(szPage)
Printer.CurrentY = sCurrentY
Printer.Print szPage
Printer.FontItalic = False
Printer.CurrentY = sOldY
' *** We print the grid ***
Printer.CurrentY = Printer.CurrentY + (Printer.TextHeight("A"))
sCurrentY = Printer.CurrentY
sBeginGrid = sCurrentY
sBeginLeft = 0
sCurrentX = 4 * Printer.TwipsPerPixelX
' *** We print the header of each column ***
If (bLines = True) Then Printer.Line (sBeginLeft, sCurrentY)-(sMaxLine, sCurrentY)
Printer.Print
sCurrentY = Printer.CurrentY + (Printer.TextHeight("A") / 2)
For nCol = 0 To Grid.Cols - 1
If (nCol > 0) Then sCurrentX = sCurrentX + (Printer.FontSize / Grid.FontSize) * Grid.ColWidth(nCol - 1)
' *** Print cell text ***
Grid.Col = nCol
Grid.Row = 0
Printer.CurrentX = sCurrentX
Printer.CurrentY = sCurrentY
Printer.Print Grid.Text
Next
sCurrentY = sCurrentY + (Printer.TextHeight("A") * 1.5)
Printer.Print
If (bLines = True) Then Printer.Line (sBeginLeft, sCurrentY)-(sMaxLine, sCurrentY)
Return
End Sub
Sub GridSize(grdGrid As Control)
' *** We resize the grid ***
Dim szTmp As String
Dim nColSize As Long
Dim nCounter As Long
Dim nArray() As Integer
Dim nRow As Integer
ReDim nArray(grdGrid.Cols)
For nCounter = 0 To grdGrid.Cols - 1
For nRow = 0 To grdGrid.Rows - 1
szTmp = GridGetText(grdGrid, nRow, nCounter)
nColSize = IIf(Len(szTmp) < 1, 1, Len(szTmp))
If (nArray(nCounter) < nColSize) Then nArray(nCounter) = nColSize
Next
Next
For nCounter = 0 To grdGrid.Cols - 1
grdGrid.ColWidth(nCounter) = nArray(nCounter) * grdGrid.FontSize * 14
Next
End Sub
Function GridGetText(grdGrid As Control, ByVal nRow As Long, ByVal nCol As Long) As String
' *** We get the text of a cell in the grid ***
Dim nOldCol As Long
nOldCol = grdGrid.Col
grdGrid.Row = nRow
grdGrid.Col = nCol
GridGetText = grdGrid.Text
grdGrid.Col = nOldCol
End Function
|