// Abgeleitet von
StringGrids drucken
wird mit dem folgenden
Code ein
uses Printers;
const
bm: TBookmark = nil;
procedure DBGridDruck(grd: TDBGrid; links, oben, vonSpalte, bisSpalte,
vonZeile, bisZeile: word; scal: double; Kopf: boolean);
var
x, y, li, ob, re, un, waag, senk, a, anzs, anzw, anfang: integer;
ausrichtung: UInt;
r: Trect;
function rech(i, j: integer; scl: double): integer;
begin
result := round(((i * j) / 72) * scl);
end;
function getlinks: integer;
begin
result := getdevicecaps(printer.handle, physicaloffsetx) + 1 + links;
end;
function getrechts(i: integer): integer;
begin
result := li + rech(TStringgrid(grd).ColWidths[i] + 1, waag, scal);
end;
procedure makeHeader;
var i: integer;
begin
printer.canvas.Brush.color := grd.fixedcolor;
li := getlinks;
for i := vonSpalte to bisSpalte do begin
re := getrechts(i);
un := anfang + rech(TStringgrid(grd).RowHeights[0] + 1, senk, scal);
printer.canvas.rectangle(li, anfang, re + 2, un + 2);
r := rect(li + a, anfang + 1, re - a, un - 2);
drawtext(printer.canvas.handle,
pchar(grd.datasource.dataset.Fields.Fields[i - 1].Displayname),
-1, r, DT_SINGLELINE or DT_VCENTER);
li := re;
end;
anfang := un;
end;
begin
if not grd.datasource.dataset.active then exit;
anzs := grd.datasource.dataset.recordcount;
anzw := grd.columns.count;
if vonZeile > anzs then exit;
if bisZeile > anzs then bisZeile := anzs;
if vonSpalte > anzw then exit;
if bisSpalte > anzw then bisSpalte := anzw;
if vonZeile = 0 then inc(vonZeile);
grd.datasource.dataset.DisableControls;
waag := getdevicecaps(printer.handle, logpixelsx);
senk := getdevicecaps(printer.handle, logpixelsy);
links := rech(links, waag, 1);
oben := rech(oben, senk, 1);
a := rech(3, waag, scal);
bm := grd.datasource.dataset.getbookmark;
with printer do begin
title := 'DBGrid-Druck';
BeginDoc;
canvas.font := TStringgrid(grd).font;
canvas.font.size := trunc((TStringgrid(grd).font.size / 0.72) * scal);
canvas.pen.width := 1;
anfang := getdevicecaps(printer.handle, physicaloffsety) + 1 + oben;
if Kopf then makeHeader;
ob := anfang;
grd.datasource.dataset.first;
grd.datasource.dataset.moveby(vonZeile - 1);
for y := vonZeile to bisZeile do begin
li := getlinks;
for x := vonSpalte to bisSpalte do begin
re := getrechts(x);
if (x > 0) and (grd.datasource.dataset.Fields.Fields[x - 1].Datatype
in [ftInteger, ftSmallint, ftWord, ftFloat, ftCurrency, ftLargeint])
then ausrichtung := DT_RIGHT else ausrichtung := DT_LEFT;
if (x = 0) then canvas.Brush.color := grd.fixedcolor
else canvas.Brush.color := grd.color;
un := ob + rech(TStringgrid(grd).RowHeights[y] + 1, senk, scal);
canvas.rectangle(li, ob, re + 2, un + 2);
r := rect(li + a, ob + 1, re - a, un - 2);
if (x > 0) then drawtext(canvas.handle,
pchar(grd.datasource.dataset.Fields.Fields[x - 1].AsString),
-1, r, DT_SINGLELINE or DT_VCENTER or ausrichtung);
li := re;
end;
grd.datasource.dataset.next;
ob := un;
end;
enddoc;
end;
grd.datasource.dataset.gotobookmark(bm);
grd.datasource.dataset.freebookmark(bm);
bm := nil;
grd.datasource.dataset.EnableControls;
end;
// Beispielaufruf
procedure TForm1.Button2Click(Sender: TObject);
begin
DBGriddruck(DBGrid1, 20, 30, 1, maxword, 1, maxword, 0.75, true);
end;
|





