Autor Téma: TVirtualStringTree - tisk  (Přečteno 207 krát)

Offline VladaT

  • Nováček
  • *
  • Příspěvků: 3
  • Karma: 0
    • Verze Delphi: Delphi 10.4
TVirtualStringTree - tisk
« kdy: 07-12-2022, 11:50:17 »
Ahoj,
nemáte někdo zkušenost s použitím metody PRINT u VirtualStringTree? Zkouším vytisknout jednoduchý strom, a pokud je delší než jedna stránka, tak tam vkládá prázdné stránky. Dělá to u PDF tiskárny i u fyzického tisku... Můžete případně někdo toto chování u sebe odzkoušet? Díky.


Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3361
  • Karma: 112
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:TVirtualStringTree - tisk
« Odpověď #1 kdy: 07-12-2022, 15:12:42 »
A proc si to neodkrokujes, klicove je IMHO predat printer se spravnou strankou

z te metody Print:

Kód: Delphi [Vybrat]
  1.       vPageHeight := Round(Printer.PageHeight / Scale);
  2.       vPageWidth := Round(Printer.PageWidth / Scale);
  3.  
  4.       // We do a minumum of one page.
  5.       xPageNum := Trunc(Image.Width / vPageWidth);
  6.       yPageNum := Trunc(Image.Height / vPageHeight);
  7.  
  8.       PrinterImage.SetSize(vPageWidth, vPageHeight);
  9.  
  10.       // Split vertically:
  11.       for yPage := 0 to yPageNum do
  12.       begin
  13.         DestRect.Left := 0;
  14.         DestRect.Top := 0;
  15.         DestRect.Right := PrinterImage.Width;
  16.         DestRect.Bottom := PrinterImage.Height;
  17.  
  18.         // Split horizontally:
  19.         for xPage := 0 to xPageNum do
  20.           begin
  21.             SrcRect.Left := vPageWidth * xPage;
  22.             SrcRect.Top := vPageHeight * yPage;
  23.             SrcRect.Right := vPageWidth * xPage + PrinterImage.Width;
  24.             SrcRect.Bottom := SrcRect.Top + vPageHeight;
  25.  
  26.             // Clear the image
  27.             PrinterImage.Canvas.Brush.Color := clWhite;
  28.             PrinterImage.Canvas.FillRect(Rect(0, 0, PrinterImage.Width, PrinterImage.Height));
  29.             PrinterImage.Canvas.CopyRect(DestRect, Image.Canvas, SrcRect);
  30.             PrtStretchDrawDIB(Printer.Canvas, Rect(0, 0, Printer.PageWidth, Printer.PageHeight - 1), PrinterImage);
  31.             if xPage <> xPageNum then
  32.               Printer.NewPage; <<<<<<<<<<<<<<<<<<<<<<<<<<<
  33.           end;
  34.         if yPage <> yPageNum then
  35.           Printer.NewPage; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  36.       end;
  37.  
Embarcadero MVP - Czech republic

Offline VladaT

  • Nováček
  • *
  • Příspěvků: 3
  • Karma: 0
    • Verze Delphi: Delphi 10.4
Re:TVirtualStringTree - tisk
« Odpověď #2 kdy: 07-12-2022, 15:43:31 »
Zkoušel jsem, ale nějak jsem se v to ztratil.
Tiskárnu vybírám v PrintDialogu (dále jen PD), má nastavený papír A4. Pokud místo volání
Kód: Delphi [Vybrat]
  1. VST.Print(printer,false);
dám na zkoušku toto:
Kód: Delphi [Vybrat]
  1.  if pd.Execute then begin
  2.   printer.BeginDoc;
  3.   printer.Canvas.TextOut (400, 400, 'Test - 1.strana');
  4.   printer.NewPage;
  5.   printer.Canvas.TextOut (400, 400, 'Test - 2.strana');
  6.   printer.EndDoc;
  7.  end;
  8.  

tak je vše OK, stránky sedí - tiskárna je vybraná dobře.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3361
  • Karma: 112
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:TVirtualStringTree - tisk
« Odpověď #3 kdy: 07-12-2022, 16:17:15 »
Ale no tak, to je citelny kod a jednoduchy jak zebrik.

Co obsahuji

Printer.PageHeight
Scale
Printer.PageWidth

Z toho se vypocte xPageNum a yPageNum  coz je pocet stranek x a y a pak uz jsou to jen dva vnorene cykly, ktere postupne tisknou stranky.
Tj. evidentne se dojde k spatnemu poctu stranek.
Embarcadero MVP - Czech republic

Offline VladaT

  • Nováček
  • *
  • Příspěvků: 3
  • Karma: 0
    • Verze Delphi: Delphi 10.4
Re:TVirtualStringTree - tisk
« Odpověď #4 kdy: 07-12-2022, 16:53:45 »
Tak pěkně děkuji za nakopnutí  :)
Šířka obrázku o chlup přelezla šířku stránky z tiskárny (7016x4961 což je A4 při 600dpi) a on tam tedy nacpal vždy tu jednu horizontální prázdnou stránku. To mě zmátlo a hledal jsem problém jinde.