
A mellékelt példaprogram megnyitása előtt a WordCodeChange.pas-ban lévő komponenst telepítenie kell a Delphi alá. Ehhez válassza a Component - Install Component menüpontot.
A komponens WordDoc tulajdonságában adhatjuk meg annak a Word dokumentumnak a nevét, amelynek tartalmát módosítani szeretnénk. A ParagraphStyle property-ben meg kell adnunk egy stílust. A komponens csak azokat a bekezdéseket veszi figyelembe, amelyek ezzel a stílussal rendelkeznek.
A számok kicserélésére az OnChange eseményen keresztül van lehetőségünk.
TChangeEvent = procedure(Sender: TObject; Found: String; var ChangeTo: String) of object;
Az esemény minden egyes alkalommal létrejön, amikor a komponens talál egy számot. A talált szám a Found paraméter segítségével lekérdezhető. A ChangeTo változóban kell megadnunk azt a szöveget, amelyre a számot cserélni szeretnénk. Ha a ChangeTo értékét nem módosítjuk, akkor a szám változatlan marad.
A komponenst a TComponent osztályból származtatjuk.
Az OnChange esemény létrehozásához el kell készítenünk a TChangeEvent típust.
Amikor a Word-ben kijelölünk egy szót, akkor a mögötte álló szóköz is kijelölésre kerül. Az így kapott szöveget már nem tudjuk számmá konvertálni. Két eset lehetséges. Az egyik, hogy a kijelölt szöveg mögött szóköz van, a másik, hogy nincs. A RemoveLastSpace függvény megvizsgálja a kapott String-et.
function RemoveLastSpace(s: String): String;
Ha a szöveg végén szóközt talál, akkor azt törli.
A komponens működésének lényege a Search metódusban található.
procedure TWordCodeChange.Search;
A WordDoc property-ben megadott Word dokumentumot a háttérben nyitjuk meg. A kapcsolat felépítéséhez a WordApp, OleVariant típusú objektumot használjuk. Az OleVariant típus használatához a uses listában fel kell sorolnunk a COMOBJ unit nevét is.
Első lépésben meg kell nyitnunk magát a Word programot, majd be kell tölteni a megadott dokumentumot.
WordApp:=CreateOleObject('Word.Application')
WordApp.Documents.Open(FWordDoc);
Végig kell néznünk az összes bekezdést. Erre egy for ciklus kiválóan alkalmas. A bekezdések számát az alábbi módon kérdezhetjük le.
for i:=1 to WordApp.ActiveDocument.Paragraphs.Count do begin
Mindig ki kell választanunk azt a bekezdést, amellyel éppen foglalkozni szeretnénk.
Paragraph:=WordApp.ActiveDocument.Paragraphs.Item(i);
A bekezdés stílusát a NameLocal tulajdonságán keresztül kérdezhetjük le. A bekezdés Range tulajdonsága adja meg a bekezdés kezdetét és végét a Word dokumentumon belül.
Range:=Paragraph.Range;
WordApp.Selection.SetRange(Range.Start,Range.End);
A Selection osztály segítségével kijelölhetjük az aktuális bekezdést. Ez arra jó, hogy a kijelölt bekezdésben szereplő szavak bekerülnek a Selection osztály Words tulajdonságába. Innen könnyedén lekérdezhetjük a bekezdés első szavát.
Found:=WordApp.Selection.Words.Item(1);
A RemoveLastSpace függvényt használva, a szó végéről levágjuk a szóközt, ha az létezik, majd az így kapott szót megpróbáljuk számmá konvertálni.
l:=StrToIntDef(ChangeTo,-1);
Az StrToIntDef függvény ugyanúgy működik, mint az StrToInt, azonban hibás számformátum esetén nem ad hibajelzést, helyette a második paraméterben megadott számot adja eredményül.
Miután megtaláltunk egy számot, le kell futtatnunk az OnChage eseményt. Itt a felhasználó megadhatja, hogy mire kívánja cserélni a talált számot. A felhasználó által megadott érték a ChangeTo változóba kerül.
Ezután, ismét a Selection osztályt használva, kijelöljük a bekezdés első szavát, majd felülírjuk a ChangeTo tartalmával.
WordApp.Selection.Words.Item(1).Select;
WordApp.Selection.TypeText(ChangeTo);
Sokkal egyszerűbb megoldás lenne, ha a Words.Item(1) értékét módosíthatnánk a ChangeTo tartalmára. Ezt azonban nem tehetjük meg, mert a Words tömb elemei csak olvasható property-k. Ezért szükséges a kijelölés és átírás trükköt használni.
Ha a kereső algoritmus lefutott, nem marad más hátra, mint hogy elmentsük a dokumentumot és kilépjünk a Word-ből.
WordApp.ActiveDocument.Save;
WordApp.Quit;