C# - Adatbázisműveletek SmartTag-menüpontból

Intelligens címkék lehetőségei 1. rész

forráskód letöltése
Most induló cikksorozatunkban a Microsoft Office XP programcsomag újdonságának, az Intelligens címkék (Smart Tag) témakörét járjuk körbe bővebben. A sorozat első részében – tekintettel arra, hogy egy bemutató cikk már készült a témakörben - csak körvonalazzuk a fejlesztés lépéseit, és elkészítünk egy, az adott feladat érdekében adatbázist használó intelligens címkét.
A példához szükséges a ContactDB adatbázis, melyet a mellékelt Run_script.cmd BATCH állomány lefuttatásával hozhatunk létre. Csak arra kell ügyelni, hogy a ContactDB.sql parancsállomány a BATCH állománnyal azonos mappában legyen. A FileDB.sql parancsállomány 5. sorában adja meg helyesen a létrehozandó adatbázisfájlok mappájának nevét és elérési útvonalát.
A mellékelt példa használata előtt el kell végezni néhány műveletet. Ezekről a cikk Bevezetés című bekezdésében olvashat.
Bevezetés
A megvalósítandó feladat a következő: ha a felhasználó a MS Word XP alkalmazás egy dokumentumában beír egy nevet azok közül, melyek megtalálhatóak a létrehozott ContactDb adatbázis Table1 táblájában, akkor létrehoz egy menüt. A menü E-mail küldése feliratú menüpontját kiválasztva küldhet egy elektronikus levelet a névhez az adattáblában eltárolt e-mail címre, a MS Outlook program segítségével.
Az adatbázis létrehozása után, mielőtt a példa kipróbálásra kerülne, gondoskodni kell arról, hogy a Word XP program számára az Intelligens címkénk látható legyen. Ennek érdekében fordítsa le a mellékelt forráskódot, és futtassa le az AddRegistry.reg adatállományt, melynek segítségével a szükséges bejegyzéseket elhelyezheti a Windows regisztrációs adatbázisában.
Amennyiben az Intelligens címkét el kívánja távolítani onnan, futtassa a RemRegistry.reg állományt, mely törli a kulcsokat.
A példában a következő nevek szerepelnek a Table1 adattáblában: Kiss Tamás, Horkai Roland és Hajas Albert. A Smart Tag képes arra, hogy a dokumentumban jelenlevő valamennyi név első előfordulását megtalálja. Az E-mail küldése menüpontot kiválasztva megjelenik egy e-mail űrlap, melynek Címzett mezőjében már ott az adott névhez tárolt e-mail cím.
A címke elkészítése
A megoldáshoz egy DLL-t kell készítenünk, így az új projekt létrehozásakor válasszuk a Class Library projekt típust. Mivel ezt COM DLL-ként szeretnénk üzemeltetni, így a megfelelő regisztrációhoz válasszuk ki a Solution Explorer-ben a SmartTags01 nevű projektünket, majd jobb gomb és Properties menüpont. A megjelenő ablakban válasszuk a Configuration Properties - Build elemet. Ekkor elérhetővé válik a Register for COM interop tulajdonság, melyet állítsunk igazra.
Ezek után válasszuk a Project - Add reference menüpontot. A megjelenő ablakban a COM lapon keressük elő a Microsoft SmartTags 1.0 Type Library elemet és adjuk hozzá projektünkhöz ezt a referenciát. A SmartTag csak az Office XP verziótól felfele érhető el, így ennél régebbi Office esetén ez a lehetőség nem áll rendelkezésünkre.
A Microsoft SmartTags 1.0 Type Library-ban van két olyan interfész, melyet implementálnunk kell az alkalmazásunkba annak érdekében, hogy a kívánt funkciókat megvalósíthassuk.
A két interfészt a projekt két osztályában valósítjuk meg. Az első a RecognizeClass nevet viseli, a másik az ActionClass nevet.
RecognizeClass osztály
Az osztályban megvalósított interfész felelős azért, hogy az alkalmazásban beírt szöveg időről időre végigpásztázódjon, és a megadott szavak azonosításra kerüljenek. Ezt követően jeleznünk kell az Office alkalmazásnak.
A későbbi regisztrációhoz szükségünk lesz egy az osztályhoz rendelt GUID azonosítóra, így kérjünk egy újat a Tools - Create GUID menüpont kiválasztásakor, majd másoljuk be a kapott értéket a Guid attribútumba.
[Guid("6261ADEA-FA9B-41b7-AA00-3287BF7546D2"),ComVisible(true)]
public class RecognizeClass : ISmartTagRecognizer
{
Az interfész számtalan metódusa közül kiemelünk néhányat, melyek jelentősek. A get_Name függvény adja vissza az Intelligens címke nevét, mely megjelenik az Office alkalmazás Intelligens címkéket nyilvántartó listájában.
  public string get_Name(int LocaleId)
  {
    return "Software Online címkék 01";
  }
Megadhatunk egy URL címet is a get_SmartTagDownloadURL függvény visszatérési értékében. Paraméterként kapunk egy SmartTagID azonosító számot, melyre csak akkor lenne szükségünk, ha a DLL-ünkben több, különálló SmartTag-et valósítanánk meg. A jelölt szó menüjébe az Új műveletek keresése menüpont automatikusan beépül, kiválasztva az itt megadott URL-re navigálhatunk.
  public string get_SmartTagDownloadURL(int SmartTagID)
  {
    return "http://www.SoftwareOnline.hu";
  }
Az ISmartTagRecognizer leglényegesebb függvénye a Recognize. Ez kerül meghívásra akkor, ha változik a szöveg és ezen belül azonosítanunk kell a SmartTag által kezelendő szavakat. Az ellenőrizendő szöveget a Text paraméterben kapjuk. Ha ebben a szövegben megtaláljuk azt a szót, esetleg szavakat melyet keresünk, akkor ezt a szintén paraméterként kapott ISmartTagRecognizerSite interfész CommitSmartTag nevű függvényének meghívásával jeleznünk kell. Itt első paraméterként a SmartTag nevét kell megadni, melyet az adott szóhoz rendelünk. Második paraméterben azt tudatjuk, hogy a Text-en belül melyik az a pozíció, ahonnan a felismert szavunk kezdődik. (A karakterek számozása egytől indul!) A harmadik paraméterben kell megadnunk, hogy a felismert szavunk hány karakter hosszú. A második és harmadik paraméter alapján fogja az adott Office alkalmazás az általunk felismert szót pontozott vonallal aláhúzni.
A metódusban hozzuk létre az adatbázis-kapcsolat felvételéhez, valamint a műveletek elvégzéséhez szükséges objektumokat.
  public void Recognize(string Text, SmartTagLib.IF_TYPE DataType, int LocaleID, SmartTagLib.ISmartTagRecognizerSite RecognizerSite)
  {
    SqlConnection con = new SqlConnection("initial catalog=ContactDb;integrated security=SSPI;");
    SqlCommand com = new SqlCommand();
    com.Connection = con;
Először lekérdezzük, hogy milyen nevek szerepelnek az adatbázisban, a neveket elhelyezzük egy string-tömbben.
    com.CommandText = "SELECT NAME FROM TABLE1";
    con.Open();
    int i = 0; 
    SqlDataReader dr = com.ExecuteReader();
    string[] names = new string[3];
    while (dr.Read())
    {
      names[i] = dr.GetValue(0).ToString();
      i++;
    }
    ...
A nevek helyének tárolásához létrehozunk egy egészeket tároló tömböt:
    int[] positions = new int[]{-1,-1,-1};
A szövegen végigmenve meghatározzuk, hogy szerepel-e valamelyik név a szövegben, ha igen, milyen pozícióban.
    for(int j = 0;j<names.Length;j++)
    {
      positions[j] = Text.IndexOf(names[j]);        
    }
Ezt követően minden első előfordulásra meghívjuk a CommitSmartTag metódust, mely aláhúzza a szöveg megfelelő szakaszait.
    for(int h=0;h<positions.Length;h++)
    {
      if (positions[h] != -1)
      {
        RecognizerSite.CommitSmartTag(smartTagName, positions[h]+1, names[h].Length, RecognizerSite.GetNewPropertyBag());
      }
    }
    ...
  }
ActionClass osztály
Az ISmartTagAction interfészt felhasználó osztályunknak ismét kell egy új GUID számot adnunk (Tool - Create GUID menüpont) ez a későbbi regisztrációkor válik szükségessé.
[Guid("6D78842B-1FA1-4d37-87FE-D7C5EAD56549"), ComVisible(true)]
public class ActionClass : ISmartTagAction
{
Az osztályban elhelyezett metódusban kódolhatjuk le, hogy ilyen művelet hajtódjon végre az E-mail küldése menüpont kiválasztásakor.
Az InvokeVerb metódusban kell ezt megvalósítanunk. A Target property-ben az adott Office alkalmazástól függő objektumot kapunk. Ez minden esetben más és más. Jelen példánknál a Word esetében egy Word.Range osztály példánya lesz, melyen keresztül elérhetjük a SmartTag által kijelölt szót.
  if (ApplicationName.IndexOf("Word.Application")>=0)
  {
    Range wr = (Range)Target;
A metódusban először a létrehozott SqlConnection és SqlCommand objektumok segítségével lekérdezzük a megjelölt névhez eltárolt e-mail címet.
    ...
    comm.CommandText = "SELECT EMAIL FROM TABLE1 WHERE NAME = '" + wr.Text + "'";
    email = comm.ExecuteScalar().ToString();
Ezt követően létrehozunk egy példányt az Outlook alkalmazásból.
    Outlook.Application oa = new Outlook.Application();
Szükségünk van egy MailItem elemre a levél küldéséhez.
    NameSpace ns = oa.GetNamespace("MAPI");
    MailItem mi = (MailItem)oa.CreateItem(OlItemType.olMailItem);
Az e-mail adatainak megadása után meg is jelenítjük azt küldés előtt, hogy a felhasználó megadhassa az üzenet szövegét is.
    mi.To = email;
    mi.Subject = "CSO teszt e-mail";
    mi.Display(m);
A példa fordítása után a Smart Tag-ot a Regisztrációs adatbázis megfelelő kulcsai alá helyezzük. A RecognizeClass osztályhoz megadott GUID számot a HKEY_CURRENT_USER\Software\Microsoft\Office\Common\Smart Tag\Recognizers kulcs, míg az ActionClass osztály GUID számát a HKEY_CURRENT_USER\Software\Microsoft\Office\Common\Smart Tag\Actions kulcs alá kell bejegyezni. Ezeket a műveleteket végzi el a fent említett AddRegistry.reg állomány.
A telepített Intelligens címke létezését ellenőrizhetjük az Office alkalmazásban, ha az Eszközök - Automatikus javítási beállítások menüpontját kiválasztjuk, majd a megjelenő ablakban az Intelligens címkék nevű lapra váltunk.

Intelligens címkék lehetőségei cikksorozat