Delphi - объектно-ориентированный язык программирования, разработанный компанией Borland в 1995 году. Он основан на языке программирования Pascal, но имеет более расширенные возможности и добавлены новые функции.
Delphi является интегрированной средой разработки (IDE), которая позволяет разрабатывать программное обеспечение для различных платформ, включая Windows, macOS, Android и iOS. Delphi достигает многоплатформенности с помощью...
procedureTForm1.Button1Click(Sender: TObject); var
K: Double; begin
Printer.BeginDoc; K := Printer.Canvas.Font.PixelsPerInch / Canvas.Font.PixelsPerInch*1.2; PrintStringGrid(StrGrid, K, // Коэффициент 200, // отступ от края листа в пихелах по Х 200, // --"-- по Y 200 // отступ снизу ); Printer.EndDoc; end
;
{----------------------------------------------------------} unitGrdPrn3; interface
uses
Windows, Classes, Graphics, Grids, Printers, SysUtils; const
OrdinaryLineWidth: Integer = 2; BoldLineWidth: Integer = 4; procedure
PrintStringGrid(Grid: TStringGrid; Scale: Double; LeftMargin, TopMargin, BottomMargin: Integer); function
DrawStringGridEx(Grid: TStringGrid; Scale: Double; FromRow, LeftMargin, TopMargin, Yfloor: Integer; DestCanvas: TCanvas): Integer;
// возвращает номер строки, которая не поместилась до Y = Yfloor // не проверяет, вылезает ли общая длина таблицы за пределы страницы // Слишком длинное слово обрежется implementationprocedure
PrintStringGrid(Grid: TStringGrid; Scale: Double; LeftMargin, TopMargin, BottomMargin: Integer); var
NextRow: Integer; begin
//Printer.BeginDoc; if
not
Printer.Printing then
raise
Exception.Create('function PrintStringGrid must be called between Printer.BeginDoc and
Printer.EndDoc'); NextRow := 0; repeat
NextRow := DrawStringGridEx(Grid, Scale, NextRow, LeftMargin, TopMargin, Printer.PageHeight - BottomMargin, Printer.Canvas); if
NextRow <> -1 then
Printer.NewPage; until
NextRow = -1;
//Printer.EndDoc; end; function
DrawStringGridEx(Grid: TStringGrid; Scale: Double; FromRow, LeftMargin, TopMargin, Yfloor: Integer; DestCanvas: TCanvas): Integer;
// возвращает номер строки, которая не поместилась до Y = Yfloor vari, j, d, TotalPrevH, TotalPrevW, CellH, CellW, LineWidth: Integer; R: TRect; s: string
; procedure
CorrectCellHeight(ARow: Integer);
// вычисление правильной высоты ячейки с учетом многострочного текста // Текст рабивается только по словам слишком длинное слово обрубается vari, H: Integer; R: TRect; s: string
; begin
R := Rect(0, 0, CellH*2, CellH); s := ':)';
// Одинарная высота строки CellH := DrawText(DestCanvas.Handle, PChar(s), Length(s), R, DT_LEFT orDT_TOP or
DT_WORDBREAK or
DT_SINGLELINE or
DT_NOPREFIX or
DT_CALCRECT) + 3*d; for
i := 0 to
Grid.ColCount-1 do
begin
CellW := Round(Grid.ColWidths[i]*Scale); R := Rect(0, 0, CellW, CellH);
//InflateRect(R, -d, -d); R.Left := R.Left+d; R.Top := R.Top + d; s := Grid.Cells[i, ARow]; // Вычисление ширины и высоты H := DrawText(DestCanvas.Handle, PChar(s), Length(s), R, DT_LEFT orDT_TOP or
DT_WORDBREAK or
DT_NOPREFIX or
DT_CALCRECT); текста if
CellH < H + 2*d then
CellH := H + 2*d;
// if CellW < R.Right - R.Left then Слишком длинное слово - // не помещается в одну строку; Перенос слов не поддерживается end; end
; begin
Result := -1;
// все строки уместились между TopMargin и Yfloor if(FromRow < 0)or
(FromRow >= Grid.RowCount) then
Exit; DestCanvas.Brush.Style := bsClear; DestCanvas.Font := Grid.Font;
// DestCanvas.Font.Height := Round(Grid.Font.Height*Scale); DestCanvas.Font.Size := 10; Grid.Canvas.Font := Grid.Font; Scale := DestCanvas.TextWidth('test')/Grid.Canvas.TextWidth('test'); d := Round(2*Scale); TotalPrevH := 0; forj := 0 to
Grid.RowCount-1 do
begin
if
(j >= Grid.FixedRows) and
(j < FromRow) then
Continue;
// Fixed Rows рисуются на каждой странице TotalPrevW := 0; CellH := Round(Grid.RowHeights[j]*Scale); CorrectCellHeight(j); ifTopMargin + TotalPrevH + CellH > YFloor then
begin
Result := j;
// j-я строка не помещается в заданный диапазон ifResult < Grid.FixedRows then
Result := -1;
// если фиксированные строки не влезают на страницу - // это тяж¸лый случай... Exit; end; for
i := 0 to
Grid.ColCount-1 do
begin
CellW := Round(Grid.ColWidths[i]*Scale); R := Rect(TotalPrevW, TotalPrevH, TotalPrevW + CellW, otalPrevH + CellH); OffSetRect(R, LeftMargin, TopMargin); if
(i < Grid.FixedCols)or
(j < Grid.FixedRows) then
LineWidth := BoldLineWidth else
LineWidth := OrdinaryLineWidth; DestCanvas.Pen.Width := LineWidth; if
LineWidth > 0 then
DestCanvas.Rectangle(R.Left, R.Top, R.Right+1, R.Bottom+1);
//InflateRect(R, -d, -d); R.Left := R.Left+d; R.Top := R.Top + d; s := Grid.Cells[i, j]; DrawText(DestCanvas.Handle, PChar(s), Length(s), R, DT_LEFT orDT_TOP or
DT_WORDBREAK or
DT_NOPREFIX); TotalPrevW := TotalPrevW + CellW;
// Общая ширина всех предыдущих колонок end; TotalPrevH := TotalPrevH + CellH;
// Общая высота всех предыдущих строк end; end
; end
.