Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.04;
Скачать: CL | DM;

Вниз

Печать StringGrid   Найти похожие ветки 

 
Павел   (2004-03-11 23:45) [0]

Подскажите, пожалуйста, как просто и красиво распечатать таблицу StringGrid. В ячецках хранятся значения расчетов. Столбцов 5-6. Спасибо


 
Nekto   (2004-03-11 23:53) [1]

Ууу. Здесь тебе придется разбираться. Я сам с принтером разбирался, но с Memo. Затем поменял на RichEdit. Вроде у меня работает.


 
трактор   (2004-03-12 10:38) [2]

Королевстве Дельфи есть статья Жабасова и его же компонент на эту тему. Ищи там.


 
Zheks ©   (2004-03-12 11:08) [3]

Подключи этот унит
{
unit GrdPrn3;

interface

uses
Windows, Classes, Graphics, Grids, Printers, SysUtils;

const
OrdinaryLineWidth: Integer = 2;
BoldLineWidth: Integer = 4;

var otst : integer;

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

// не проверяет, вылезает ли общая длина таблицы за пределы страницы
// Слишком длинное слово обрежется

implementation

procedure 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
var
i, j, d, TotalPrevH, TotalPrevW, CellH, CellW, LineWidth: Integer;
R: TRect;
s: string;

 procedure CorrectCellHeight(ARow: Integer);
 // вычисление правильной высоты ячейки с учетом многострочного текста
 // Текст рабивается только по словам слишком длинное слово обрубается
 var
  i, 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 or DT_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 or DT_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 := 8;

Grid.Canvas.Font := Grid.Font;
Scale := DestCanvas.TextWidth("test")/Grid.Canvas.TextWidth("test");

d := Round(2*Scale);
TotalPrevH := 0;

for j := 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);

 if TopMargin + TotalPrevH + CellH > YFloor then
 begin
  Result := j; // j-я строка не помещается в заданный диапазон
  if Result < 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,
    totalPrevH + 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 or DT_TOP or DT_WORDBREAK or DT_NOPREFIX);

  TotalPrevW := TotalPrevW + CellW; // Общая ширина всех предыдущих колонок
 end;

 TotalPrevH := TotalPrevH + CellH;  // Общая высота всех предыдущих строк
 if (TotalPrevH - CellH  > 0) then otst := TotalPrevH - CellH
    else otst := TotalPrevH;
end;
end;

end.
}

Вот так используй:
procedure TForm1.ToolButton4Click(Sender: TObject);
var K: Double;
begin
Printer.BeginDoc;
K :=  Printer.Canvas.Font.PixelsPerInch / Canvas.Font.PixelsPerInch*1.2;

PrintStringGrid(AdvStringGrid1,
 K,  // Коэффициент
 200, // отступ от края листа в пихелах по Х
 200, // --"-- по Y
 200  // отступ снизу
 );
Printer.EndDoc;
end;



Страницы: 1 вся ветка

Текущий архив: 2004.04.04;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.03 c
7-1075097747
mich@el
2004-01-26 09:15
2004.04.04
Определение занятости файла


14-1078992146
icebeerg
2004-03-11 11:02
2004.04.04
XP W2k и принтер


4-1074795270
-=GaLaN=-
2004-01-22 21:14
2004.04.04
Обработка сообщения с приемом данных


6-1075125258
nesovsemlamer
2004-01-26 16:54
2004.04.04
Передача изображения рабочего стола по протоколу TCP


1-1079543066
Chcnger
2004-03-17 20:04
2004.04.04
Факториал