Drukowanie tstringgrid

0

Jak wydrukowac zawartosc tstringgrida?

0

uses
Printers;

procedure PrintGrid(sGrid: TStringGrid; sTitle: string);
var
X1, X2: Integer;
Y1, Y2: Integer;
TmpI: Integer;
F: Integer;
TR: TRect;
begin
Printer.Title := sTitle;
Printer.BeginDoc;
Printer.Canvas.Pen.Color := 0;
Printer.Canvas.Font.Name := 'Times New Roman';
Printer.Canvas.Font.Size := 12;
Printer.Canvas.Font.Style := [fsBold, fsUnderline];
Printer.Canvas.TextOut(0, 100, Printer.Title);
for F := 1 to sGrid.ColCount - 1 do
begin
X1 := 0;
for TmpI := 1 to (F - 1) do
X1 := X1 + 5 * (sGrid.ColWidths[TmpI]);
Y1 := 300;
X2 := 0;
for TmpI := 1 to F do
X2 := X2 + 5 * (sGrid.ColWidths[TmpI]);
Y2 := 450;
TR := Rect(X1, Y1, X2 - 30, Y2);
Printer.Canvas.Font.Style := [fsBold];
Printer.Canvas.Font.Size := 7;
Printer.Canvas.TextRect(TR, X1 + 50, 350, sGrid.Cells[F, 0]);
Printer.Canvas.Font.Style := [];
for TmpI := 1 to sGrid.RowCount - 1 do
begin
Y1 := 150 * TmpI + 300;
Y2 := 150 * (TmpI + 1) + 300;
TR := Rect(X1, Y1, X2 - 30, Y2);
Printer.Canvas.TextRect(TR, X1 + 50, Y1 + 50, sGrid.Cells[F, TmpI]);
end;
end;
Printer.EndDoc;
end;

0

Coz, to nie bedzie wygladac dokladnie tak samo jak na formi. Ja bym raczej odczytal w petli kolory pikseli i zapisal:
Printer.Canvas.Pixels[x, y]:= Kolor;
Potem trzeba by to bylo ewentualnie jakos przeskalowac, poniewaz kartka ma dla drukarki duza wieksza rozdzielczosc niz monitor.

0

Ja od razu wspomnę o takim dobrodziejstwie jak ScanLine, bo przez Canvas.Pixels bitmapa 200x200px będzie się kopiować około minuty... Poza tym czemu piksel po pikselu? Wystarczy StrechtDraw z rozmiarem docelowym wyliczonm na podst. dpi drukarki...

0

Aha, zapomnialem wspomniec o wadzie tego rozwiazania. Jesli np. zrobisz malego StringGrida i potem wydrukujesz go na cala kartke, to bedzie nieostry, bo rozdzielczosc drukowania bedzie niewykorzystana. Tak wiec w zaleznosci od sytuacji czasem lepsza bedzie ta pierwsza metoda, czasem druga.

PS: Wydaje mi sie, ze jest jakis komponent do drukowania StringGrida w raporcie (ale moze mi sie tylko zdaje :) )

0

a ja bym użył zwyczajnie metody

PaintTo(DC:HDC; X,Y : Integer);

gdzie DC - device context czyli kontekst tego na czym chcemy malowac w tym przypadku to ma byc HDC Canvasa drukarki
X, Y lewy górny narożnik od ktorego zacznie sie malowanie

Uwagi: jak nic jak bedzie trzeba przejsc etap posredni to znaczy najpierw uzyc tej metody do "zrobienia" bitmapy ( mozna za HDC podstawic kontekst Bitmapy a co) i przeskalowania jej do rozdzielczosci drukarki co jest opisane w materialach na tym serwisie

pozdrawiam [cya]

1 użytkowników online, w tym zalogowanych: 0, gości: 1