Процедура печати из 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

к оглавлению
Используются технологии uCoz