Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem bei StringGrid drucken (https://www.delphipraxis.net/114266-problem-bei-stringgrid-drucken.html)

mkpre 22. Mai 2008 14:35


Problem bei StringGrid drucken
 
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;

Die Muhkuh 22. Mai 2008 15:13

Re: Problem bei StringGrid drucken
 
Hi,

versuch es mal so.

Delphi-Quellcode:
uses
  printers;

procedure TForm1.Drucken1Click(Sender: TObject);
begin
if PrintDialog1.Execute then
  begin
    PrintStringGrid(<StringGrid>, <Title>, <Orientation>);
  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
  Printer.BeginDoc;
  //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;

mkpre 22. Mai 2008 15:20

Re: Problem bei StringGrid drucken
 
Danke erstmal.
Sollte die Zeile so lauten, denn < und > will er nicht?
Außerdem ist Title undefiniert, als was soll ich das def. ?
Delphi-Quellcode:
PrintStringGrid(tab, Title, Orientation);


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz