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

Tipy a triky v Delphi, díl 126. - Kontrola pravopisu

Jan Šindelář - 18.2.2004

Samotný princip kontroly pravopisu je vlastně velmi jednoduchý. Stačí mít databázi - slovník - výrazů daného jazyka a slova v kontrolovaném textu pak s tímto seznamem porovnat. Nenachází-li se slovo ve slovníku, bude pravděpodobně chybně napsáno. Samozřejmě žádný slovník nemůže obsahovat všechny výrazy, takže žádná taková kontrola nemůže být nikdy 100%. Nemluvě o tom, že i slovo, které se ve slovníku nachází, může být v daném kontextu věty napsáno špatně (např. problémy s koncovkou u přídavných jmen, minulých časů a mnoho dalších...) a odhalení chyby by si pak vyžádalo již mnohem sofistikovanější lexikální analýzu. Běžný slovníkový způsob ale minimálně odhalí většinu překlepů a je to nejpoužívanější a nejrychlejší metoda.

Princip je tedy celkem jednoduchý, ale jistě vás napadlo, v čem je háček. Ano, problém je ve slovníku. Těžko si budete pro vaši malou aplikaci vyrábět vlastní slovník a plnit ho stovkami tisíc výrazů. Jak tedy z toho ven? Prostě použijeme cizí, již existující slovník. A není snad vhodnější cíl pro naší parazitickou činnost než je Microsoft Word. Je to nejrozšířenější textový editor, takže je velká šance, že uživatel naší aplikace jej bude mít nainstalován. Předem upozorňuji ty podnikavější z vás, že "vykuchat" z Wordu pouze slovník a ten pak distribuovat společně s naší aplikací je jednak nelegální a navíc náš dnešní příklad potřebuje ke svému fungování přímo Word jako takový, protože prostřednictvím OLE budeme posílat Wordu jednotlivá kontrolovaná slova z naší aplikace a Word je pak sám porovná se svým slovníkem a řekne nám výsledek. Takže, ještě než se pustíme do zdrojového kódu, udělejme si malé shrnutí. Podmínkou fungování dnešního příkladu je nainstalovaný Word na straně uživatele, tomu pak budeme prostřednictvím OLE posílat slova z naší aplikace, Word je vyhodnotí a vrátí nám výsledek. Můžeme uživateli nabídnout rovněž seznam alternativních výrazů ze slovníku, kterým pak bude chybné slovo nahrazeno.

Pojďme tedy ke zdrojovému kódu. Zde musíme náš článek rozdělit na dvě větve, které závisí na verzi Delphi, kterou používáte. Verze 3 a 4 (či případně i některé odlehčené varianty novějších verzí, nejsem si jist jak jsou na tom například Delphi 6 Personal a podobně) bohužel neobsahují žádné pomocné komponenty, takže si musíme nejprve připravit půdu (viz. dále). To bude téma dnešního dílu. Delphi 5 a vyšší pak obsahují na paletě komponent záložku Servers, kde najdeme příslušné pomocné komponenty pro různé typy dokumentů Office. Ty nám pak práci o něco usnadní. O tom si povíme příště.

Nejprve tedy varianta, kdy nemáme příslušné komponenty k dispozici. V takovém případě musíme do našeho projektu importovat knihovnu typů (type library) pro Word, která nám pak umožní přístup k jednotlivým vlastnostem a metodám objektů Wordu. Vytvoříme si nový projekt a v menu Project pak vybereme položku Import Type Library. Zobrazí se nám seznam možných knihoven, který je závislý na aplikacích a jejich verzích, které máte momentálně nainstalované v počítači. V dlouhém seznamu pak hledejte položku Microsoft Word Object Library (položka obsahuje i číslo verze, které závisí na generaci Office, kterou máte). Pokud podobnou položku na seznamu nevidíte (přestože máte Word nainstalován), musíme ji tam ručně přidat tlačítkem Add. Na disku pak hledejte v adresáři Microsoft Office\Office+číslo verze soubor MSWORD.OLB (název může obsahovat rovněž číslo verze). Po potvrzení dialogu se pak do našeho projektu přidá nový unit s názvem Word_TLB, který rovnou přidáme do Uses unitu našeho hlavního formuláře. Tím je příprava hotová.

