Verander alle Printer.Canvas.Handle eens in Printer.Handle.
rvk,
Er stond Printer.Handle!!!Verander alle Printer.Canvas.Handle eens in 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;
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.
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;
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.
rvk,
Met de beste wil van de wereld .... maar hier kan ik niet meer volgen.
Wat ...Waar ... Hoe ...
Mijn mogelijkheden in coderen zijn beperkt.
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.
rvk,
Ik ga het morgen aanpakken.
Nu even een lekkere BBQ met het moie weer.
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.Is volgende de juiste manier:Code:mmx := GetDeviceCaps(Printer.Handle, PHYSICALWIDTH) / GetDeviceCaps(Printer.Handle, LOGPIXELSX) * 25.4;
Code:mmx := GetDeviceCaps(TWinPrinter(Printer).Handle, PHYSICALWIDTH) / GetDeviceCaps(TWinPrinter(Printer).Handle, LOGPIXELSX) * 25.4;
Was vergeten welke errors:
Ik zit nog steeds vast!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);
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:
Wie heeft die IFNDEF erin gezet?Delphi Code:
{$IFNDEF WINDOWS} Windows, Mesages, jpeg, {$ENDIF}
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.
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;
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.
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. ???
There are currently 1 users browsing this thread. (0 members and 1 guests)
Bookmarks