Tisk v Delphi 2. - grafika - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Delphi

Tisk v Delphi 2. - grafika

tisk

1. března 2002, 00.00 | Dnes se podíváme na asi nejdůležitější téma celého seriálu - tisk grafiky a popis objektu TPrinter.

V dnešním dílu seriálu se podrobněji podíváme na tisk grafiky a seznámíme se s objektem TPrinter, jehož využití je pro tisk grafiky (a tisk vůbec) naprosto nezbytné.

TPrinter a jeho vlastnosti

Jak už bylo řečeno v úvodním odstavci, řeč bude o objektovém typu TPrinter. Ten v Delphi reprezentuje připojenou tiskárnu (přesněji všechny připojené tiskárny, ale jen jedna z nich je vždy aktivní) a pomocí jejho vlastností a metod se odehrává drtivá většina interakcí s ní. Typ TPrinter je deklarován v unitě Printers, ze které jsme už využili proceduru AssignPrn v minulém dílu seriálu. Objekty tohoto typu není nutné vytvářet, jeden takový už existuje v podobě globální proměnné Printer, deklarované v téže unitě. Je to podobný princip jako u proměnné Screen nebo Application.

Technická poznámka pro pokročilé: Ve skutečnosti Printer není proměnná ale funkce, která při svém prvním zavolání objekt vytvoří a vrátí ho volajícímu. Důvodem, proč se vývojáři v novějších verzích Delphi rozhodli pro tuto implementaci je, že tisk nepatří k tolik využívaným vlastnostem, aby bylo nutné vytvářet objekt už při startu aplikace, navíc toto řešení díky "chytrému" linkování (kdy se nezavolané procedury, funkce a objekty nepřibalují k programu) ušetří několik kilobajtů na velikosti výsledného EXE či DLL souboru.

Nyní si popíšeme nejdůležitější vlastnosti objektu TPrinter (pro kompletní přehled vás odkážu do nápovědy k VCL). Rozdělím je na dvě skupiny - podle toho, zda jejich použití má větší smysl před vlastním tiskem nebo až během něj:

Před tiskem

Printers: TStrings
Seznam tiskáren, které jsou k počítači připojené (resp. nainstalované ve Windows). Obsahem jednotlivých řetězců jsou názvy "pro lidi" - např. "HP DeskJet 710C on LPT1:" - hodí se tedy například k zobrazení do seznamu v nějakém dialogu.
PrinterIndex: Integer
Index vybrané tiskárny - na té se bude tisknout. Na počátku je tato vlastnost nastavená podle výchozí tiskárny ve Windows, ale můžete ji změnit podle potřeby či uživatelovy volby.
Orientation: (poPortrait, poLandscape)
Orientace tisku - na výšku či na šířku.
Copies: Integer
Počet kopií, které chcete od dokumentu vytisknout.
Title: String
Pojmenování tiskové úlohy. Objeví se, pokud si zobrazíte během tisku seznam tiskových úloh na dané tiskárně. Většinou vyhovuje jako hodnotu nastavit jméno souboru, který chcete tisknout, případně ještě jméno vašeho programu.

Během tisku

Fonts: TStrings
Seznam fontů, které jsou na tiskárně dostupné. Vlastnost je analogická TScreen.Fonts pro obrazovku. Většinou bývají dostupné všechny běžné TrueType fonty a někdy i speciální fonty tiskárny (pokud nějaké tiskárna má a podporuje to její ovladač).
PageWidth, PageHeight: Integer
Šířka a výška tiskové strany v bodech. Podle rozlišení tiskárny nabývají tyto dvě vlastnosti většinou hodnot řádově tisíců.
PageNumber: Integer
Číslo právě tištěné stránky.
Printing: Boolean
Má hodnotu True, pokud jsou zrovna tiskárně zasílána data pro tisk (přesněji, pokud je program v části mezi voláním BeginDoc a EndDoc resp Abort - viz dále).
Aborted: Boolean
Má hodnotu True, pokud byl tisk přerušen (byla zavolána metoda Abort).
Canvas: TCanvas
Objekt reprezentující "kreslicí plochu" stránky. Blíže níže.
Vlastní tisk

Po telegrafickém seznamu vlastností si ukážeme, jak tedy vlastně tisknout. Nejdříve nastavíme vlastnosti uvedené v sekci Před tiskem a zavoláme metodu BeginDoc. V tu chvíli se započne vlastní tisková úloha, vlastnost Printing bude mít hodnotu True a na hlavním panelu se objeví ikonka tiskárny. Nyní můžeme kreslit na stránku. To činíme pomocí objektu Canvas. Je to stejný objekt, pomocí kterého se kreslí na formuláře, jeho jednotlivé ovládací prvky, do bitmap apod. Těm, kteří ho neznají, doporučuji nastudovat z nápovědy (kupodivu na toto téma na Builderu doposud nevyšel žádný článek - asi budu muset nějaký napsat :-) Shrnu jen, že Canvas obsahuje vlastnosti a metody umožňující kreslení základních geometrických útvarů (čáry, obdélníky, elipsy, ...), rastrových obrazů (libovolně roztažených) a textu v libovolném fontu, velikosti a stylu.

S objektem Canvas je potřeba zacházet "jemněji", než při kreslení na obrazovku. Tiskárna má totiž oproti monitoru vysoké rozlišení, což se projevuje zejména u písem (monitory mají většinou rozlišení 72 DPI, takže bod ve velikosti písma splývá s jedním pixelem - to na tiskárně neplatí!). Setkal jsem se také s tím, že některé starší drivery tiskáren nepodporují úplně správně některé "pokročilejší" vlastnosti, jako třeba roztahování bitmap (v mém případě tomu tak bylo na jehličkové tiskárně Star-LC 15). Docela dlouho (asi 10 testovacích stránek...) mi trvalo, než jsem zjistil, že v mém programu tisknoucím mimo jiné texty s obrázky opravdu žádná chyba není.

Po nakreslení stránky je potřeba zavolat proceduru NewPage - tím také zvednete hodnotu vlastnosti PageNumber o jednotku. Když nakreslíte všechny stránky, stačí zavolat EndDoc a výplod vašeho programu putuje na tiskárnu.

Pokud byste měli potřebu ukončit tisk ještě dříve, než fyzicky začal (o což se většinou pokouší uživatel klikající na tlačítko Storno po zjištění, že tiskne něco, co nechtěl), stačí zavolat metodu Abort.

Ukázka

Aby to dnes nebylo jen povídání, zařadím jednu malou ukázku - vytiskne název tiskárny v rámečku, a to v různobarevném provedení. Myslím, že podrobnější komentář kódu je vcelku zbytečný, protože kód "mluví sám":

with Printer do
begin
  Title := 'Test';
  BeginDoc;
  with Canvas do
  begin
    Pen.Color := clRed;
    Pen.Width := 5;
    Rectangle(0, 0, PageWidth, PageHeight);
    Font.Color := clGreen;
    Font.Name := 'Arial';
    Font.Size := 20;
    Font.Style := [fsBold, fsItalic];
    TextOut
      (PageWidth - TextWidth(Printers[PrinterIndex])) div 2,
      (PageHeight - TextHeight(Printers[PrinterIndex])) div 2,
      Printers[PrinterIndex]);
  end;
  EndDoc;
end;

Příště

Příště si podrobně popíšeme dva standardní dialogy, které Delphi nabízí programátorům k využití v souvislosti s tiskem.

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » Delphi  

 » Rubriky  » Windows  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: