mzwollo
Hartelijke dank voor de echte steun.
mzwollo
Hartelijke dank voor de echte steun.
Doe ik van zodra ik terug ben.Dat is een goed idee, doen dus.
Er zal wel iemand op dit forum de kans krijgen om bij te leren.
Misschien nog een aantal hints:
@seghele: ik zou van je routine een meer algemene routine maken met de Grid, koptekst en voettekst als variabele, dan kun je dit ook elders gaan gebruiken.
Voor het zwaardere werk gebruik ik Reportbuilder, bijvoorbeeld om rapporten af te drukken met barcodes en tekeningen. Behalve je haar kammen kun je er alles mee.
Om grids professioneel te gaan afdrukken gebruik ik het component van DevExpress, je plaatst het component op je form, voegt je grids er aan toe en je kunt beginnen afdrukken. Vooral omdat het daar meestal cxgrids betreft is het component nogal handig.
Echter heel wat software dat ik heb zijn consoleprogramma's die onzichtbaar blijven voor de normale gebruiker en daar gebruik ik deze routine om de consoleprogramma's niet te zwaar te maken. Daarenboven zijn heel wat consoleprogramma's geprogrameerd in Lazarus ( op Linux ) en daar kan ik geen commerciële produkten gebruiken.
KISS: Keep it Simple & Stupid
Bij deze
Delphi Code:
procedure PrintDbGrid(vDbGrid: TDbGrid; vOrientation: TPrinterOrientation; vKopTekst: string = ''; vVoetTekst: string = ''; vFontSize: integer = 9); const LeftMargin = 0.05; TopMargin = 0.05; BottomMargin = 0.05; var i : integer; x, y, MaxX, Xl, Xr : integer; dx, dy : integer; procedure iPrintKoptekst; var tmpSize : integer; tmpStyle: set of Tfontstyle; begin tmpSize := Printer.Canvas.Font.Size; tmpStyle := Printer.Canvas.Font.Style; Printer.Canvas.Brush.Color:= clWhite; x := (Printer.PageWidth - Printer.Canvas.TextWidth(vKopTekst)) div 2; y := Round(TopMargin * Printer.PageHeight); Printer.Canvas.Font.Size := 14; Printer.Canvas.Font.Style := [fsBold]; Printer.Canvas.TextOut(x, y, vKopTekst); Printer.Canvas.MoveTo(Xl, y + Printer.Canvas.TextHeight('A')); Printer.Canvas.LineTo(Xr, y + Printer.Canvas.TextHeight('A')); Printer.Canvas.Font.Size := tmpSize; Printer.Canvas.Font.Style := tmpStyle; y := y + 2 * Dy; end; procedure iPrintVoetTekst; var tmpY: integer; begin Printer.Canvas.Brush.Color:= clWhite; tmpY := y; x := Round((1 - 2 * LeftMargin) * Printer.PageWidth) - Printer.Canvas.TextWidth(vVoetTekst); y := Round((1 - BottomMargin) * Printer.PageHeight); Printer.Canvas.TextOut(x, y, vVoetTekst); Printer.Canvas.MoveTo(Xl, y); Printer.Canvas.LineTo(Xr, y); y := tmpY; end; begin Printer.Orientation := vOrientation; if vDBGrid.DataSource.DataSet.Active then Exit; if vDBGrid.DataSource.DataSet.RecordCount = 0 then Exit; if not printDialog.execute then Exit; Printer.BeginDoc; y := Round(TopMargin * Printer.PageHeight); Printer.Canvas.Font.Name := 'Arial'; Printer.Canvas.Font.Size := vFontSize; Dy := Printer.Canvas.TextHeight('A'); Xl := Round(LeftMargin * Printer.PageWidth); Xr := Printer.PageWidth - 2* xl; if vKopTekst = '' then vKopTekst:= vDbGrid.Name; if vVoetTekst = '' then vVoetTekst := 'Afdruk op ' + formatdatetime('d mmmm yyyy', date); iPrintKoptekst; iPrintVoetTekst; Printer.Canvas.Brush.Color:= clSkyBlue; Printer.Canvas.Font.Style:= [fsBold]; x := Xl; for i := 0 to vDBGrid.Columns.Count - 1 do begin dx:= MulDiv(vDBGrid.Columns[i].Width, Printer.PageWidth, vDBGrid.Width); Printer.Canvas.FillRect(Rect(x, y, x+dx, y+Dy)); Printer.Canvas.TextOut(x, y, vDBGrid.Columns[i].Title.Caption); x := x + dx; end; MaxX:= x; Y:= Y+Dy; Printer.Canvas.Font.Style:= []; vDBGrid.DataSource.DataSet.First; while not vDBGrid.DataSource.DataSet.Eof do begin x:= Xl; if vDBGrid.DataSource.DataSet.RecNo mod 2 = 1 then Printer.Canvas.Brush.Color:= clWhite else Printer.Canvas.Brush.Color:= $00DFDFDF; Printer.Canvas.FillRect(Rect(x, y, MaxX, y+Dy)); for i := 0 to vDBGrid.Columns.Count - 1 do begin dx:= MulDiv(vDBGrid.Columns[i].Width, Printer.PageWidth, vDBGrid.Width); Printer.Canvas.TextOut(x, y, vDBGrid.Columns[i].Field.AsString); x := x + dx; end; vDBGrid.DataSource.DataSet.Next; y := y + Dy; if y > (1 - BottomMargin) * Printer.PageHeight - 2 * Dy then begin y := Round(TopMargin * Printer.PageHeight); Printer.NewPage; iPrintKoptekst; iPrintVoetTekst; end; end; Printer.EndDoc; end;
KISS: Keep it Simple & Stupid
Ik mag toch even aannemen dat dat het volgende moet zijn:
Dus NOT active then exitDelphi Code:
if not vDBGrid.DataSource.DataSet.Active then Exit;
(verder natuurlijk wel bedankt voor het delen van de code )
Als ik overigens nog een kleine opmerking bij deze code mag plaatsen...?
Ik zou de code voor het printen van de titels ook in de iPrintKoptekst plaatsen zodat deze op elke pagina geprint worden.
Last edited by rvk; 05-May-14 at 14:19.
Foutje inderdaad. Eigenaardig.if not vDBGrid.DataSource.DataSet.Active then Exit;
Dit is toch zo? De formatering staat er buiten, dit is alles.Ik zou de code voor het printen van de titels ook in de iPrintKoptekst plaatsen zodat deze op elke pagina geprint worden.
Ik gebruik de code voor 'kladwerk' en ze werkt zowel in Lazarus als in Delphi.
Er is nog een stukje code te weinig:
Delphi Code:
var gPrintDialog: TPrintDialog; function PrintDialog: TPrintDialog; implementation function PrintDialog: TPrintDialog; begin if not assigned(gPrintDialog) then gPrintDialog:= TPrintDialog.Create(nil); Result:= gPrintDialog; end; finalization; freeAndNil(gPrintDialog); end.
KISS: Keep it Simple & Stupid
Ik zou alleen die variabele gPrintDialog onder de Implementation zetten, nu kan "Iedereen" erbij.
TMemoryLeak.Create(Nil);
Lijkt me een goed idee, uit principe.
KISS: Keep it Simple & Stupid
Je print in jouw code toch écht maar éénmaal de titels (en dat is buiten de while loop van de dataset).
Dat is op pagina 1.
Als je tabel meerdere pagina's bevat (wat je wel goed in de code op vangt met de "y > ") print je op pagina 2 echter geen titels meer.
(en in iPrintKoptekst print je momenteel niet de titels mee)
Als je dat printen van de titels dus ook verplaatst naar iPrintKoptekst dan heb je op de tweede (en volgende) pagina's wel de titels.
(Dat lijkt mij voor de vervolgvellen wel zo duidelijk)
(ik denk dat jij niet veel tabellen print met meer dan 1 pagina )
Nee?
if y > (1 - BottomMargin) * Printer.PageHeight - 2 * Dy
then
begin
y := Round(TopMargin * Printer.PageHeight);
Printer.NewPage;
iPrintKoptekst;
iPrintVoetTekst;
end;
KISS: Keep it Simple & Stupid
Nee... (je begrijpt niet helemaal welke titels ik bedoel, het was misschien ook niet helemaal duidelijk omschreven door mij)
Ik bedoel niet de vDbGrid.Name maar ik bedoel de vDBGrid.Columns[i].Title.Caption's. (die titels )
(ik heb het met je code getest)
Draai maar eens een tabel uit met meerdere pagina's.
Met titels heb ik het dan om de kolombenamingen vDBGrid.Columns[i].Title.Caption die niet op de 2e pagina staan.
Ik bedoel dus dat je eigenlijk deze code in de iPrintKopTekst zou kunnen zetten:
Delphi Code:
for i := 0 to vDBGrid.Columns.Count - 1 do begin dx:= MulDiv(vDBGrid.Columns[i].Width, Printer.PageWidth, vDBGrid.Width); Printer.Canvas.FillRect(Rect(x, y, x+dx, y+Dy)); Printer.Canvas.TextOut(x, y, vDBGrid.Columns[i].Title.Caption); x := x + dx; end;
Op die manier, als je aan het bladeren bent op de vervolgvellen, dan hoef je niet te raden wat elke kolom betekend.
There are currently 1 users browsing this thread. (0 members and 1 guests)
Bookmarks