Читайте также: |
|
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 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Interface | | | Загальна частина |