Živě.cz o počítačích a internetu

Tipy a triky v Delphi, díl 87. - Word

Jan Šindelář - 23.4.2003

Náplň dnešního dílu je tedy jasná, takže se pustíme do práce. I dnešní příklad využívá OLE a proto je nezbytně nutné, aby byl na počítači, kde budete ukázku testovat, nainstalován Word. Stejně jako v minulých příkladech pak potřebujeme knihovnu ComObj.

A co vlastně bude náš dnešní příklad umět? Po kliknutí na příslušné tlačítko bude spuštěn Word a v něm založen nový dokument. Bude-li již Word běžet ještě před spuštěním naší aplikace, bude prostě otevřena další instance a původní dokument se nijak nenaruší. V tomto novém dokumentu bude nejprve vyplněna hlavička a patička dokumentu a dále bude přidán jednoduchý zformátovaný text, který by se dal s trochou nadsázky označit za hlavičku nějakého (úředního) dopisu. Zdrojový kód tedy vypadá takto:

procedure TForm1.Button1Click(Sender: TObject);
var
  Word: OLEVariant;
begin
  try
    Word := CreateOleObject(`Word.Application`);
    Word.Visible := True;
    Word.Documents.Add;
    if Word.ActiveWindow.View.SplitSpecial <> 0 then Word.ActiveWindow.Panes[2].Close;
    if (Word.ActiveWindow.ActivePane.View.type = 1) or
    (Word.ActiveWindow.ActivePane.View.type = 2) or
    (Word.ActiveWindow.ActivePane.View.type = 5) then
    Word.ActiveWindow.ActivePane.View.type := 3;
    Word.ActiveWindow.ActivePane.View.SeekView := 9;
    Word.Selection.Font.Name := `Times New Roman`;
    Word.Selection.Font.Size := 12;
    Word.Selection.Font.Bold := True;
    Word.Selection.ParagraphFormat.Alignment := 1;
    Word.Selection.TypeText(Text := `Hlavička dokumentu`);
    if Word.Selection.HeaderFooter.IsHeader = True then Word.ActiveWindow.ActivePane.View.SeekView := 10
    else Word.ActiveWindow.ActivePane.View.SeekView := 9;
    Word.Selection.ParagraphFormat.Alignment := 1;
    Word.Selection.TypeText(Text := `Patička dokumentu`);
    Word.ActiveWindow.ActivePane.View.SeekView := 0;
    Word.Selection.TypeText(Text := `Jméno a příjmení`);
    Word.Selection.TypeParagraph;
    Word.Selection.TypeText(Text := `Ulice a čp.`);
    Word.Selection.TypeParagraph;
    Word.Selection.Font.Name := `Times New Roman`;
    Word.Selection.Font.Size := 12;
    Word.Selection.Font.Bold := True;
    Word.Selection.TypeText(Text := `Město`);
    Word.Selection.TypeParagraph;
    Word.Selection.TypeParagraph;
    Word.Selection.TypeParagraph;
    Word.Selection.TypeParagraph;
    Word.Selection.Font.Name := `Arial`;
    Word.Selection.Font.Size := 14;
    Word.Selection.Font.Bold := True;
    Word.Selection.TypeText(Text := `Nadpis`);
    Word.Selection.TypeParagraph;
    Word.Selection.TypeParagraph;
    Word.Selection.TypeParagraph;
    Word.Selection.Font.Name := `Times New Roman`;
    Word.Selection.Font.Size := 12;
    Word.Selection.Font.Bold := True;
    Word.Selection.TypeText(Text := `Vážená paní / vážený pane`);
  except
  end;
end;

Myslím, že ze zdrojového kódu je velmi dobře vidět jak vložit text požadovaných vlastností a jak vložit odstavec. Experimentováním jistě přijdete na další zajímavé možnosti.

Pokud bude vámi vytvářený text delší a složitější, můžete přímo v průběhu jeho vytváření vidět v okně Wordu jak postupně přibývá a dotváří se. To je proto, že hned jedním z prvních příkazů zapneme viditelnost Wordu (Word.Visible := True). Pokud by vám to nevyhovovalo, samozřejmě můžete tento řádek přesunout až na samý konec.

Určitě jste také zjistili (nebo si možná rovnou všimli v kódu), že po vytvoření dokumentu nebude Word uzavřen. To je proto, že náš dnešní příklad vlastně popisuje jistou modelovou situaci. Ve vaší aplikaci nejprve vyplníte například údaje do EditBoxů a dalších prvků (a nebo je třeba načtete z databáze) a poté jedním kliknutím tlačítka vaše aplikace vygeneruje základ pro obchodní dopis. Ten bude obsahovat základní údaje (hlavičku, patičku, adresu atd..) načtený z EditBoxů a zbytek (text dopisu) poté doplní uživatel ručně, uloží jej a Word uzavře. V tom je právě síla tohoto příkladu. Nemusíte do zdrojového kódu psát natvrdo nějaký text, ale můžete použít textové proměnné (například právě zmiňované EditBoxy), což vám pak umožní dynamicky generovat různé výstupy.