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 vlastnostiJak 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.
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ázkaAby 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":
|
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):
- Tisk v Delphi 1. - obyčejný text
- Tisk v Delphi 2. - grafika
- Tisk v Delphi 3. - standardní dialogy
- Tisk v Delphi 4. - převod délkových jednotek a ladění tisku
- Tisk v Delphi 5. - změna výchozí tiskárny
- Tisk v Delphi 6. - trocha API
- Tisk v Delphi 7. - položky struktury TDeviceMode
- Tisk v Delphi 8. - náhled
Diskuse k článku
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007