Nyní je čas přidat na formulář tlačítko a komponentu Memo, která nám poslouží pro uložení libovolného textu. Pochopitelně můžete použít i jinou textovou komponentu či samostatné řetězcové proměnné, protože ve výsledku budeme posílat Wordu stejně jednotlivá slova zvlášť. Tlačítko nám spustí kontrolu textu.


procedure
TForm1.Button1Click(Sender: TObject);
var
  WordApp  : _Application;
  WordDoc  : _Document;
  VarFalse : OleVariant;
begin
  WordApp := CoApplication_.Create;
  WordDoc := WordApp.Documents.Add(EmptyParam, EmptyParam, EmptyParam, EmptyParam);

  {
  sem pozdeji vlozime kod pro kontrolu pravopisu
  }

  VarFalse:=False;
  WordApp.Quit(VarFalse, EmptyParam, EmptyParam);
end;

Všimněte si parametru EmptyParam. Jelikož nebudeme některé parametry potřebovat, resp. u Wordu jsou definované jako nepovinné, potřebujeme je nějakým způsobem ignorovat. To ale není tak snadné, protože v importované knihovně a jejích funkcích nemůžeme jednoduše vynechat při jejich volání některé parametry. Proto je v Delphi možnost použít zmiňovaný EmptyParam, který zastupuje "prázdný" či "nepoužitý" parametr. Důležité jsou také rozdíly mezi verzemi Office. Výše popsaný příklad se týká Office XP, ale máte-li například starší verzi 97 či 2000, může se počet parametrů lišit. Konkrétně se to týká například hned druhého řádku kódu u metody Documents.Add, kde vidíme čtyři parametry. U starší verze jsou ale jen dva parametry. Případné problémy s odlišností uváděného kódu a vaší verzí Office ale nebude problém vyřešit, protože se vždy bude jednat pouze o odlišný počet parametrů (množství EmptyParam) u přibližně třech řádků kódu celého programu, což nebude problém napravit. U problémových řádků vám napoví s počtem parametrů jednak editor v IDE a nebo se můžete na problémovou funkci podívat přímo do knihovny Word_TLB.pas. Opět tedy připomínám, že zde uváděný kód počítá s Office XP.

Vraťme se teď zpět k našemu formuláři. Na něm zatím máme Memo (nezapomeňte jej naplnit textem a případně vyrobte nějakou tu chybu) a dvě tlačítka. První už jsme použili a jeho výkonný kód si doplníme za chvilku. Teď potřebujeme druhý formulář, který nám v případě nalezení chybného slova tento fakt sdělí a zároveň nabídne možná náhradní slova.

Přes nabídku File->New Form vytvoříme nový formulář. Na něj vložíme dva Edity. První slouží pro zobrazení nalezeného chybného slova (Edit1). Druhý pak slouží pro zobrazení slova, kterým bude chybný výraz nahrazen (Edit2). Dále potřebujeme ListBox, do kterého se nám vypíše seznam možných náhradních slov (zvolené slovo se pak zobrazí ve zmiňovaném Edit2). A nakonec potřebujeme tři tlačítka - první slouží k přeskočení (ignorování) chybného slova a pokračování v kontrole, druhé tlačítko provede náhradu chybného výrazu za vybranou alternativu a třetí tlačítko je pro uzavření formuláře (Storno).

Zbývá nám tedy doplnit zmiňovaný vynechaný výkonný kód pro tlačítko, které spouští kontrolu pravopisu, a dále zdrojový kód celého unitu pro druhý formulář. Abych vám opět usnadnil práci, můžete si stáhnout hotový ukázkový projekt, který je vytvořen v Delphi4. Archiv neobsahuje kvůli velikosti (a možné odlišnosti verze Office) importovanou knihovnu Word_TLB.pas, takže ji nezapomeňte popsaným způsobem do projektu importovat.

Příště si toto téma dokončíme a ukážeme si, jak totéž udělat s využitím příslušných komponent, které jsou k nalezení v novějších verzích Delphi.