Tisk v Delphi 1. - obyčejný text - 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 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.

procedure PrintMemo;
var
  I: Integer;
  P: TextFile;
begin
  AssignPrn(P);
  Rewrite(P);
  for I := 0 to Memo1.Lines.Count do
    Writeln(Memo1.Lines[I]);
  CLoseFile(F);
end;

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ší algoritmus

Př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:

procedure BetterPrintMemo;
const
  PageWidth = 60;
var
  I, J: Integer;
  P: TextFile;
  Line, Word: string;
  Ch: Char;
begin
  AssignPrn(P);
  Rewrite(P);

  for I := 0 to Memo1.Lines.Count do
  begin
    Line := '';
    Word := '';
    for J := 1 to Length(Memo1.Lines[I]) do
    begin
      Ch := Memo1.Lines[I][J];
      if Ch = ' ' then
        if Length(Line + Word) > PageWidth then
        begin
          Writeln(P, Line);
          Word := Word + Ch;
          Line := Word;
          Word := '';
        end
        else
        begin
          Word := Word + Ch;
          Line := Line + Word;
          Word := '';
        end
      else
        Word := Word + Ch;
    end;

    if Length(Line + Word) > PageWidth then
    begin
      Writeln(P, Line);
      Writeln(P, Word);
    end
    else
      WriteLn(P, Line + Word);
  end;

  CLoseFile(P);
end;

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):

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: