// Es wird ein
Stringgrid an den Drucker geschickt. Der Einfachheit halber procedure GridDruck(grd: TStringGrid; links, oben, vSpalte, bSpalte, vZeile,
bZeile: integer; scal: double; farbig: boolean);
var
x, y, li, ob, re, un, waag, senk, a: integer;
fix, grund, schrift: TColor;
r: Trect;
function rech(i, j: integer): integer;
begin
result := round(((i * j) / 72) * scal);
end;
begin
if vZeile < 0 then vZeile := 0;
if vSpalte < 0 then vSpalte := 0;
if (bZeile >= grd.rowcount) or (bZeile < 0)
then bZeile := grd.rowcount - 1;
if (bSpalte >= grd.colcount) or (bSpalte < 0)
then bSpalte := grd.colcount - 1;
if vZeile > bZeile then begin
a := vZeile;
vZeile := bZeile;
bZeile := a;
end;
if vSpalte > bSpalte then begin
a := vSpalte;
vSpalte := bSpalte;
bSpalte := a;
end;
if (scal > 0) and (vZeile < grd.rowcount) and (vSpalte < grd.colcount)
then begin
if farbig then begin
fix := grd.fixedcolor;
grund := grd.color;
schrift := grd.font.color;
end else begin
fix := clsilver;
grund := clwhite;
schrift := clblack;
end;
waag := getdevicecaps(printer.handle, logpixelsx);
senk := getdevicecaps(printer.handle, logpixelsy);
links := rech(links, waag);
oben := rech(oben, senk);
li := getdevicecaps(printer.handle, physicaloffsetx) + 1 + links;
a := rech(3, waag);
with printer do begin
title := 'Grid-Druck';
BeginDoc;
if grd.gridlinewidth > 0 then begin
canvas.pen.color := $333333;
canvas.pen.width := 1;
canvas.pen.style := pssolid
end else canvas.pen.style := psclear;
canvas.font := grd.font;
canvas.font.color := schrift;
canvas.font.size := round((grd.font.size / 0.72) * scal);
for x := vSpalte to bSpalte do begin
ob := getdevicecaps(printer.handle, physicaloffsety) + 1 + oben;
re := li + rech(grd.ColWidths[x] + 1, waag);
for y := vZeile to bZeile do begin
un := ob + rech(grd.RowHeights[y] + 1, senk);
if (x < grd.fixedcols) or (y < grd.fixedrows)
then canvas.brush.color := fix
else canvas.brush.color := grund;
canvas.rectangle(li, ob, re + 2, un + 2);
r := rect(li + a, ob + 1, re - a, un - 2);
drawtext(canvas.handle, pchar(grd.Cells[x, y]), length(grd.Cells[x, y]),
r, DT_SINGLELINE or DT_VCENTER);
ob := un;
end;
li := re;
end;
enddoc;
end;
end;
end;
// Beispielaufrufe
// Ein Grid wird an der äußersten Druckkante in Originalgröße ausgegeben
procedure TForm1.Button1Click(Sender: TObject);
begin
griddruck(stringgrid1, 0, 0, -1, -1, -1, -1, 1, true);
end;
// Die ersten 3 x 3 Zellen werden mit Randabstand wie auf der Form ausgegeben
procedure TForm1.Button2Click(Sender: TObject);
begin
griddruck(stringgrid1, stringgrid1.left, stringgrid1.top, 0, 2, 0, 2, 1,
true);
end;
// Ein Grid wird in halber Größe und schwarz/weiss ausgegeben
procedure TForm1.Button1Click(Sender: TObject);
begin
griddruck(stringgrid1, 0, 0, 0, 0, -1, -1, 0.5, false);
end;
// von einem Stringgrid wird je ein Viertel
// auf einer eigenen Seite gedruckt
procedure TForm1.Button1Click(Sender: TObject);
var s, z: integer;
begin
s := stringgrid1.ColCount - 1;
z := stringgrid1.RowCount - 1;
griddruck(stringgrid1, 25, 30, 0, s div 2, 0, z div 2, 1, true);
griddruck(stringgrid1, 25, 30, s div 2 + 1, s, 0, z div 2, 1, true);
griddruck(stringgrid1, 25, 30, 0, s div 2, z div 2 + 1, z, 1, true);
griddruck(stringgrid1, 25, 30, s div 2 + 1, s, z div 2 + 1, z, 1, true);
end;
|





