Registriert seit: 4. Apr 2005
61 Beiträge
|
Stringrid mit Gitternetzlineien drucken
3. Aug 2005, 12:50
Hallo,
möchte die Daten eines Stinggrids ausdrucken - soweit kein Problem, da gibts ja viele Hinweise! Zur verbesserten Darstellung möchte ich aber mindestens unter jeder Zeile ein Trenlinie, idealerweise aber komplette Gitternetzlinien (wie in Excel) mit ausdrucken.
Der Code bisher mit "einprogrammierten" Trennlinien, aber auch mit Problemen beim Ausdruck von mehreren Seiten:
Delphi-Quellcode:
//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 := 200;
FooterSize := 150;
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.Font.Height := FontHeight;
Printer.Canvas.TextOut(0,-100, 'Abfahrtsdatum: '+datetostr(form1.datetimepicker3.date)+' - Zugnummer: '+form1.combobox1.Text+' - von Bhf: '+vonbhf+' - bis Bhf: '+bisbhf+' - Linie: '+linie+' - Produkt: '+produkt);
// Spalten-Überschriften:
Printer.Canvas.Font.Height := FontHeight-5;
XPos := 0;
for J := 0 to 20 do
begin
Printer.Canvas.TextOut(XPos, - 160,
Grid.Cells[J, 0]);
XPos := XPos + Grid.ColWidths[J] * 2 + 25;
end;
// Linie unter Überschriften
Printer.Canvas.Pen.Width := 5;
Printer.Canvas.MoveTo(0, - HeaderSize);
Printer.Canvas.LineTo(HorzSize, - HeaderSize);
//Fußzeile
// Linie über 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 + 140,Footer);
//Zeilen drucken
Printer.Canvas.Font.Height := FontHeight-5;
YPos := HeaderSize + 25;
// for I := 1 to Zeilen do
if Seite=1 then
begin
for I := 2 to Zeilen do // 2 und nicht 1 - wegen fester Kopfzeile in Bildschirm-Stringgrid
begin
if Grid.RowCount >= I + (Seite-1)*Zeilen then
begin
XPos := 0;
for J := 0 to 20 do
begin
Printer.Canvas.TextOut(XPos, - YPos,
Grid.Cells[J, I + (Seite - 1) * Zeilen - 1]);
XPos := XPos + Grid.ColWidths[J] * 2 + 25;
end;
YPos := YPos + ZeilenSize;
// Linie nach jedem Datensatz
Printer.Canvas.Pen.Width := 2;
Printer.Canvas.MoveTo(0, - YPos);
Printer.Canvas.LineTo(HorzSize, - YPos);
YPos := YPos + ZeilenSize;
end;
end;
end
else
begin
for I := 1 to Zeilen do
begin
if Grid.RowCount >= I + (Seite-1)*Zeilen then
begin
XPos := 0;
for J := 0 to 20 do
begin
Printer.Canvas.TextOut(XPos, - YPos,
Grid.Cells[J, I + (Seite - 1) * Zeilen - 1]);
XPos := XPos + Grid.ColWidths[J] * 2 + 25;
end;
YPos := YPos + ZeilenSize;
// Linie nach jedem Datensatz
Printer.Canvas.Pen.Width := 2;
Printer.Canvas.MoveTo(0, - YPos);
Printer.Canvas.LineTo(HorzSize, - YPos);
YPos := YPos + ZeilenSize;
end;
end;
end;
//Seite hinzufügen
Inc(Seite);
if Seite <= AnzSeiten then Printer.NewPage;
end;
Printer.EndDoc;
end;
Vielen Dank und Gruß,
Heinz
|