Page 1 of 2 1 2 LastLast
Results 1 to 15 of 25

Thread: DBGrid Printen - DELPHI 7

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

    Question DBGrid Printen - DELPHI 7

    Heb deze code via Google gevonden.
    De inhoud is voor mij te complex om alles te begrijpen.

    De code werkt goed, maar:
    1) het lettertype (grootte) is veel te klein op de print.
    2) er staat geen hoofding.
    3) er zou ook de huidige datum op moeten.

    Hoe kan dit aangepast worden?
    Bedankt.


    Code:
    procedure TFgenre.BitBtnPRINTClick(Sender: TObject);
    const
      LeftMargin = 0.05;
      TopMargin = 0.05;
      BottomMargin = 0.05;
    var
      i: integer;
      x,y: integer;
    begin
      if PrintDialog1.Execute then
        begin
        Printer.BeginDoc;
        y := Round(TopMargin*Printer.PageHeight);
        DBGrid.DataSource.DataSet.First;
        while not DBGrid.DataSource.DataSet.Eof do
          begin
          x := Round(LeftMargin*Printer.PageWidth);
          for i := 0 to DBGrid.DataSource.DataSet.FieldCount-1 do
            begin
            printer.Canvas.TextOut(x,y,DBGrid.DataSource.DataSet.Fields[i].AsString);
            x := x + MulDiv(DBGrid.Columns[i].Width,Printer.PageWidth, DBGrid.Width);
            end;
          DBGrid.DataSource.DataSet.Next;
          y := y + printer.Canvas.TextHeight('A');
          if y > (1-TopMargin-BottomMargin)* Printer.PageHeight then
            begin
            y := Round(TopMargin*Printer.PageHeight);
            Printer.NewPage;
            end;
          end;
        Printer.EndDoc;
        end;
    end;

  2. #2
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Ik zou me verdiepen in een rapportgenerator zoals FreeReport/FastReport.
    Nooit meer hannessen met code voor het printen van tabellen e.d.

    Greetz,

    Peter.
    TMemoryLeak.Create(Nil);

  3. #3
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Ik wist niet dat Muldiv() ook een functie van Delphi was.

    printer.canvas heeft ook fonts met zijn stylen tot zijn beschikking.

  4. #4
    Senior member mzwollo's Avatar
    Join Date
    Oct 2004
    Location
    Larserbos
    Posts
    155
    Je kunt paar coderegels toevoegen en je krijgt een 'hoofding' waarin ook een datum gezet kan worden.
    Zoals je ziet is ook de fontsize en fontstyle te programmeren.

    Delphi Code:
    1. var
    2.   i: integer;
    3.   x,y: integer;
    4.   Koptekst: string; //<<--Toegevoegd
    5. begin
    6.   if PrintDialog1.Execute then begin
    7.     Printer.BeginDoc;
    8.     y := Round(TopMargin*Printer.PageHeight);
    9.  
    10.     {********begin toevoeging*********}
    11.  
    12.     Printer.Canvas.Font.Name := 'Arial';
    13.     Printer.Canvas.Font.Size := 14;
    14.     Printer.Canvas.Font.Style := [ fsBold];
    15.     Koptekst := 'Dit is een koptekst';
    16.     x := (Printer.PageWidth - Printer.canvas.TextWidth(KopTekst)) div 2;
    17.     Printer.Canvas.TextOut(x,y,Koptekst);
    18.     Printer.Canvas.Font.Style := [];
    19.     Printer.Canvas.Font.Size := 12;
    20.     y := y + 2*printer.Canvas.TextHeight('A');
    21.  
    22.     {********einde toevoeging*********}
    23.  
    24.    DBGrid.DataSource.DataSet.First;
    25.     while not DBGrid.DataSource.DataSet.Eof do

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

    Question

    mzwollo
    Aanpassing gedaan en alles werkt nog prima.
    Thanks.
    3) er zou ook de huidige datum op moeten.
    Kan je nog even uitleggen hoe ik de datum er kan invoegen!

  6. #6
    Senior member mzwollo's Avatar
    Join Date
    Oct 2004
    Location
    Larserbos
    Posts
    155
    De datum kan of in de kopregel of in de voetregel worden toegevoegd.
    Ik onderstaande code heb ik gekozen voor de voetregel, en wel (voor de variatie ): rechtsuitgelijnd.

    Delphi Code:
    1. const
    2.   LeftMargin   = 0.05;
    3.   TopMargin    = 0.05;
    4.   BottomMargin = 0.05;
    5. var
    6.   i                  : integer;
    7.   x, y               : integer;
    8.   KopTekst, VoetTekst: string; // <<--Toegevoegd
    9.   DeltaY             : integer; // <<--Toegevoegd
    10. begin
    11.   if PrintDialog1.Execute then begin
    12.     Printer.BeginDoc;
    13.     y := Round(TopMargin * Printer.PageHeight);
    14.  
    15.     { **** begin toevoeging **** }
    16.  
    17.     Printer.Canvas.Font.Name  := 'Arial';
    18.     Printer.Canvas.Font.Size  := 14;
    19.     Printer.Canvas.Font.Style := [fsBold];
    20.     KopTekst                  := 'Dit is een koptekst';
    21.     VoetTekst := 'print: ' + formatdatetime('d mmmm yyyy', date);
    22.     x := (Printer.PageWidth - Printer.Canvas.TextWidth(KopTekst)) div 2;
    23.     Printer.Canvas.TextOut(x, y, KopTekst);
    24.     Printer.Canvas.Font.Style := [];
    25.     Printer.Canvas.Font.Size  := 12;
    26.     DeltaY                    := Printer.Canvas.TextHeight('A');
    27.     y                         := y + 2 * DeltaY;
    28.  
    29.     { **** begin einde toevoeging **** }
    30.  
    31.     DBGrid.DataSource.DataSet.First;
    32.     while not DBGrid.DataSource.DataSet.Eof do begin
    33.       x     := Round(LeftMargin * Printer.PageWidth);
    34.       for i := 0 to DBGrid.DataSource.DataSet.FieldCount - 1 do begin
    35.         Printer.Canvas.TextOut(x, y, DBGrid.DataSource.DataSet.Fields[i]
    36.           .AsString);
    37.         x := x + MulDiv(DBGrid.Columns[i].Width, Printer.PageWidth,
    38.           DBGrid.Width);
    39.       end;
    40.       DBGrid.DataSource.DataSet.Next;
    41.  
    42.       { *** begin wijziging *** }
    43.  
    44.       y := y + DeltaY;
    45.       if y > (1 - TopMargin - BottomMargin) * Printer.PageHeight - 2 * DeltaY
    46.       then begin
    47.         y := y + 2 * DeltaY;
    48.         x := Round((1 - 2 * LeftMargin) * Printer.PageWidth) -
    49.           Printer.Canvas.TextWidth(VoetTekst);
    50.         Printer.Canvas.TextOut(x, y, VoetTekst);
    51.  
    52.         { *** einde wijziging *** }
    53.  
    54.         y := Round(TopMargin * Printer.PageHeight);
    55.         Printer.NewPage;
    56.       end;
    57.     end;
    58.     Printer.EndDoc;
    59.   end;
    60. end;

  7. #7
    Senior member mzwollo's Avatar
    Join Date
    Oct 2004
    Location
    Larserbos
    Posts
    155
    Met onderstaande code wordt op elke bladzijde de kop- en voettekst geprint:

    Delphi Code:
    1. procedure TForm1.Button1Click(Sender: TObject);
    2. const
    3.   LeftMargin   = 0.05;
    4.   TopMargin    = 0.05;
    5.   BottomMargin = 0.05;
    6. var
    7.   i                  : integer;
    8.   x, y               : integer;
    9.   KopTekst, VoetTekst: string;
    10.   DeltaY             : integer;
    11.  
    12.   procedure PrintKoptekst;
    13.   var
    14.     tmpSize : integer;
    15.     tmpStyle: set of Tfontstyle;
    16.   begin
    17.     tmpSize  := Printer.Canvas.Font.Size;
    18.     tmpStyle := Printer.Canvas.Font.Style;
    19.  
    20.     x := (Printer.PageWidth - Printer.Canvas.TextWidth(KopTekst)) div 2;
    21.     y := Round(TopMargin * Printer.PageHeight);
    22.     Printer.Canvas.Font.Size := 14;
    23.     Printer.Canvas.Font.Style := [fsBold];
    24.  
    25.     Printer.Canvas.TextOut(x, y, KopTekst);
    26.  
    27.     Printer.Canvas.Font.Size  := tmpSize;
    28.     Printer.Canvas.Font.Style := tmpStyle;
    29.  
    30.     y := y + 2 * DeltaY;
    31.   end;
    32.  
    33.   procedure PrintVoetTekst;
    34.   var
    35.     tmpY: integer;
    36.   begin
    37.     tmpY := y;
    38.     x    := Round((1 - 2 * LeftMargin) * Printer.PageWidth) -
    39.       Printer.Canvas.TextWidth(VoetTekst);
    40.     y := Round((1 - BottomMargin) * Printer.PageHeight);
    41.     Printer.Canvas.TextOut(x, y, VoetTekst);
    42.     y := tmpY;
    43.   end;
    44.  
    45. begin
    46.   if PrintDialog1.Execute then begin
    47.     Printer.BeginDoc;
    48.     y                        := Round(TopMargin * Printer.PageHeight);
    49.     Printer.Canvas.Font.Name := 'Arial';
    50.     Printer.Canvas.Font.Size := 12;
    51.     DeltaY                   := Printer.Canvas.TextHeight('A');
    52.  
    53.     KopTekst  := 'Dit is een koptekst';
    54.     VoetTekst := 'print: ' + formatdatetime('d mmmm yyyy', date);
    55.  
    56.     PrintKoptekst;
    57.     PrintVoetTekst;
    58.  
    59.     DBGrid.DataSource.DataSet.First;
    60.     while not DBGrid.DataSource.DataSet.Eof do begin
    61.       x     := Round(LeftMargin * Printer.PageWidth);
    62.       for i := 0 to DBGrid.DataSource.DataSet.FieldCount - 1 do begin
    63.         Printer.Canvas.TextOut(x, y, DBGrid.DataSource.DataSet.Fields[i]
    64.           .AsString);
    65.         x := x + MulDiv(DBGrid.Columns[i].Width, Printer.PageWidth,
    66.           DBGrid.Width);
    67.       end;
    68.       DBGrid.DataSource.DataSet.Next;
    69.  
    70.       y := y + DeltaY;
    71.       if y > (1 - BottomMargin) * Printer.PageHeight - 2 * DeltaY then begin
    72.         y := Round(TopMargin * Printer.PageHeight);
    73.         Printer.NewPage;
    74.         PrintKoptekst;
    75.         PrintVoetTekst;
    76.       end;
    77.     end;
    78.     Printer.EndDoc;
    79.   end;
    80. end;

  8. #8
    Senior Member Antoine's Avatar
    Join Date
    Apr 2011
    Location
    Molenwaard
    Posts
    2,399
    Ziet er allemaal overweldigend uit!!
    Maar wat een regels code tegen de 2 regels die je nodig hebt bij het tonen van je printpreview mbv FastReport...

    Het is allemaal veel makkelijker te verwezenlijken en de designer is een hele mooie, maar belangrijker nog, FR is ook niet ingewikkeld... Er is genoeg docu op het internet te vinden. Heb je net even die steun in je nodig, dan heb ik nog een artikel liggen van mij zelf over FR.

    Succes!
    " De waarde van het leven is niet in geld uit te drukken "

  9. #9
    Senior member mzwollo's Avatar
    Join Date
    Oct 2004
    Location
    Larserbos
    Posts
    155
    Je hebt helemaal gelijk, Antoine. Ik gebruik ook FR, een top softwareproduct!
    Het printen van een dbgrid zou ik inderdaad ook overlaten aan TCrossView van FR.

    Maar programmeren is leuk en ik vond het een uitdaging om de code die een dbgrid print een beetje uit te breiden zodat er ook een kop- en voettekst kon worden geprint. Overigens is soms een stukje code met 'BegindDoc' en 'EndDoc' minder ingewikkeld dan code die FR aanstuurt.

  10. #10
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Yep. Op die manier (zonder FR) heb ik ook hele stambomen laten afdrukken. In de eerste instantie had ik geen rekening gehouden met de resolutie. Maar dat aangepast en zo konden er honderden kattenstambomen worden gemaakt

  11. #11
    Senior member mzwollo's Avatar
    Join Date
    Oct 2004
    Location
    Larserbos
    Posts
    155
    Ik heb een applicatie in onderhoud, oorspronkelijk geprogrammeerd in Delphi 3, met Quick Report rapporten. Enkele rapporten, te ingewikkeld voor QR, maakte ik toch zelf met de printer.canvas.
    Deze applicatie is diverse malen vertaald naar nieuwer Delphi versies, waarbij de QR-rapporten ook vertaald moesten worden, eerst naar Code-based Rave (waar ik uiterst tevreden mee was) en uiteindelijk (omdat Rave er mee ophield) naar FastReport. Van FR heb ik uiteindelijk de Standard Edition gekocht omdat ik TCrossview en de Pascal-script mogelijkheden wilde benutten.

    Die paar rapporten die ikzelf gemaakt had met printer.canvas hebben alle vertalingen zonder wijziging doorstaan! Dat is toch ook een groot voordeel.

    @John, fok jij zelf katten? Of was het een opdracht?

  12. #12
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Mijn schoonouders hebben katten gefokt. In die vereniging zochten ze 1 of meerdere programmeurs om hun stamboomapplicatie te herschrijven. Zo ben ik daar ingerold en heb daar een aantal jaren doorgebracht als systeembeheerder. Heb daarvoor een aantal programma's geschreven in Delphi. Toen ik nog geen vertrouwen in QR of iets dergelijks. Dus zelf maar proberen.

    Maar zelf heb ik nooit gefokt.

  13. #13
    Ziet er allemaal overweldigend uit!!
    Maar wat een regels code tegen de 2 regels die je nodig hebt bij het tonen van je printpreview mbv FastReport...
    Het is allemaal veel makkelijker te verwezenlijken en de designer is een hele mooie, maar belangrijker nog, FR is ook niet ingewikkeld... Er is genoeg docu op het internet te vinden. Heb je net even die steun in je nodig, dan heb ik nog een artikel liggen van mij zelf over FR.
    Dat vindt ik nu juist niet.
    Ik heb ook een dergelijke procedure DbPrintGrid, maar is iets geavanceerder. Als je een grid wilt afdrukken, gebruik ik DbPrintGrid( DbGrid1, 'Koptekst', 'Voettekst') en daarmee is de kous af, dat duurt nog geen minuut. Met FP moet je nog een aantal componenten op je form ( of datamodule ) zetten en van alles gaan configureren en koppelen. Dat gaat helemaal niet zo snel.

    Als ik de tijd vind, kan ik mijn code hier even posten
    KISS: Keep it Simple & Stupid

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

    Question

    FranB,
    Als ik de tijd vind, kan ik mijn code hier even posten
    Dat is een goed idee, doen dus.
    Er zal wel iemand op dit forum de kans krijgen om bij te leren.

    mzwollo,
    Heb je code in mijn programma als volgt aangepast:
    Code:
    procedure TFgenre.BitBtnPRINTClick(Sender: TObject);
    const
       LeftMargin   = 0.10;
       TopMargin    = 0.10;
       BottomMargin = 0.05;
    var
       i                  : integer;
       x, y               : integer;
       KopTekst, VoetTekst: string;
       DeltaY             : integer;
       procedure PrintKoptekst;
       var
         tmpSize : integer;
         tmpStyle: set of Tfontstyle;
       begin
         tmpSize  := Printer.Canvas.Font.Size;
         tmpStyle := Printer.Canvas.Font.Style;
         x := (Printer.PageWidth - Printer.Canvas.TextWidth(KopTekst)) div 2;
         y := Round(TopMargin * Printer.PageHeight);
         Printer.Canvas.Font.Size  := 18;
         Printer.Canvas.Font.Style := [fsBold];
         Printer.Canvas.TextOut(x, y, KopTekst);
         Printer.Canvas.Font.Size  := tmpSize;
         Printer.Canvas.Font.Style := tmpStyle;
         y := y + 2 * DeltaY;
       end;
       procedure PrintVoetTekst;
       var
         tmpY: integer;
       begin
         tmpY := y;
         x    := Round((1 - 2 * LeftMargin) * Printer.PageWidth) -
              Printer.Canvas.TextWidth(VoetTekst);
         y := Round((1 - BottomMargin) * Printer.PageHeight);
         Printer.Canvas.TextOut(x, y, VoetTekst);
         y := tmpY;
       end;
    begin
       if PrintDialog1.Execute then
       begin
         Printer.BeginDoc;
         y                        := Round(TopMargin * Printer.PageHeight);
         Printer.Canvas.Font.Name := 'Arial';
         Printer.Canvas.Font.Size := 16;
         DeltaY                   := Printer.Canvas.TextHeight('A');
         KopTekst  := 'MUZIEK - ADBPHOTO.EXE';
         VoetTekst := 'Print: van ' + formatdatetime('dd mmmm yyyy', date);
         PrintKoptekst;
         PrintVoetTekst;
         DBGrid.DataSource.DataSet.First;
         while not DBGrid.DataSource.DataSet.Eof do
         begin
           x     := Round(LeftMargin * Printer.PageWidth);
           for i := 0 to DBGrid.DataSource.DataSet.FieldCount - 1 do
           begin
             Printer.Canvas.TextOut(x, y, DBGrid.DataSource.DataSet.Fields[i]
                  .AsString);
             x := x + MulDiv(DBGrid.Columns[i].Width, Printer.PageWidth,
                  DBGrid.Width);
           end;
           DBGrid.DataSource.DataSet.Next;
           y := y + DeltaY;
           if y > (1 - BottomMargin) * Printer.PageHeight - 2 * DeltaY then
           begin
             y := Round(TopMargin * Printer.PageHeight);
             Printer.NewPage;
             PrintKoptekst;
             PrintVoetTekst;
           end;
         end;
         Printer.EndDoc;
         end;
       DBGrid.DataSource.DataSet.First;
       DBGrid.SetFocus;
       end;
    Alles werkt PRIMA.
    Is het mogelijk om na "KopTekst := 'MUZIEK - ADBPHOTO.EXE';" twee lege lijnen te krijgen zodat de data iets lager komt te staan?
    Graag de nodige code aub.

  15. #15
    Senior member mzwollo's Avatar
    Join Date
    Oct 2004
    Location
    Larserbos
    Posts
    155
    Wijzig de regel in de procedure PrintKopTekst in:
    y := y + 3 * DeltaY;

Page 1 of 2 1 2 LastLast

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
  •