Registriert seit: 20. Mai 2008
19 Beiträge
Delphi 6 Personal
|
Problem bei StringGrid drucken
22. Mai 2008, 15: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;
|