11.07.2015 Views

Editorial - Vitajte na stránkach www.einsty.hostujem.sk

Editorial - Vitajte na stránkach www.einsty.hostujem.sk

Editorial - Vitajte na stránkach www.einsty.hostujem.sk

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

P R O G R A M U J E M EDelphi v praxi / 22. èas: Výstupné periférie I.Poèítaè by nebol poèítaèom bez periférnych zariadení. Tie v koneènom dôsledku majú vstup−ný alebo výstupný charakter. Tento èlánok pojednáva o výstupných periférnych zariadeniach,konkrétnejšie o tlaèiaròach a ich obsluhe v programovacom prostredí Delphi s vyuitím kom−ponentov štandardnej výbavy. O tlaèiaròach nemusíme ve¾a hovori mono aj preto, lebo o ichobsluhu sa v dnešnej dobe stará operaèný systém s príslušným ovládaèom. Myslím, e mámeMicrosoftu by za èo vïaèní. Implicitné jadro systému je akousi normou fungujúcou vdypod¾a pôvodných pravidiel s novými zlepšeniami. Mono aj preto je programovanie v Delphitaké, aké je. Bez oh¾adu <strong>na</strong> metódu tlaèenia a typ tlaèiarne nechávame všetku exaktnú bitovúa prenosovú zodpovednos <strong>na</strong> operaènom systéme. Keïe tento seriál je o programovaní,<strong>na</strong>šou úlohou bude vytlaèi text a iné grafické objekty s adekvátnym predtlaèovým <strong>na</strong>stave−ním, tak ako pri iných, u štandardizovaných aplikáciách. Tento èlánok nie je alfou a omegoutlaèenia v Delphi. Všetci môeme aktívne vyuíva <strong>na</strong> to urèené komponenty, ktorých je všade,<strong>na</strong>jmä <strong>na</strong> internete, dos. Po ich sumarizácii zistíme, e podstatu veci vystihuje len zlomok znájdených. Napokon nás nemilo prekvapí štatút komponentu... A sme <strong>na</strong> zaèiatku konca. Aj<strong>na</strong>priek tomuto <strong>sk</strong>eptickému uvaovaniu sú <strong>na</strong> internete dostupné free komponenty, ktorénám tlaèenie bezpochyby u¾ahèia. My sa takejto monosti pozrieme „<strong>na</strong> zúbky“ bez zbytoè−ných komponentov. Urobíme to so štandardnou paletou kniníc a komponentov.TMEMO. Prvým <strong>na</strong>ším testom je tlaè z <strong>na</strong>jelementárnejšieho textového komponentuTMemo. Náhrada tohto komponentu iným, samozrejme textovým, by mala identicky ko−pírova funkcio<strong>na</strong>litu Memo. Tento spôsob tlaèe je podmienený pouitím kninice Prin−ters, ktorú dopíšeme do klauzuly uses nášho programu.procedure TForm1.Button1Click(Sender: TObject);var i: Integer;p: TextFile;beginAssignPrn(p);Rewrite(p);For i := 0 to Memo1.Lines.Count−1 do WriteLn(p,Memo1.Lines[i]);CloseFile(p);end;Ak sa nemýlim, v PC REVUE è. 1/2002 sme sa venovali práci so súbormi, kde sme malimonos stretnú sa s obdobnými aj identickými príkazmi. Pri tlaèení si podobným spô−sobom ako pri zápise do súboru vytvoríme akýsi tlaèový súbor. Samozrejme, predtýmtreba vytvori premennú p, ktorej následne pridelíme vlastnos AssignPrn(p);. PríkazomRewrite(p); tvoríme novú úlohu tlaèenia tak ako pri súboroch nový súbor. Teraz len posie−lame dáta urèené <strong>na</strong> tlaè tak, e vytvoríme cyklus opakujúci sa to¾kokrát, ko¾ko riadkovmá náš text. Aktívnym príkazom je bezpochyby WriteLn(p,Memo1.Lines[i];). Ukonèenietlaèe je definované v poslednom riadku CloseFile(p);. Pri tlaèení si urèite všimnete niejeden nedostatok. Musím sa však priz<strong>na</strong>, e ide o <strong>na</strong>jtriviálnejší spôsob výstupu k tlaèiar−ni. Hlavným nedostatkom tlaèenia týmto spôsobom je, e ak šírka riadka presahuje <strong>na</strong>sta−venú šírku stránky, Delphi automaticky rozdelí tento riadok <strong>na</strong> dva alebo viac bez oh¾adu<strong>na</strong> celistvos slov. Preto je nevyhnutné doplni uvedený zdrojový kód o algoritmus, ktorýby sa o korektné delenie textu postaral.TPRINTERS. S istotou môeme tvrdi, e v praxi je tlaèenie priam nevyhnutné. Aj <strong>na</strong>−priek dobe „elektronických mašiniek“ je akýko¾vek vytlaèený text nejakou právnou istotoujeho majite¾a (<strong>na</strong>pr.: faktúra). Aj keï si myslím, e správne aplikovaný softvér, respektívenejaká celosvetová norma by poriadne saila cestu „elektronickému falšovate¾ovi“, pri−èom papier je len papier a staèí „poštva“ novú tlaèiareò <strong>na</strong> nejakú peèiatku... No alevráme sa k tým ostatným tlaèovým úlohám. Pri tlaèi akéhoko¾vek nehomogénneho textusa urèite nezaobídeme bez jeho odoslania <strong>na</strong> presnú pozíciu danú súradnicami [x;y]. Sospomenutou rutinou by bolo takéto tlaèenie prakticky nemoné. Prvým problémom jevariabilná šírka z<strong>na</strong>ku pri pouití rôznych druhov písiem (okrem Courier). Z histórie prog−ramovania vieme, e prvopoèiatky tlaèenia boli aké, ale u tu máme rok 2003, a tak <strong>na</strong>to pouijeme distingvovaný postup. Základ bude tvori opä kninica Printers, ktorú dopí−šeme do klauzuly uses (pokia¾ ju tam nemáme). Tá zastupuje všetky tlaèiarne pripojené kpoèítaèu. Samozrejme, len jed<strong>na</strong> môe by aktív<strong>na</strong>, pripravená <strong>na</strong> tlaè. Na tlaè môemepoui funkciu Printer, ktorá je implementovaná v u zapísanej kninici. Pracova s òounie je vôbec zloité, ba je identické s prácou v TImage komponente. Zaèiatok by mal byprezentovaný zápisom:with Printer do beginTak sme si pri kadom ïalšom riadku ušetrili nejaký ten z<strong>na</strong>k. Vypíšem zopár vlastností,pomocou ktorých sa <strong>na</strong>uèíme pripravi stránku pred tlaèou.Rozpis základných vlastností objektu PrinterBeginDocZaèiatok dokumentuEndDocKoniec dokumentuCanvasPodtrieda samotného vykres¾ovaniaCopiesPoèet kópiíPageHeightVýška stranyPageWidthŠírka stranyTitleNázov tlaèovej úlohyTieto základné vlastnosti by sme mohli doplni o nejaké rozširujúce, ako je <strong>na</strong>stavenieaktívnej tlaèiarne vlastnosou Printers:TStrings, èo môeme vylúèi pouitím ïalej opiso−vaného TPrintDialog. Trošku ešte ostaneme pri výbere tlaèiarne <strong>na</strong> tlaè. Vieme, e ope−raèný systém Windows pri vyuívaní viacerých tlaèiarní, respektíve iných súborových vý−stupov, zavádza pojem predvolená tlaèiareò (v èeštine výchozí ti<strong>sk</strong>ár<strong>na</strong>). Tento parametersme zvyknutí meni v tlaèiaròach <strong>na</strong>chádzajúcich sa v ovládacom paneli. Samozrejme,existuje aj monos vloenia takejto funkcie do nášho programu. Vieme, e takéto <strong>na</strong>sta−venie bude uloené v systémových registroch. Prezradím vám len vetvu a cestu. V HKEY_CURRENT_CONFIG si nájdeme \System\CurrentControlSet\Control\Print\Printers. V prípa−de, e editujete nejakú hodnotu registrov, pravdepodobne sa stretnete s problémom aktua−lizácie. Staèí, ak vyšlete <strong>na</strong>sledujúce upozornenie o zmene:SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, LongInt(PChar('windows')));Takýto zásah do registrov je moné realizova <strong>na</strong> OS Windows 9x. Takisto by sa námzišlo <strong>na</strong>stavenie tlaèenej stránky, èi u budeme tlaèi dokument <strong>na</strong> šírku, alebo <strong>na</strong> výšku.Jednoducho to drí pod záštitou ïalšia vlastnos Printera a tou je Orientation. Môemejej definova dve hodnoty poPortrait a poLandscape. Tak by sa <strong>na</strong>šlo ešte zopár jedno−duchých <strong>na</strong>stavení, <strong>na</strong> ktoré pri programovaní urèite prídete. Take prvým krokom po<strong>na</strong>stavení tlaèiarne je aktivácia tlaèovej úlohy pomocou metódy BeginDoc. Tým sa aktivu−je tlaèiareò, èo spozorujeme pribudnutím ikony tlaèiarne v paneli trayicon. Potom u mô−eme „kresli <strong>na</strong> tlaèiareò“. Realizujeme to tak, ako keï vykres¾ujeme <strong>na</strong> formulár aleboiný komponent (TImage, TShape a iné). Take som vám u trošku <strong>na</strong>z<strong>na</strong>èil, e vykresleniebudeme realizova pomocou objektu Canvas. Ten znázoròuje plochu pre grafiku, respek−tíve text. O objekte Canvas toho asi ve¾a písa netreba. Obsahuje priame grafické výstupy rôz−nych tvarov 2D zobrazovania. Vypíšeme si ich len zopár:Arc(X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer);Draw(X, Y: Integer; Graphic: TGraphic);DrawPoint(X, Y: Integer);MoveTo(X, Y: Integer); – LineTo(X, Y: Integer);Rectangle(X1, Y1, X2, Y2: Integer);TextOut(X, Y: Integer; const Text: WideString);Myslím, e tieto preklada urèite netreba. Vypísanie textu realizujeme pod¾a posled−ného príkladu. Premenná WideString je kompatibilná so String. Oplatí sa tie spomenúmonos <strong>na</strong>stavenia textu, <strong>na</strong>príklad aj takto:Font.Color := clRed;Font.Name := 'Arial';Font.Size := 24;Font.Style := [fsBold];Samozrejme, to všetko pod Printer a Canvas. Take teraz by u nemal vzniknú prob−lém pri tlaèení akéhoko¾vek, aj rozhádzaného textu. Pre kompletizáciu si ukáeme jadroudalosti OnClick pre komponent Button1.procedure TForm1.Button1Click(Sender: TObject);beginwith Printer do beginTitle := 'PCRevuePrintTest';BeginDoc;with Canvas do beginPen.Color := clBlack;Pen.Width := 7;Rectangle(0, 0, PageWidth, PageHeight);Font.Color := ClRed;Font.Name := 'Arial';Font.Size := 24;Font.Style := [fsBold];TextOut(100,100,'PCRevue Print Test');end;EndDoc;end;end;Teraz u celý postup máme pokope. Nastavili sme si názov tlaèovej úlohy, vytvorili smezaèiatok dokumentu. Ïalej u len jednoducho <strong>na</strong>stavujeme a vykres¾ujeme <strong>na</strong> tlaèiareòobdånik, v ktorom je <strong>na</strong> pozícii [100;100] vpísaný text „PCRevue Print Test“.TPRINTERSETUPDIALOGMonoe nám v predchádzajúcich prípadoch chýbali štandardné okná implementované voperaènom systéme. Nastavenie tlaèe <strong>na</strong> šírku alebo výšku sme realizovali prostredníc−tvom objektu Printer a príkazu Orientation. V prípade TPrinterSetupDialogu, ktorý si náj−deme v záloke Dialogs, sa stretneme so známym oknom <strong>na</strong> <strong>na</strong>stavenie niektorých (nievšetkých) vlastností tlaèenia. Osobne preferujem formu vyuívania príkazovej súpravyobjektu Printer s vlastným vzh¾adom, prípadne s vlastným prvkom automatizácie pod¾apotreby a vlastného uváenia. V prípade, ak chceme vyui toto dialógové okno, aktivu−jeme ho známym zápisom:PrinterSetupDialog1.Execute;Tento komponent nedisponuje iadnymi vlastnosami, ktorými by sa dal upravi, zlep−ši, ako je to v <strong>na</strong>sledujúcom prípade.1/2003 PC REVUE 111

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!