Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Interface. usesWindows, SysUtils,Grids, Dialogs, StdCtrls, Printers;

Читайте также:
  1. Interface
  2. Interface
  3. Interface
  4. Interface
  5. Interface

uses Windows, SysUtils,Grids, Dialogs, StdCtrls, Printers;

//процедура печати StringGrid

procedure PrintGrid(Grid:TStringGrid; Caption:TLabel);

Implementation

//==============================PrintGrid=======================================

procedure PrintGrid(Grid:TStringGrid; Caption:TLabel); // процедура печати StringGrid

Var

s, st: String; // отступы (поля) сверху и слева страницы

LeftMarg, TopMarg: Integer; // переменная для хранения значения отступа сверху от страницы для текущей

CurrLine, // строки (в пикселях)

LeftBorder, // переменная для хранения значения отступа слева от страницы для положения левой границы текущей ячейки (в пикселях)

RightBorder, // тоже для правой границы текущей ячейки

TopBorder, // переменная для хранения значения отступа сверху от страницы для положения верхней границы текущей ячейки (в пикселях)

BottomBorder, // тоже для нижней границы текущей ячейки

Row, // текущая строка таблицы

Col: Integer; // текущий столбец таблицы

LeftOffset: Integer; // отступ текста от левой границы ячейки

PageCount: Integer; // счетчик страниц

PageEnded: Boolean; // флаг конца страницы

PageCountPrnPos: Integer; // позиция для печати номеров страниц

PrintDialog: TPrintDialog; // диалог принтера

Begin

PrintDialog:= TPrintDialog.Create(Nil); // создадим диалог принтера

if not PrintDialog.Execute // и покажем его

then Exit;

LeftMarg:= Printer.PageWidth Div 100 * 5; // левый отступ 5% от ширины страницы принтера

TopMarg:= Printer.PageHeight Div 100 * 3; // верхний отступ 3% от высоты страницы принтера

CurrLine:= TopMarg; // инициализируем переменную "отступ сверху"

LeftOffset:= (Printer.PageWidth - LeftMarg) * 10 Div Grid.Width; // инициализируем отступ от левого края ячейки

PageCount:= 1; // инициализируем количество страниц

PageEnded:= False; // инициализируем флаг, сигнализирующий, что печатается страниц более чем одна

PageCountPrnPos:= 0; // инициализируем позицию для печати страницы

Printer.BeginDoc; // начнем печать

// печать заголовка

if not (Caption = Nil) then // если заголовок задан (TLabel)

begin {заголовок есть}

s:= caption.caption;

st:= s;

Printer.Canvas.Font:= Caption.Font; // установим фонт печати такой же, как и у заголовка

Printer.Canvas.TextOut(LeftMarg, CurrLine, st); // напечатем заголовок посередине листа

CurrLine:= CurrLine+Printer.Canvas.TextHeight(Caption.Caption); // отступим 1 высоту текста заголовка

end;

CurrLine:= CurrLine+Printer.Canvas.TextHeight(Caption.Caption); // отступим 1 высоту текста заголовка

Printer.Canvas.Font:= Grid.Font; // установим фонт такой же, как и в таблице

Printer.Canvas.Pen.Width:= 1; // установим толшину печати рамок

for Row:= 0 to Grid.RowCount-1 do // пройдемся по каждой строке таблицы

Begin

LeftBorder:= 0; // левая граница текущей ячейки

RightBorder:= 0; // правая граница текущей ячейки

for Col:= 0 to Grid.ColCount - 1 do // пройдемся по каждому столбцу

Begin

if (Grid.Cells[0,0] = '') then

Grid.Cells[0,0]:= ' '; // этот код нужен для исключения возникновения ошибки в следующих строках

TopBorder:= CurrLine - Printer.Canvas.TextHeight(Grid.Cells[0, 0]); // вычислим положение верхней границы текущей ячейки в зависимости от высоты печатаемого текста (текст берется из левой верхней ячейки)

BottomBorder:= CurrLine+Printer.Canvas.TextHeight(Grid.Cells[0, 0]); // вычислим положение нижней границы на том же принципе

RightBorder:= RightBorder+Grid.ColWidths[Col] * LeftOffset Div 10; // вычислим текущее положение правой границы

Printer.Canvas.Rectangle(LeftBorder + LeftMarg, TopBorder, RightBorder + LeftMarg, BottomBorder); //напечатаем границы ячейки

// напечатаем текст

Printer.Canvas.TextOut(LeftBorder + LeftMarg + Printer.Canvas.TextWidth(Grid.Cells[0, 0]) div 20,

CurrLine - Printer.Canvas.TextHeight(Grid.Cells[0, 0]) div 2,

Grid.Cells[Col, Row]);

LeftBorder:= LeftBorder+Grid.ColWidths[Col] * LeftOffset Div 10; // вычислим левую границу следующей ячейки

end;

CurrLine:= CurrLine+Printer.Canvas.TextHeight(Grid.Cells[0, 0]) * 2; // перейдем на следующую строку

if CurrLine > (Printer.PageHeight - TopMarg * 2) then // проверим достижение конца листа принтера

Begin

CurrLine:= CurrLine + Printer.Canvas.TextHeight(Grid.Cells[1, 0]); // переход на нижнее поле страницы для печати номера страницы

PageCountPrnPos:= CurrLine; // позиция для печати номера страницы

Printer.Canvas.TextOut(LeftMarg, PageCountPrnPos, 'Страница ' + IntToStr(PageCount)); // печатаем номер страницы

Inc(PageCount); // увеличение счетчика страниц

PageEnded:= True; // конец страницы достигнут

CurrLine:= TopMarg; // обнуление текущей позиции строки для печати новой страницы

Printer.NewPage; // проброс листа в принтере

end;

end;

if (PageCount > 1) and (PageEnded) then {печать номера страницы}

Begin

Printer.Canvas.TextOut(LeftMarg, PageCountPrnPos, 'Страница ' + IntToStr(PageCount));

end;

Printer.EndDoc; // закончим печать

PrintDialog.Free; // освободим диалог печати

end;

end.

 

4 UNIT PROGRAMM

unit Programm;


Дата добавления: 2015-10-13; просмотров: 71 | Нарушение авторских прав


Читайте в этой же книге: Implementation 4 страница | Else begin | Interface |
<== предыдущая страница | следующая страница ==>
Interface| Загальна частина

mybiblioteka.su - 2015-2024 год. (0.016 сек.)