Hi,
das habe ich mal im Netz gefunden. Vielleicht hilf es dir weiter:
Stringgrid drucken
// Es wird ein Stringgrid an den Drucker geschickt. Der Einfachheit halber
// sowie aus Platzgründen werden die Trennstriche zwischen den einzelnen Zellen
// stets nur 1 Pixel breit gezeichnet. Es kann ein Offset von der linken
// und/oder der oberen Druckkante angegeben werden. Diese Werte entsprechen der
// Pixelzahl auf dem Bildschirm, d.h. wenn z.B. das Grid 10 Pixel vom Rand
// der Form liegt, werden diese zehn Pixel proportional in die Anzahl der
// Pixel auf dem Drucker umgerechnet, um den gleichen Abstand vom Rand zu
// gewährleisten wie auf dem Schirm. Mit scal kann die Größe der Ausgabe
// beeinflußt werden. Bei scal=1 erscheint es auf dem Papier in der selben
// Größe, wie auf einem 800x600 Bildschirm.
// Durch Werte in vSpalte (erste zu druckende Spalte), bSpalte (letzte zu
// druckende Spalte), vZeile (erste zu druckende Zeile) und bZeile (letzte
// zu druckende Zeile) erreicht man Teilausdrucke (Zählung beginnt bei 0!).
// Haben diese Variablen negative Werte, wird das gesamte Grid ausgedruckt.
// Zusätzlich kann man angeben, ob das Grid in der Farbe wie auf dem Schirm
// (farbig=true) oder in Schwarz/Weiss (farbig=false) gedruckt werden soll.
// Siehe auch Stringgrids speichern und laden
// Getestet mit D4 unter Win98
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;