// 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 etwa der selben
// Größe, wie auf einem 800x600 Bildschirm. Bei anderen Werten sollte die
// Schrift des Grids ein TrueType-Font sein.
// 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
DBGrids drucken

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


 
Zugriffe seit 6.9.2001 auf Delphi-Ecke