// 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; |