Thema: Delphi String Grid drucken

Einzelnen Beitrag anzeigen

Crazymodder

Registriert seit: 28. Dez 2006
69 Beiträge
 
#1

String Grid drucken

  Alt 2. Apr 2007, 18:17
Hi alle hab nochmal ein kleines Problem:
Hab folgede Prozdeur zum drucken von String Grids gefunden Quelle: www.dsdt.info


Delphi-Quellcode:
uses printers;

//StringGrid-Inhalt ausdrucken
procedure PrintStringGrid(Grid: TStringGrid; Title: String; Orientation:TPrinterOrientation);
var
  P, I, J, YPos, XPos, HorzSize, VertSize: Integer;
  AnzSeiten, Seite, Zeilen, HeaderSize, FooterSize, ZeilenSize, FontHeight: Integer;
  mmx, mmy: Extended;
  Footer: String;
begin
  //Kopfzeile, Fußzeile, Zeilenabstand, Schriftgröße festlegen
  HeaderSize := 100;
  FooterSize := 200;
  ZeilenSize := 36;
  FontHeight := 36;
  //Printer initializieren
  Printer.Orientation := Orientation;
  Printer.Title := Title;
  Printer.BeginDoc;
  //Druck auf mm einstellen
  mmx := GetDeviceCaps(Printer.Canvas.Handle, PHYSICALWIDTH) /
    GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSX) * 25.4;
  mmy := GetDeviceCaps(Printer.Canvas.Handle, PHYSICALHEIGHT) /
    GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSY) * 25.4;
  VertSize := Trunc(mmy)*10;
  HorzSize := Trunc(mmx)*10;
  SetMapMode(Printer.Canvas.Handle, MM_LOMETRIC);

  //Zeilenanzahl festlegen
  Zeilen := (VertSize - HeaderSize - FooterSize) div ZeilenSize;
  //Seitenanzahl ermitteln
  if Grid.RowCount mod Zeilen <> 0 then
    AnzSeiten := Grid.RowCount div Zeilen + 1
  else
    AnzSeiten := Grid.RowCount div Zeilen;

  Seite := 1;
  //Grid drucken
  for P := 1 to AnzSeiten do
  begin
    //Kopfzeile
    Printer.Canvas.Font.Height := 48;
    Printer.Canvas.TextOut((HorzSize div 2 - (Printer.Canvas.TextWidth(Title) div 2)),
      -20, Title);
    Printer.Canvas.Pen.Width := 5;
    Printer.Canvas.MoveTo(0, -HeaderSize);
    Printer.Canvas.LineTo(HorzSize, -HeaderSize);
    //Fußzeile
    Printer.Canvas.MoveTo(0, -VertSize+FooterSize);
    Printer.Canvas.LineTo(HorzSize, -VertSize+FooterSize);
    Printer.Canvas.Font.Height := 36;
    Footer := 'Seite: ' + IntToStr(Seite) + ' von ' + IntToStr(AnzSeiten);
    Printer.Canvas.TextOut((HorzSize div 2 - (Printer.Canvas.TextWidth(Footer) div 2)),
      -VertSize+150, Footer);
    //Zeilen drucken
    Printer.Canvas.Font.Height := FontHeight;
    YPos := HeaderSize + 10;
    for I := 1 to Zeilen do
    begin
      if Grid.RowCount >= I + (Seite-1)*Zeilen then
      begin
        XPos := 0;
        for J := 0 to Grid.ColCount - 1 do
        begin
          Printer.Canvas.TextOut(XPos, -YPos, Grid.Cells[J,I+(Seite-1)*Zeilen-1]);
          XPos := XPos + Grid.ColWidths[J]*3;
        end;
        YPos := YPos + ZeilenSize;
      end;
    end;
    //Seite hinzufügen
    Inc(Seite);
    if Seite <= AnzSeiten then Printer.NewPage;
  end;
  Printer.EndDoc;
end;

//Example
procedure TForm1.Button1Click(Sender: TObject);
begin
  //Drucken im Querformat
  PrintStringGrid(Grid,'StringGrid Print Landscape', poLandscape);
  //Drucken im Hochformat
  PrintStringGrid(Grid,'StringGrid Print Portrait', poPortrait);
end;
Naja klappt auch alles ganz gut nur Ich würde gerne das er auch die Linie mit druckt. Jetzt druckt er zwar alles aber ohne die tabelle. Und die Überschrift wprde ich auch gerne von StringGrid1 Landscape in was anderes ändern wäre sehr nett wenn mir jemand sagen könnte wie ich das am besten realiseiren kann.
Danke im Vorraus
Crazymodder
  Mit Zitat antworten Zitat