Page 2 of 2 FirstFirst 1 2
Results 16 to 25 of 25

Thread: DBGrid Printen - DELPHI 7

  1. #16
    Senior Member
    Join Date
    Sep 2004
    Location
    BELGIE(Vilvoorde)
    Posts
    685

    Thumbs up Opgelost

    mzwollo

    Hartelijke dank voor de echte steun.

  2. #17
    Dat is een goed idee, doen dus.
    Er zal wel iemand op dit forum de kans krijgen om bij te leren.
    Doe ik van zodra ik terug ben.

    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

  3. #18
    Bij deze

    Delphi Code:
    1. procedure PrintDbGrid(vDbGrid: TDbGrid; vOrientation: TPrinterOrientation; vKopTekst: string = ''; vVoetTekst: string = ''; vFontSize: integer = 9);
    2.  
    3. const
    4.   LeftMargin   = 0.05;
    5.   TopMargin    = 0.05;
    6.   BottomMargin = 0.05;
    7.  
    8. var
    9.   i                  : integer;
    10.   x, y, MaxX, Xl, Xr : integer;
    11.   dx, dy             : integer;
    12.  
    13.   procedure iPrintKoptekst;
    14.  
    15.   var
    16.     tmpSize : integer;
    17.     tmpStyle: set of Tfontstyle;
    18.  
    19.   begin
    20.     tmpSize  := Printer.Canvas.Font.Size;
    21.     tmpStyle := Printer.Canvas.Font.Style;
    22.     Printer.Canvas.Brush.Color:= clWhite;
    23.  
    24.     x := (Printer.PageWidth - Printer.Canvas.TextWidth(vKopTekst)) div 2;
    25.     y := Round(TopMargin * Printer.PageHeight);
    26.     Printer.Canvas.Font.Size := 14;
    27.     Printer.Canvas.Font.Style := [fsBold];
    28.  
    29.     Printer.Canvas.TextOut(x, y, vKopTekst);
    30.     Printer.Canvas.MoveTo(Xl, y + Printer.Canvas.TextHeight('A'));
    31.     Printer.Canvas.LineTo(Xr, y + Printer.Canvas.TextHeight('A'));
    32.  
    33.     Printer.Canvas.Font.Size  := tmpSize;
    34.     Printer.Canvas.Font.Style := tmpStyle;
    35.  
    36.     y := y + 2 * Dy;
    37.   end;
    38.  
    39.   procedure iPrintVoetTekst;
    40.   var
    41.     tmpY: integer;
    42.  
    43.   begin
    44.     Printer.Canvas.Brush.Color:= clWhite;
    45.     tmpY := y;
    46.     x    := Round((1 - 2 * LeftMargin) * Printer.PageWidth) -
    47.             Printer.Canvas.TextWidth(vVoetTekst);
    48.     y := Round((1 - BottomMargin) * Printer.PageHeight);
    49.     Printer.Canvas.TextOut(x, y, vVoetTekst);
    50.     Printer.Canvas.MoveTo(Xl, y);
    51.     Printer.Canvas.LineTo(Xr, y);
    52.     y := tmpY;
    53.   end;
    54.  
    55. begin
    56.   Printer.Orientation      := vOrientation;
    57.  
    58.   if vDBGrid.DataSource.DataSet.Active
    59.   then Exit;
    60.   if vDBGrid.DataSource.DataSet.RecordCount = 0
    61.   then Exit;
    62.   if not printDialog.execute
    63.   then Exit;
    64.  
    65.   Printer.BeginDoc;
    66.   y                        := Round(TopMargin * Printer.PageHeight);
    67.   Printer.Canvas.Font.Name := 'Arial';
    68.   Printer.Canvas.Font.Size := vFontSize;
    69.   Dy                       := Printer.Canvas.TextHeight('A');
    70.   Xl                       := Round(LeftMargin * Printer.PageWidth);
    71.   Xr                       := Printer.PageWidth - 2* xl;
    72.  
    73.   if vKopTekst = ''
    74.   then vKopTekst:= vDbGrid.Name;
    75.   if vVoetTekst = ''
    76.   then vVoetTekst := 'Afdruk op ' + formatdatetime('d mmmm yyyy', date);
    77.  
    78.   iPrintKoptekst;
    79.   iPrintVoetTekst;
    80.  
    81.   Printer.Canvas.Brush.Color:= clSkyBlue;
    82.   Printer.Canvas.Font.Style:= [fsBold];
    83.  
    84.   x     := Xl;
    85.   for i := 0 to vDBGrid.Columns.Count - 1
    86.   do
    87.     begin
    88.       dx:= MulDiv(vDBGrid.Columns[i].Width, Printer.PageWidth, vDBGrid.Width);
    89.       Printer.Canvas.FillRect(Rect(x, y, x+dx, y+Dy));
    90.       Printer.Canvas.TextOut(x, y, vDBGrid.Columns[i].Title.Caption);
    91.       x := x + dx;
    92.     end;
    93.  
    94.   MaxX:= x;
    95.   Y:= Y+Dy;
    96.  
    97.   Printer.Canvas.Font.Style:= [];
    98.  
    99.   vDBGrid.DataSource.DataSet.First;
    100.   while not vDBGrid.DataSource.DataSet.Eof
    101.   do
    102.   begin
    103.       x:= Xl;
    104.  
    105.       if vDBGrid.DataSource.DataSet.RecNo mod 2 = 1
    106.       then Printer.Canvas.Brush.Color:= clWhite
    107.       else Printer.Canvas.Brush.Color:= $00DFDFDF;
    108.       Printer.Canvas.FillRect(Rect(x, y, MaxX, y+Dy));
    109.  
    110.       for i := 0 to vDBGrid.Columns.Count - 1
    111.       do
    112.       begin
    113.         dx:= MulDiv(vDBGrid.Columns[i].Width, Printer.PageWidth, vDBGrid.Width);
    114.         Printer.Canvas.TextOut(x, y, vDBGrid.Columns[i].Field.AsString);
    115.         x := x + dx;
    116.       end;
    117.  
    118.       vDBGrid.DataSource.DataSet.Next;
    119.  
    120.       y := y + Dy;
    121.  
    122.       if y > (1 - BottomMargin) * Printer.PageHeight - 2 * Dy
    123.       then
    124.       begin
    125.         y := Round(TopMargin * Printer.PageHeight);
    126.         Printer.NewPage;
    127.         iPrintKoptekst;
    128.         iPrintVoetTekst;
    129.       end;
    130.     end;
    131.  
    132.   Printer.EndDoc;
    133. end;
    KISS: Keep it Simple & Stupid

  4. #19
    Quote Originally Posted by FrankB View Post
    Bij deze

    Delphi Code:
    1. if vDBGrid.DataSource.DataSet.Active
    2. then Exit;
    Ik mag toch even aannemen dat dat het volgende moet zijn:
    Delphi Code:
    1. if not vDBGrid.DataSource.DataSet.Active then Exit;
    Dus NOT 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.

  5. #20
    if not vDBGrid.DataSource.DataSet.Active then Exit;
    Foutje inderdaad. Eigenaardig.

    Ik zou de code voor het printen van de titels ook in de iPrintKoptekst plaatsen zodat deze op elke pagina geprint worden.
    Dit is toch zo? De formatering staat er buiten, dit is alles.

    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:
    1. var gPrintDialog: TPrintDialog;
    2.  
    3. function PrintDialog: TPrintDialog;
    4.  
    5. implementation
    6.  
    7. function PrintDialog: TPrintDialog;
    8. begin
    9.   if not assigned(gPrintDialog)
    10.   then gPrintDialog:= TPrintDialog.Create(nil);
    11.   Result:= gPrintDialog;
    12. end;
    13.  
    14. finalization;
    15.   freeAndNil(gPrintDialog);
    16. end.
    KISS: Keep it Simple & Stupid

  6. #21
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Ik zou alleen die variabele gPrintDialog onder de Implementation zetten, nu kan "Iedereen" erbij.
    TMemoryLeak.Create(Nil);

  7. #22
    Lijkt me een goed idee, uit principe.
    KISS: Keep it Simple & Stupid

  8. #23
    Quote Originally Posted by FrankB View Post
    Ik zou de code voor het printen van de titels ook in de iPrintKoptekst plaatsen zodat deze op elke pagina geprint worden.
    Dit is toch zo? De formatering staat er buiten, dit is alles.
    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 )

  9. #24
    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

  10. #25
    Quote Originally Posted by FrankB View Post
    Nee?
    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:
    1. for i := 0 to vDBGrid.Columns.Count - 1
    2. do
    3.   begin
    4.     dx:= MulDiv(vDBGrid.Columns[i].Width, Printer.PageWidth, vDBGrid.Width);
    5.     Printer.Canvas.FillRect(Rect(x, y, x+dx, y+Dy));
    6.     Printer.Canvas.TextOut(x, y, vDBGrid.Columns[i].Title.Caption);
    7.     x := x + dx;
    8.   end;

    Op die manier, als je aan het bladeren bent op de vervolgvellen, dan hoef je niet te raden wat elke kolom betekend.

Page 2 of 2 FirstFirst 1 2

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •