Page 2 of 4 FirstFirst 1 2 3 4 LastLast
Results 16 to 30 of 49

Thread: Print stringgrid

  1. #16
    Verander alle Printer.Canvas.Handle eens in Printer.Handle.

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

    Question

    rvk,

    Verander alle Printer.Canvas.Handle eens in Printer.Handle.
    Er stond Printer.Handle!!!
    Met Printer.Canvas.Handle krijg ik geen error.
    Maar wanneer ik SpeedButton1 gebruik dan komt er ERROR:
    "Canvas does not allow drawing"

    Code:
    procedure PrintGrid(var GenStrGrid: TStringGrid; headertext: string);
    var
      OldCursor: TCursor;
      PrnRect: TRect;
      I, J, K, BeginKolom, ATop, ABot, NC, NR, XScale, YScale, LBot: Integer;
      FinalBot, nctel: Integer;
      GString: string;
      LRMatrix, blz_nc: Variant;
      oldcolor: TColor;
    begin
      OldCursor := Screen.Cursor;
      OldColor := Printer.Canvas.Brush.Color;
      Screen.Cursor := crHourGlass;
      NC := (GenStrGrid.ColCount - 1);
      NR := (GenStrGrid.RowCount - 1);
      LRMatrix := VarArrayCreate([0, NC, 0, 1], VarInteger);
      blz_nc := VarArrayCreate([0, NC], Varinteger);
      try
        begin
          XScale := GetDeviceCaps(Printer.Canvas.Handle, LogPixelsX) div
            GenStrGrid.Font.PixelsPerInch;
          YScale := GetDeviceCaps(Printer.Canvas.Handle, LogPixelsY) div
            GenStrGrid.Font.PixelsPerInch;
          LRMatrix[0, 0] := 0;
          LRMatrix[0, 1] := GenStrGrid.ColWidths[0];
          nctel := -1;
          for I := 1 to NC do
          begin
            LRMatrix[I, 0] := LRMatrix[(I - 1), 0] + GenStrGrid.ColWidths[(I - 1)] +
              1;
            LRMatrix[I, 1] := LRMatrix[(I - 1), 1] + GenStrGrid.ColWidths[I] + 1;
            if (LRMatrix[I, 1] * XScale) > Printer.PageWidth then
            begin
              LRMatrix[I, 0] := LRMatrix[0, 0] + GenStrGrid.ColWidths[(I - 1)] + 1;
              LRMatrix[I, 1] := LRMatrix[0, 1] + GenStrGrid.ColWidths[I] + 1;
              Inc(nctel, 1);
              blz_nc[nctel] := I - 1;
            end;
          end;
          if (nctel = -1) or (blz_nc[nctel] <> NC) then
          begin
            Inc(nctel, 1);
            blz_nc[nctel] := NC;
          end;
          with Printer do
          begin
            Title := 'Cumulatief overzicht';
            Canvas.Font := GenStrGrid.Font;
            FinalBot := (Pageheight div Yscale) - 50;
            // bereken lengte papier min voettekst
            Begindoc;
            GString := 'Patient : ' + headertext;
            TextOut(Canvas.Handle, 20, 0, PChar(GString), StrLen(Pchar(GString)));
            BeginKolom := 1;
            // Het aantal kolommen dat op een blz past
            for I := 0 to nctel do
            begin
              if I <> 0 then
              begin
                NewPage;
                GString := 'Patient : ' + headertext;
                TextOut(Canvas.Handle, 20, 0, PChar(GString),
                  StrLen(Pchar(GString)));
              end;
              J := 0;
              repeat
                // Het aantal rijen eerst.
                Canvas.Brush.Color := oldcolor;
                if (j mod 2) = 0 then
                  Canvas.Brush.Color := $E4E4E4;
                if J = 0 then
                begin
                  ATop := 20;
                  ABot := ATop + GenStrGrid.RowHeights[J] + 1;
                  LBot := ABot;
                end
                else
                begin
                  if Atop = 20 then
                  begin
                    ATop := Atop + GenStrGrid.RowHeights[0] + 1;
                    ABot := ATop + GenStrGrid.RowHeights[J] + 1;
                    LBot := ABot;
                  end
                  else
                  begin
                    ATop := ATop + GenStrGrid.RowHeights[(J - 1)] + 1;
                    ABot := ABot + GenStrGrid.RowHeights[J] + 1;
                    LBot := ABot;
                  end;
                end;
                if LBot > FinalBot then
                begin
                  Canvas.Brush.Color := OldColor;
                  GString := 'Printdatum : ' + DateTimetostr(Now);
                  TextOut(Canvas.Handle, 20, (FinalBot * Yscale) + 150,
                    PChar(GString), StrLen(Pchar(GString)));
                  GString := 'Pagina : ' + inttostr(PageNumber);
                  TextOut(Canvas.Handle, PageWidth - 300, (FinalBot * YScale) + 150,
                    PChar(GString), StrLen(Pchar(GString)));
                  ATop := 20;
                  ABot := ATop + GenStrGrid.RowHeights[0] + 1;
                  LBot := ABot;
                  NewPage;
                  GString := 'Patient : ' + headertext;
                  TextOut(Canvas.Handle, 20, 0, PChar(GString),
                    StrLen(Pchar(GString)));
                  PrnRect := Rect(LRMatrix[0, 0], ATop, LRMatrix[0, 1], ABot);
                  with PrnRect do
                  begin
                    Left := Left * XScale;
                    Right := Right * XScale;
                    Top := (20 + Top) * YScale;
                    Bottom := (20 + Bottom) * YScale;
                  end;
                  GString := GenStrGrid.Cells[0, 0];
                  Canvas.Font.Style := [];
                  FillRect(Canvas.Handle, PrnRect, Canvas.Brush.Handle);
                  DrawText(Canvas.Handle, PChar(GString), StrLen(PChar(GString)),
                    PrnRect, DT_WORDBREAK);
                  for K := beginkolom to blz_NC[I] do
                  begin
                    PrnRect := Rect(LRMatrix[K, 0], ATop, LRMatrix[K, 1], ABot);
                    with PrnRect do
                    begin
                      Left := Left * XScale;
                      Right := Right * XScale;
                      Top := (20 + Top) * YScale;
                      Bottom := (20 + Bottom) * YScale;
                    end;
                    GString := GenStrGrid.Cells[K, 0];
                    Canvas.Font.Style := [fsBold] + [fsUnderline];
                    FillRect(Canvas.Handle, PrnRect, Canvas.Brush.Handle);
                    DrawText(Canvas.Handle, PChar(GString), StrLen(PChar(GString)),
                      PrnRect, DT_WORDBREAK);
                  end;
                  Dec(J, 1);
                end
                else
                begin
                  PrnRect := Rect(LRMatrix[0, 0], ATop, LRMatrix[0, 1], ABot);
                  with PrnRect do
                  begin
                    Left := Left * XScale;
                    Right := Right * XScale;
                    Top := (20 + Top) * YScale;
                    Bottom := (20 + Bottom) * YScale;
                  end;
                  GString := GenStrGrid.Cells[0, J];
                  Canvas.Font.Style := [];
                  FillRect(Canvas.Handle, PrnRect, Canvas.Brush.Handle);
                  DrawText(Canvas.Handle, PChar(GString), StrLen(PChar(GString)),
                    PrnRect, DT_WORDBREAK);
                  for K := beginkolom to blz_NC[I] do
                  begin
                    PrnRect := Rect(LRMatrix[K, 0], ATop, LRMatrix[K, 1], ABot);
                    with PrnRect do
                    begin
                      Left := Left * XScale;
                      Right := Right * XScale;
                      Top := (20 + Top) * YScale;
                      Bottom := (20 + Bottom) * YScale;
                    end;
                    GString := GenStrGrid.Cells[K, J];
                    if J = 0 then
                      Canvas.Font.Style := [fsBold] + [fsUnderline]
                    else
                      Canvas.Font.Style := [];
                    FillRect(Canvas.Handle, PrnRect, Canvas.Brush.Handle);
                    DrawText(Canvas.Handle, PChar(GString), StrLen(PChar(GString)),
                      PrnRect, DT_WORDBREAK);
                  end;
                end;
                Inc(J, 1);
              until
                J > NR;
              Canvas.Brush.Color := oldcolor;
              GString := 'Printdatum : ' + DateTimetostr(Now);
              TextOut(Canvas.Handle, 20, (FinalBot * Yscale) + 150, PChar(GString),
                StrLen(Pchar(GString)));
              GString := 'Pagina : ' + inttostr(PageNumber);
              TextOut(Canvas.Handle, PageWidth - 300, (FinalBot * YScale) + 150,
                PChar(GString), StrLen(Pchar(GString)));
              Beginkolom := blz_nc[I] + 1;
            end;
            EndDoc;
          end;
        end;
      finally
        begin
          Screen.Cursor := OldCursor;
          LRMatrix := UnAssigned;
        end;
      end;
    end;
    
    procedure TFmain.SpeedButton1Click(Sender: TObject);
    begin
      If QuestionDlg ('KEUZE !','Gegevens afdrukken?'+#13+
         '',mtConfirmation, [mrYes,'OK', mrNo, 'Annuleren'],'') = mrYes then
      begin
        PrintGrid(StringGrid1, 'Print Stringgrid Wizen '+
              formatdatetime('dd'+'/'+'mm'+'/'+'YYYY', Now));
      end;
    end;

  3. #18
    Ik dacht dat je die Duitse code zou pakken. Daarin moet je alle Printer.Canvas.Handle veranderen in Printer.Handle.

    Je begreep die code op NLDelphi niet dus die ga ik ook niet uitleggen. Dan kun je beter code pakken die je wel (een beetje) begrijpt.

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

    Question

    rvk,
    Krijg errors:
    Compile Project, Target: DBwiezenCT64.exe: Exit code 1, Errors: 9
    umain.pas(537,32) Error: identifier idents no member "Handle"
    umain.pas(537,40) Error: Identifier not found "PHYSICALWIDTH"
    umain.pas(538,27) Error: identifier idents no member "Handle"
    umain.pas(539,32) Error: identifier idents no member "Handle"
    umain.pas(539,40) Error: Identifier not found "PHYSICALHEIGHT"
    umain.pas(540,27) Error: identifier idents no member "Handle"
    umain.pas(544,22) Error: identifier idents no member "Handle"
    umain.pas(601,5) Error: Wrong number of parameters specified for call to "PrintStringGrid"
    umain.pas(519,11) Error: Found declaration: PrintStringGrid(TStringGrid;AnsiString;TPrinterOri entation);
    Code:
    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 := 100;
      FooterSize := 200;
      ZeilenSize := 36;
      FontHeight := 36;
      //Printer initializieren
      Printer.Orientation := Orientation;
      Printer.Title  := Title;
      Printer.BeginDoc;
      //Druck auf mm einstellen
      mmx := GetDeviceCaps(Printer.Handle, PHYSICALWIDTH) /
        GetDeviceCaps(Printer.Handle, LOGPIXELSX) * 25.4;
      mmy := GetDeviceCaps(Printer.Handle, PHYSICALHEIGHT) /
        GetDeviceCaps(Printer.Handle, LOGPIXELSY) * 25.4;
    
      VertSize := Trunc(mmy) * 10;
      HorzSize := Trunc(mmx) * 10;
      SetMapMode(Printer.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.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 Grid.RowCount >= I + (Seite - 1) * Zeilen then
          begin
            XPos := 0;
            for J := 0 to Grid.ColCount - 1 do
            begin
              Printer.Canvas.TextOut(XPos, - YPos,
                Grid.Cells[J, I + (Seite - 1) * Zeilen - 1]);
              XPos := XPos + Grid.ColWidths[J] * 3;
            end;
            YPos := YPos + ZeilenSize;
          end;
        end;
        //Seite hinzufügen
        Inc(Seite);
        if Seite <= AnzSeiten then Printer.NewPage;
      end;
      Printer.EndDoc;
    end;
    
    procedure TFmain.SpeedButton1Click(Sender: TObject);
    begin
      If QuestionDlg ('KEUZE !','Gegevens afdrukken?'+#13+
         '',mtConfirmation, [mrYes,'OK', mrNo, 'Annuleren'],'') = mrYes then
      begin
        PrintStringGrid(StringGrid1, 'Print Stringgrid Wizen '+
              formatdatetime('dd'+'/'+'mm'+'/'+'YYYY', Now));
      end;

  5. #20
    Volgens mij wordt in Lazarus de printer.handle niet publiek gemaakt. In Delphi dacht ik wel.

    Je kunt het volgende proberen.
    in Windows you can include OSPrinters and do TWinPrinter(Printer).Handle.

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

    Question

    rvk,
    Met de beste wil van de wereld .... maar hier kan ik niet meer volgen.
    Wat ...Waar ... Hoe ...
    Mijn mogelijkheden in coderen zijn beperkt.

  7. #22
    Het lijkt me toch ook het beste om de basics van Delphi / object pascal een beetje bij beetje te gaan leren. Dat scheelt ook een boel frustratie aan jouw eigen kant zodra je zaken zelf kunt aanpakken, ontwikkelen en aanpassen.

  8. #23
    Quote Originally Posted by rvk View Post
    Je kunt het volgende proberen.
    OSPrinters opnemen in je uses.
    En overal waar Printer.Handle staat dit wijzigen in TWinPrinter(Printer).Handle.

    (ik kan het eigenlijk niet duidelijker uitleggen)

  9. #24
    Senior Member
    Join Date
    Sep 2004
    Location
    BELGIE(Vilvoorde)
    Posts
    685
    rvk,
    Ik ga het morgen aanpakken.
    Nu even een lekkere BBQ met het moie weer.

  10. #25
    Senior Member
    Join Date
    Sep 2004
    Location
    BELGIE(Vilvoorde)
    Posts
    685
    Heb OSPrinters in Uses gezet.

    Code:
    uses
      {$IFNDEF WINDOWS} Windows, Mesages, jpeg, {$ENDIF}
      LCLIntf, LCLType, LCLProc, LMessages,
      Classes, SysUtils, FileUtil, Forms, Controls,
      Graphics, Dialogs, ExtCtrls, Menus, Grids, Printers,
      StdCtrls, Buttons, Comobj, IniFiles, Variants, Types, OSPrinters;
    En overal waar Printer.Handle staat dit wijzigen in TWinPrinter(Printer).Handle.
    Code:
    mmx := GetDeviceCaps(Printer.Handle, PHYSICALWIDTH) /
         GetDeviceCaps(Printer.Handle, LOGPIXELSX) * 25.4;
    Is volgende de juiste manier:
    Code:
      mmx := GetDeviceCaps(TWinPrinter(Printer).Handle, PHYSICALWIDTH) /
        GetDeviceCaps(TWinPrinter(Printer).Handle, LOGPIXELSX) * 25.4;

  11. #26
    Senior Member
    Join Date
    Sep 2004
    Location
    BELGIE(Vilvoorde)
    Posts
    685
    Was vergeten welke errors:
    Compile Project, Target: DBwiezenCT64.exe: Exit code 1, Errors: 7
    umain.pas(539,53) Error: Identifier not found "PHYSICALWIDTH"
    umain.pas(541,32) Error: identifier idents no member "Handle"
    umain.pas(541,40) Error: Identifier not found "PHYSICALHEIGHT"
    umain.pas(542,27) Error: identifier idents no member "Handle"
    umain.pas(546,22) Error: identifier idents no member "Handle"
    umain.pas(604,5) Error: Wrong number of parameters specified for call to "PrintStringGrid"
    umain.pas(519,11) Error: Found declaration: PrintStringGrid(TStringGrid;AnsiString;TPrinterOri entation);
    Ik zit nog steeds vast!

  12. #27
    De fout op regel 604/519 kun je zelf wel oplossen. Haal gewoon de parameter Orientation uit de functie en haal de regel weg die Orientation gebruikt in de functie. (Dat is er maar één)

    Verder vind ik dit een rare:
    Delphi Code:
    1. {$IFNDEF WINDOWS} Windows, Mesages, jpeg, {$ENDIF}
    Wie heeft die IFNDEF erin gezet?
    Je zou juist zeggen dat als je Windows gebruikt dat je die Windows en Messages in je uses wilt hebben.
    Plus dat Messages verkeerd geschreven is.

    Als je die IFNDEF en ENDIF weg haalt moet alles werken.

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

    Exclamation

    rvk,
    Dank zij je info is er eindelijk een resultaat...

    Heb nog een probleem met het Duits, vertaling naar het Nederlands is niet eenvoudig voor mij.
    In België is naast het Nederlands, het Frans onze tweede taal, dan pas Engels.
    Misschien kan je hier met vertaling helpen door de code aan te passen?

    De fontsize voor de cijfers in de kolommen zou nog groter moeten!!!
    Reeds dank.


    Code:
    uses
      Windows,
      LCLIntf, LCLType, LCLProc,
      Classes, SysUtils, FileUtil, Forms, Controls,
      Graphics, Dialogs, ExtCtrls, Menus, Grids, Printers,
      StdCtrls, Buttons, Comobj, IniFiles, Variants, Types, OSPrinters;
    ...
    ..      
    procedure PrintStringGrid(Grid: TStringGrid; Title: string);
    var
      P, I, J, YPos, XPos, HorzSize, VertSize: Integer;
      AnzSeiten, Seite, Zeilen, HeaderSize, FooterSize, ZeilenSize, FontHeight: Integer;
      mmx, mmy: Extended;
      Footer: string;
    begin
      //Koptekst, Voettekst, Zeilenabstand, Schriftgröße festlegen
      HeaderSize := 100;
      FooterSize := 200;
      ZeilenSize := 36;
      FontHeight := 36;
      Printer.Title  := Title;
      Printer.BeginDoc;
      //Druck auf mm einstellen
      mmx := GetDeviceCaps (TWinPrinter(Printer).Handle, PHYSICALWIDTH) /
        GetDeviceCaps(TWinPrinter(Printer).Handle, LOGPIXELSX) * 25.4;
      mmy := GetDeviceCaps(TWinPrinter(Printer).Handle, PHYSICALHEIGHT) /
        GetDeviceCaps(TwinPrinter(Printer).Handle, LOGPIXELSY) * 25.4;
      VertSize := Trunc(mmy) * 10;
      HorzSize := Trunc(mmx) * 10;
      SetMapMode(TwinPrinter(Printer).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
        //Koptekst
        Printer.Canvas.Font.Height := 68;//48; //aangepast
        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);
        //Voettekst
        Printer.Canvas.MoveTo(0, - VertSize + FooterSize);
        Printer.Canvas.LineTo(HorzSize, - VertSize + FooterSize);
        Printer.Canvas.Font.Height := 56;//36; // aangepast
        Footer := 'Pagina: ' + 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 Grid.RowCount >= I + (Seite - 1) * Zeilen then
          begin
            XPos := 0;
            for J := 0 to Grid.ColCount - 1 do
            begin
              Printer.Canvas.TextOut(XPos, - YPos,
                Grid.Cells[J, I + (Seite - 1) * Zeilen - 1]);
              XPos := XPos + Grid.ColWidths[J] * 3;
            end;
            YPos := YPos + ZeilenSize;
          end;
        end;
        //Seite hinzufügen
        Inc(Seite);
        if Seite <= AnzSeiten then Printer.NewPage;
      end;
      Printer.EndDoc;
    end;
    
    procedure TFmain.SpeedButton1Click(Sender: TObject);
    begin
      If QuestionDlg ('KEUZE !','Gegevens afdrukken?'+#13+
         '',mtConfirmation, [mrYes,'OK', mrNo, 'Annuleren'],'') = mrYes then
      begin
        PrintStringGrid(StringGrid1, 'Print Stringgrid Wizen '+
              formatdatetime('dd'+'/'+'mm'+'/'+'YYYY', Now));
      end;
    end;

  14. #29
    Vertaling van variabelen kun je doen door de variabelen die Duits zijn deze even door Google Translator te gooien.

    Verder heb je de regel voor Font.Height aangepast van 36 naar 56 maar 5 regels verder zie je dit weer staan Printer.Canvas.Font.Height := FontHeight;

    Dus je hebt alleen de fontsize van de header aangepast.
    Als je de fontsize van je regels aan wilt passen moet je die variabele FontHeight aanpassen. Die wordt helemaal in het begin van de procedure op 36 gezet.

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

    Exclamation

    rvk,
    Vertaling via Google is niet "het" belangrijkste.

    Heb de font en spatie tussen de lijnen aangepast volgens de zichtbaarheid voor mijn ogen.

    Nog een vraagje:
    Wat en waar moet er aangepast worden om op de tweede pagina ook de namen van de spelers te krijgen zoals op pagina 1. ???

Page 2 of 4 FirstFirst 1 2 3 4 LastLast

Thread Information

Users Browsing this Thread

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

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
  •