// Abgeleitet von StringGrids drucken wird mit dem folgenden Code ein
// DBGrid
(bzw. Teile davon) ausgedruckt. Mit der Variablen "Kopf"
// wird gesteuert, ob die Feldnamen als Spaltenkopf gedruckt werden.
// So kann man beispielsweise bei der Verteilung des Grids auf
// mehrere Seiten jeweils die Feldnamen oben anzeigen lassen.


// Getestet mit D4 unter WinME

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;


Zugriffe seit 6.9.2001 auf Delphi-Ecke