Einzelnen Beitrag anzeigen

mkpre

Registriert seit: 20. Mai 2008
19 Beiträge
 
Delphi 6 Personal
 
#1

Problem bei StringGrid drucken

  Alt 22. Mai 2008, 14:35
Wenn ich meine StringGrid mit dem Text, den ich hier im Forum gefunden habe über den Button ausdrucken möchte, sendet er es zwar an den Drucker, der mir aber nach ca. 10 min ein leeres Blatt ausdruckt.
Ein Word-Doc. auszudrucken geht aber --> Drucker funktioniert.
Meine Frage ist nun warum die Tabelle nicht zu drucken geht.
Ich hoffe mir kann jmd. helfen.
Delphi-Quellcode:
uses
  printers;

procedure TForm1.Drucken1Click(Sender: TObject);
begin
if PrintDialog1.Execute then
  begin
    Printer.BeginDoc;
  end;
end;

//StringGrid-Inhalt ausdrucken
procedure PrintStringGrid(tab: 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 tab.RowCount mod Zeilen <> 0 then
    AnzSeiten := tab.RowCount div Zeilen + 1
  else
    AnzSeiten := tab.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 tab.RowCount >= I + (Seite - 1) * Zeilen then
      begin
        XPos := 0;

        for J := 0 to tab.ColCount - 1 do
        begin
          Printer.Canvas.MoveTo(Xpos, -YPos);
          Printer.Canvas.LineTo(Xpos+ tab.ColWidths[J] * 3, -YPos);

          Printer.Canvas.MoveTo(Xpos, -YPos);
          Printer.Canvas.LineTo(Xpos, -(YPos+ ZeilenSize));
          
          Printer.Canvas.TextOut(XPos, - YPos,tab.Cells[J, I + (Seite - 1) * Zeilen - 1]);
          XPos := XPos + tab.ColWidths[J] * 3;
        end;
        YPos := YPos + ZeilenSize;
        Printer.Canvas.MoveTo(0, -YPos);
        Printer.Canvas.LineTo(Xpos, -YPos);
      end;
    end;
    //Seite hinzufügen
    Inc(Seite);
    if Seite <= AnzSeiten then Printer.NewPage;
  end;
  Printer.EndDoc;

end;
  Mit Zitat antworten Zitat