Registriert seit: 21. Aug 2003
7.332 Beiträge
Delphi 2009 Professional
|
Re: Problem bei StringGrid drucken
22. Mai 2008, 16:13
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;
|