Процедура
печати из DBGrid
Private Sub cmdPrint_Click()
'***********************************************************
'* Процедура печати данных из DBgrid *
'***********************************************************
Dim c As Integer 'Номер строки
Dim Dob ' Добавочная поправка к ширине столбца для привязки
'к ширине страницы
Dim FlagStrWrap(15) As Integer ' Флаг переноса строки
Dim i As Integer ' Номер записи в таблице
Dim NumDob As Integer
Dim OStrWidth
Dim sss(15)
Dim Str As String
Dim StrWidth(15) ' Ширина столбца
Dim StrWrap As String
Dim StrWrapOst As String
Dim StWidth(15)
Dim title As String ' Заголовок таблицы
Dim w As Integer ' Позиция пробела
Dim x As Integer 'Координата позиции печати X
Dim xRom As Integer ' Хранит приращение координаты X при
'переносе строки
Dim xx As Integer 'Приращение координаты X
Dim Y As Integer 'Координата позиции печати Y
Dim z As Integer ' Номер столбца (в 1-м цикле)
Dim zz As Integer ' Номер столбца (во 2-м вложенном цикле)
Dim zzz As Integer ' Номер столбца (в 3-м вложенном цикле)
MousePointer = 11
'Задание пользовательской системы координат
x = Printer.ScaleWidth * 0.01
Y = Printer.ScaleHeight * 0.02
'Установка свойств объекта Printer
Printer.FontName = "Arial Cyr"
Printer.FontSize = 10
Printer.FontBold = False
'***************************************
'Предварительный расчет ширины столбцов
'***************************************
'Считывание названий полей из DBGrid
For z = 0 To Grid.Columns.Count - 1 Step 1
StrWidth(z) = Grid.Columns(z).DataField
Next z
'Измерение максимальной ширины текстовых данных в
'столбцах DBGrid
DataReport.Recordset.MoveFirst
For i = 0 To DataReport.Recordset.RecordCount - 1
For z = 0 To Grid.Columns.Count - 1 Step 1
Str = DataReport.Recordset.Fields(Grid.Columns(z).DataField).Value
If Len(Str) > Len(StrWidth(z)) Then
'Проверка на превышение допустимой длины строки
If Printer.TextWidth(Str) > 25 * x Then
StrWrap = Left(Str, InStr(w + 1, Str, " ", vbTextCompare) - 1)
VarWidth:
If Printer.TextWidth(StrWrap) < 25 * x Then
w = InStr(w + 1, Str, " ") ' следующая позиция пробела
StrWrap = Left(Str, InStr(w + 1, Str, " ", vbTextCompare) - 1)
If Not InStr(w + 1, Str, " ", vbTextCompare) - 1 = 0 Then GoTo VarWidth
End If
StrWidth(z) = StrWrap
GoTo 610
End If
StrWidth(z) = Grid.Columns(z).Text
610 End If
Next z
DataReport.Recordset.MoveNext
Next i
DataReport.Recordset.MoveFirst
Str = 0
c = 1
xx = 12
For z = 0 To Grid.Columns.Count - 1 Step 1
StWidth(z) = Printer.TextWidth(StrWidth(z))
OStrWidth = OStrWidth + StWidth(z)
Next z
'Учет незадействованной ширины листа и равномерное
'распределение ее по столцам
Dob = (Printer.ScaleWidth - OStrWidth - 1847) / _
(Grid.Columns.Count - 1)
If Dob < 1 Then GoTo 10
NumDob = (Printer.ScaleWidth - OStrWidth - 1847) / Dob
For z = 0 To NumDob Step 1
StWidth(z) = StWidth(z) + Dob
Next z
'*********************
'Формирование таблицы
'*********************
'Печать заголовка таблицы Grid
10 xx = 8
title = Grid.Caption
c = c + 1
Printer.FontSize = 8
Printer.CurrentX = (Printer.ScaleWidth - Printer.TextWidth(title)) / 2
Printer.CurrentY = Y * c
Printer.Print title
c = c + 1
'Печать вертикальной линии шапки таблицы
Printer.DrawWidth = 2
Printer.Line (x * 8, Y * c)-(x * 94, Y * c)
Printer.DrawWidth = 1
'Печать названий столбцов
For z = 0 To Grid.Columns.Count - 1 Step 1
sss(z) = Grid.Columns(z).DataField
Printer.CurrentX = x * (xx + 0.4)
Printer.CurrentY = Y * (c + 0.2)
Printer.Print sss(z)
xx = xx + (StWidth(z) / (Printer.ScaleWidth / 100))
Next z
xx = 8
'Печать вертикальных разделительных линий
For z = 0 To Grid.Columns.Count - 1 Step 1
If z = 0 Then
Printer.DrawWidth = 2
Else
Printer.DrawWidth = 1
End If
Printer.Line (x * xx, Y * c)-(x * xx, Y * (c + 1))
xx = xx + (StWidth(z) / (Printer.ScaleWidth / 100))
Next z
Printer.DrawWidth = 2
Printer.Line (x * 94, Y * c)-(x * 94, Y * (c + 1))
Printer.DrawWidth = 1
c = c + 1
xx = 8
'**************
'Печать данных
'**************
DataReport.Recordset.MoveFirst
For i = 0 To DataReport.Recordset.RecordCount - 1
For z = 0 To Grid.Columns.Count - 1 Step 1
'******************************************************
'Проверка, не превысило ли количество строк назначенное
'для страницы значение
If c > 38 Then
'Завершение текущей страницы
Printer.CurrentX = x * 84
Printer.CurrentY = Y * (39.1)
Printer.Print "Стр. "; Printer.page
Printer.DrawWidth = 2
Printer.Line (x * 8, Y * c)-(x * 94, Y * c)
Printer.DrawWidth = 1
'**********************
'Начало новой страницы
'**********************
Printer.NewPage
c = 1
'Печать верхней линии шапки таблицы
Printer.DrawWidth = 2
Printer.Line (x * 8, Y * c)-(x * 94, Y * c)
Printer.DrawWidth = 1
'Печать названия столбцов
For zz = 0 To Grid.Columns.Count - 1 Step 1
sss(zz) = Grid.Columns(zz).DataField
Printer.CurrentX = x * (xx + 0.4)
Printer.CurrentY = Y * (c + 0.2)
Printer.Print sss(zz)
xx = xx + (StWidth(zz) / (Printer.ScaleWidth / 100))
Next zz
xx = 8
'Печать вертикальных разделительных линий
For zz = 0 To Grid.Columns.Count - 1 Step 1
If zz = 0 Then
Printer.DrawWidth = 2
Else
Printer.DrawWidth = 1
End If
Printer.Line (x * xx, Y * c)-(x * xx, Y * (c + 1))
xx = xx + (StWidth(zz) / (Printer.ScaleWidth / 100))
Next zz
'Печать крайней правой вертикальной линии
Printer.DrawWidth = 2
Printer.Line (x * 94, Y * c)-(x * 94, Y * (c + 1))
Printer.DrawWidth = 1
c = c + 1
xx = 8
End If
'Окончание цикла, предназначенного для перехода на новую
'страницу
'************************************************************
'печать данных
Printer.CurrentX = x * (xx + 0.4)
Printer.CurrentY = Y * (c + 0.2)
Str = DataReport.Recordset.Fields(Grid.Columns(z) _
.DataField).Value
'проверка, не превышает ли длина данных в строке
'величину в 25 позиций печати для последующей
'организации переноса оставшейся части строки
If Printer.TextWidth(Str) > 25 * x Then
Transportation:
StrWrap = Left(Str, InStr(w + 1, Str, " ") - 1)
If Printer.TextWidth(StrWrap) < 25 * x Then
w = InStr(w + 1, Str, " ")
GoTo Transportation
End If
Str = StrWrap
'Установка флага переноса строки
FlagStrWrap(z) = 1
xRom = xx
StrWrapOst = Mid(DataReport.Recordset.Fields(Grid.Columns(z) _
.DataField).Value, Len(Str) + 1)
Else
FlagStrWrap(z) = 0
End If
Printer.Print Str
xx = xx + (StWidth(z) / (Printer.ScaleWidth / 100))
Next z
'Печать вертикальных разделительных линий
xx = 8
For z = 0 To Grid.Columns.Count - 1 Step 1
If z = 0 Then
Printer.DrawWidth = 2
Else
Printer.DrawWidth = 1
End If
Printer.Line (x * xx, Y * c)-(x * xx, Y * (c + 1))
xx = xx + (StWidth(z) / (Printer.ScaleWidth / 100))
Next z
Printer.DrawWidth = 2
Printer.Line (x * 94, Y * c)-(x * 94, Y * (c + 1))
Printer.DrawWidth = 1
Printer.Line (x * 8, Y * c)-(x * 94, Y * c)
c = c + 1
DataReport.Recordset.MoveNext
'*****************************************
'Печать остатка строки
'*****************************************
For zz = 0 To Grid.Columns.Count - 1 Step 1
If FlagStrWrap(zz) = 1 Then
xx = xRom
Printer.CurrentX = x * (xx + 0.4)
Printer.CurrentY = Y * (c + 0.2)
Printer.Print StrWrapOst
xx = 8
For zzz = 0 To Grid.Columns.Count - 1 Step 1
If zzz = 0 Then
Printer.DrawWidth = 2
Else
Printer.DrawWidth = 1
End If
Printer.Line (x * xx, Y * c)-(x * xx, Y * (c + 1))
Printer.DrawWidth = 2
Printer.Line (x * 94, Y * c)-(x * 94, Y * (c + 1))
Printer.DrawWidth = 1
xx = xx + (StWidth(zzz) / (Printer.ScaleWidth / 100))
Next zzz
c = c + 1
End If
Next zz
xx = 8
Next i
DataReport.Recordset.MoveFirst
Printer.DrawWidth = 1
Printer.Line (x * 8, Y * c)-(x * 94, Y * c)
'Печать суммирующей строки из DBGrid Grid2
For z = 0 To Grid.Columns.Count - 1 Step 1
If z = Grid.Columns.Count - 3 Then
Printer.CurrentX = x * (xx + 0.4)
Printer.CurrentY = Y * (c + 0.2)
'Печать названия итоговой величины из DBGrid Grid2
Printer.Print Grid2.Columns(0).DataField
End If
If z = Grid.Columns.Count - 1 Then
Printer.CurrentX = x * (xx + 0.4)
Printer.CurrentY = Y * (c + 0.2)
'Печать итоговой суммы из DBGrid Grid2
Printer.Print Grid2.Columns(0).Text
End If
xx = xx + (StWidth(z) / (Printer.ScaleWidth / 100))
Next z
Printer.DrawWidth = 2
Printer.Line (x * 8, Y * c)-(x * 8, Y * (c + 1))
Printer.Line (x * 94, Y * c)-(x * 94, Y * (c + 1))
c = c + 1
Printer.Line (x * 8, Y * c)-(x * 94, Y * c)
Printer.DrawWidth = 1
Printer.CurrentX = x * 84
Printer.CurrentY = Y * 39.1
Printer.Print "Стр. "; Printer.page
'Завершение построения отчета и физическая печать
MousePointer = 0
Printer.EndDoc
PrintError:
MousePointer = 0
End Sub
|