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 4. - převod délkových jednotek a ladění tisku
tisk
15. března 2002, 00.00 | Dnešní díl bude problémově orientovaný - nejdříve se podíváme na problémy spojené s délkovými jednotkami a poté si ukážeme, jak efektivně ladit tisk.
Délkové jednotkyPokud budete ve svém programu implementovat funkci tisku, pravděpodobně dáte uživateli možnost nastavit různé parametry stránky - okraje, velikosti záhlaví a zápatí apod. Zde je ovšem skryt malý háček - zatímco při vykreslování stránky na tiskárně je používanou jednotkou tiskový bod, uživatel by nejspíš chtěl parametry zadávat v přirozenějších jednotkách, jako jsou centimetry, milimetry nebo v anglosaských krajích palce. Jak mu to umožnit?
Nejdříve dva jednoduché vzorečky:
px = inch * res
1 inch = 2,54 cm = 25,4 mm
První vzorec říká, že délku v tiskových bodech spočítáme z délky v palcích vynásobením rozlišením tiskárny. To je celkem jasné už jenom z dešifrování zkratky jednotky pro rozlišení (DPI = dots per inch = body na palec). Druhý řádek jen uvádí do vztahu palce, centimetry a milimetry.
Jedinou neznámou zůstává rozlišení tiskárny. Na jeho zjištění existuje API funkce GetDeviceCaps. Ta umí vracet hodnoty různých parametrů zobrazovacích zařízení připojených k počítači, rozlišení je jen jeden z mnoha. Prvním parametrem této funkce je handle kontextu zařízení, o kterém chceme zjišťovat informace, druhým je pak speciální konstanta identifikující, co chceme vědět. Výsledek nám funkce předá jako svou návratovou hodnotu.
V našem případě použijeme jako druhý parametr konstanty LOGPIXELSX a LOGPIXELSY. Proč dvě? Protože potřebujeme zjistit jak horizontální tak i vertikální rozlišení dané tiskárny a ty nemusí být vždy stejné.
Výsledkem naší snahy jsou dvě jednoduché funkce pro převod z milimetrů na tiskové body jak ve vodorovném tak ve svislém směru:
|
Ještě malé upozornění: Tyto funkce používejte až po zavolání BeginDoc, protože do té doby není jisté, na které tiskárně se rozhodnete tisknout, takže použitá vlastnost Printer.Canvas.Handle ještě není inicializována.
DebugPrintPokud budete někdy ladit tisk v nějakém větším programu (což se mi už dvakrát v životě přihodilo), spotřebujete tuny papíru a inkoustu (či toneru, pásek a já nevím čeho ještě) a navíc většinu doby budete jen čekat, až se vytiskne váš poslední pokus. Jelikož jsem tohle nepovažoval za produktivní způsob práce, udělal jsem si kdysi pomocnou unitu DebugPrint, kterou vám tu teď představím, protože si myslím, že by vám mohla podstatně ulehčit práci. Je open source a můžete si ji stáhnout z mých stránek a používat dle libosti.
Princip unity je v tom, že místo TPrinter definuje objekt TDebugPrinter (a proměnnou DebugPrinter), které jsou z vnějšku naprosto shodné s TPrinter a Printer. Podstatný rozdíl je ale "vevnitř" - pokud jimi totiž nahradíte právě tyto standardní objekty, výsledky tisku nepoputují na tiskárnu, ale do metasouboru (přípona .emf) umístěného na ploše Windows (případně kdekoliv jinde - můžete zvolit pomocí vlastnosti OutputDir). Pro každou stránku je vytvořen nový metasoubor, který pak můžete prohlížet prakticky jakýmikoliv prohlížečem obrázků (třeba mým oblíbeným AcdSee).
Výhody jsou zřejmé - ušetřený papír a čas. Celý tisk se tak dá odladit za minimálních nákladů a když všechno funguje, stačí vytisknout jednu dvě stránky pro ověření.
Unita se nejlépe používá spolu s podmíněným překladem - pak stačí pro přepnutí mezi laděním a ostrou verzí jen přepsat jedno $define na $undef:
|
Příště
Příště se podíváme na to, jak ve Windows přepnout výchozí tiskárnu, což rozhodně není tak jednoduchý úkol, na jaký to vypadá.
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
-
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