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 1. - obyčejný text
tisk
22. února 2002, 00.00 | V prvním dílu nového seriálu o "zkrocení" tiskárny v Delphi se budeme věnovat tisku neformátovaného textu.
Tímto článkem zahajuji nový seriál o tisku z prostředí Delphi, určený spíše začínajícím či mírně pokročilým čtenářům. Naučíte se v něm postupně tisknout text, grafiku, ovládat a vybírat tiskárnu (pokud jich má uživatel více) a také si ukážeme standardní tiskové dialogy Delphi. V závěru seriálu pak možná dojde i na některé pokročilejší techniky, které doufám ocení i zkušenější programátoři.
Tisk textu bez formátováníDnes se vrhneme na tisk čistého textu. Ten v Delphi probíhá poměrně jednoduše. Budu předpokládat, že umíte zacházet s textovými soubory - pokud ne, tak se to rychle doučte, protože tisk textu v Delphi probíhá prakticky stejně, jako zápis do textového souboru.
Ukážeme si jednoduchý příklad - tisk textu obsaženého v komponentě TMemo. Můžete si třeba představit, že právě tvoříte nějaký svůj vlastní Poznámkový blok a zapracováváte do něj příkaz Soubor|Tisk.
|
Je vidět, že kód se od zápisu do textového souboru liší opravdu minimálně. Na počátku je deklarována proměnná P typu TextFile - tedy standardní typ proměnné pro textové soubory. Pak je jí ale místo přiřazení nějakého souboru obvyklým příkazem Assign přiřazena tiskárna pomocí příkazu AssignPrn (deklarovaném v unitě Printers). Jelikož zapisujeme, musí se zavolat Rewrite. Pak postupně vytiskneme jednotlivé řádky textu (pokud potřebujete, můžete samozřejmě při tisku kromě Wiriteln používat i Write). Nakonec virtuální soubor tiskárny uzavřeme pomocí obvyklého CloseFile.
Lepší algoritmusPředcházející procedura má ale jednu velkou chybu, vylučující ji z praktického použití. Pokud bude totiž v Memo1 řádek delší než je šířka stránky, Delphi ho podle své libosti rozdělí na více řádků - a nehledí přitom na to, že je to třeba uprostřed slova. Bylo by dobré, kdybychom měli vlastní algoritmus zlomu, který by takové řádky rozdělil na víc řádků pod sebe trochu inteligentněji - podobně jako když v TMemo nastavíte vlastnosti WordWrap na True. Takový algoritmus by mohl vypadat třeba takto:
|
Algoritmus vypadá jako celkem nepřehledná dlouhá nudle, ale ve skutečnosti není nijak složitý. První důležitou věci je konstanta PageWidth, která určuje počet znaků vytištěných na jednom řádku. V praxi by to měla být spíš proměnná, kterou by uživatel mohl nastavit podle své vůle a zvůle.
Důležité proměnné jsou Line a Word - první obsahuje text, který je zatím na aktuálním výstupním řádku, druhá právě zpracovávané slovo (za slovo je zde považována sekvence znaků oddělených mezerou). Pro úplnost: Proměnná Ch je jenom zkratka za Memo1.Lines[I][J].
Algoritmus funguje tak, že postupně bere řádky z Memo1, a každý prochází po znacích. Pokud aktuální znak není mezera, přidá se k aktuálnímu slovu. Pokud znak je mezera, zjistí se, zda by přidání posledního slova k aktuálnímu výstupnímu řádku tento přesáhl délku PageWidth. Pokud ano, řádek se vytiskne bez tohoto slova a slovo se prohlásí za začátek nového výstupního řádku. Pokud se slovo ještě na aktuální výstupní řádek vejde, prostě se přidá na jeho konec a algoritmus pokračuje dál.
Když skonči vnitřní cyklus (ten, který prochází řádky z Memo1), tak může v proměnných Line a Word zbýt nějaký text. Ten se pak vytiskne na jeden nebo dva řádky, podle toho, jak se tam vejde.
ZávěrŽe už nyní umíte tisknout text je sice hezké, leč v praxi ne příliš použitelné. Příště se můžete tedy těšit na popis objektu TPrinter, s jehož pomocí se v Delphi tiskne grafika a ovládá spousta dalších vlastností tiskárny.
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