Be smart

Veröffentlicht: 16. Sep 2001 | Aktualisiert: 16. Jun 2004

Smart Tags sind die wohl wichtigste Neuerung, die Office XP zu bieten hat. Die Möglichkeit, eigene Smart Tags zu entwickeln, verbessert die ohnehin große Anpasssungsfähigkeit von Office XP. Dieser Beitrag zeigt, wie Sie bei der Programmierung eigener Smart Tags vorgehen.

* * *

Auf dieser Seite

Das Smart Tag SDK Das Smart Tag SDK
Der erste Smart Tag Der erste Smart Tag
Zusammenfassung Zusammenfassung

Diesen Artikel können Sie hier lesen dank freundlicher Unterstützung der Zeitschrift:

Bild01

Office XP hat in der Presse ein gemischtes Echo ausgelöst. Eines der Standardargumente, dass es eigentlich nichts Neues gibt und sich deshalb ein Update nicht lohnt, ist nur teilweise berechtigt, weil Office XP durchaus viele kleine Vorteile bietet und die Smart Tags eine echte Innovation sind.
Ein Smart Tag ist eine spezielle Markierung, die in einem Word-Dokument, einer Excel-Tabelle oder einer Outlook-Mail (sofern Word als Mail-Editor konfiguriert ist) jedes beliebige Wort erfahren kann. Auf Grund der Markierung können Anwender in einer XML-Datei, die in diesem Artikel aber nicht beschrieben wird, und Programmierer mit Hilfe einer ActiveX-Bibliothek eine Reihe von Aktionen festlegen, die in Form eines Kontextmenüs angeboten werden. Ein Beispiel (das allerdings in jüngster Zeit deutlich an Attraktivität verloren hat) ist die Möglichkeit, zu einem Aktienkürzel die aktuellen Charts aus dem Internet abzurufen oder gleich Aktien zu kaufen.

Ein Smart Tag analysiert allgemein gesprochen alle Texte während der Eingabe, so wie es auch bei der Rechtschreibprüfung geschieht. Wird ein Text erkannt, werden gleichzeitig über das Kontextmenü eine Reihe von Aktionen angeboten, die Sie beliebig festgelegen können.
In den USA hat ein großer Solution Provider schon vor einiger Zeit eine umfangreiche Smart-Tag-Bibliothek für Rechtsanwaltskanzleien fertig gestellt. Die Anwältin tippt ein Geschäftszeichen ein und kann kurz danach über den Smart Tag zum Beispiel die Korrespondenz mit einem Mandanten aufrufen oder nach Eingabe eines Paragraphen-Zeichens Texte aus juristischen Sammlungen abrufen.
Hinter einem Smart Tag steckt eine einfache ActiveX-Bibliothek, die allerdings mit Visual Basic 6.0 oder Visual C++ programmiert werden muss. Die Developer Edition von Office XP enthält zwar das Smart Tag SDK, das Sie auch auf der Heft-CD finden, aber es reicht allein noch nicht aus, um Smart Tags in Form von ActiveX-Bibliotheken zu entwickeln.

Das Smart Tag SDK

Der Name Software Development Kit darf nicht zu der Annahme verleiten, dass Sie ein Werkzeug mit einer komfortablen Oberfläche erhalten. Das Smart Tag SDK umfasst lediglich die für die Programmierung erforderlichen Objektbibliotheken (sie werden in das allgemeine Verzeichnis \Gemeinsame Dateien\Microsoft Shared\SmartTag kopiert), eine Hilfedatei (stsdk.chm) sowie eine Reihe ebenfalls sehr nützlicher Beispielprogramme. Zusammen mit zahlreichen Artikeln, die in den letzten Wochen auf der Microsoft-MSDN-Seite für die Office-Programmierung erschienen sind (https://msdn.microsoft.com/office), ergibt sich ein relativ vollständiges Bild.

 

Der erste Smart Tag

Im Folgenden wird eine Smart-Tag-DLL Schritt für Schritt umgesetzt, die in Word XP zum Einsatz kommt. Es handelt sich um ein einfaches Beispiel aus dem Smart Tag SDK. Die Einfachheit ist deshalb wichtig, weil es bei einem komplexeren Beispiel sehr viel schwieriger wird zu unterscheiden, was zum Grundgerüst eines Smart Tags gehört. Funktioniert das Grundgerüst erst einmal, ist es relativ einfach, neue Funktionen hinzuzufügen oder auf dieser Grundlage ein neues Projekt anzulegen.

Für die Entwicklung benötigen Sie Visual Basic 6.0 Professional oder Enterprise. Die übrigen Versionen scheiden aus, da sie keine ActiveX-DLLs erzeugen können. Außerdem muss das Smart Tag SDK installiert sein, das die entsprechende Objektbibliothek zur Verfügung stellt.

Das Kompilieren des Projekts in eine DLL ist zum Testen nicht erforderlich. Im Gegenteil, gerade am Anfang ist es sehr praktisch, wenn die Smart-Tag-DLL lediglich in der Entwicklungsumgebung läuft, da sich dort Haltepunkte setzen lassen und das Programm immer dann anhält, wenn Word XP ein neues Wort erkannt hat.

Um die Smart-Tag-DLL zu erzeugen, sind folgende Schritte notwendig:

  • Schritt 1: Legen Sie in Visual Basic ein neues ActiveX-DLL-Projekt an.

  • Schritt 2: Geben Sie dem Projekt den Namen „Smarti". Der Name ist wichtig, da er später im Code verwendet wird.

  • Schritt 3: Fügen Sie über den Menübefehl Projekt/Verweise einen Verweis auf die Bibliothek Microsoft Smart Tags 1.0 Type Library ein. Wird dieser Verweis nicht angeboten, ist das Smart Tag SDK noch nicht installiert.

  • Schritt 4: Benennen Sie die vorhandene Klasse in „CSmartieRec" um. Darin wird das Recognizer-Modul implementiert.

  • Schritt 5: Zeigen Sie das Codefenster an und geben Sie folgenden Befehl ein:

Implements Smart TagLib.ISmart TagRecognizer

Er implementiert die Schnittstelle ISmartTagRecognizer in der Klasse, so dass die Funktionen der Schnittstelle in der Klasse (in diesem Fall von Word XP) aufgerufen werden können.
  • Schritt 6: Fügen Sie ein weiteres Klassenmodul hinzu und geben Sie ihm den Namen „CSmartieAct". Hier wird das Action-Modul implementiert.

  • Schritt 7: Zeigen Sie das Codefenster an und geben Sie folgenden Befehl ein:

Implements Smart TagLib.ISmart TagAction

Jetzt beginnt die Programmierung. Als Erstes wird der Recognizer implementiert.
  • Schritt 8: Aktivieren Sie die Klasse CSmartieRec und wählen Sie aus der linken Auswahlliste den Eintrag ISmartTagRecognizer und aus der rechten Auswahlliste ProgID aus. Dieser Schritt wird im Folgenden nicht mehr separat erwähnt, das heißt, wenn als Nächstes die Prozedur ISmarTagRecognizer_SmartTagName implementiert werden soll, wählen Sie wieder aus der linken Auswahllliste ISmartTagRecognizer und aus der rechten Auswahlliste diesmal SmartTagName aus (Bild 1).

    Bild02
    Fügen Sie in ISmartTagRecognizer_ProgID folgenden Befehl ein:

ISmartTagRecognizer_ProgID = "Smartie.CSmartieRec"

Durch diese Zuweisung identifiziert sich die Klasse, wenn die Funktion später von Word XP aufgerufen wird.  
Speichern Sie das Projekt regelmäßig, damit Sie bei einem etwaigen Aussetzer nicht alles noch einmal eintippen müssen (man kann ja nie wissen).
  • Schritt 9: Fügen Sie in ISmart TagRecognizer_Name folgenden Befehl ein:

ISmartTagRecognizer_Name = "Mein erster SmartTag"

Dieser Text erscheint später in der Auswahlliste der Smart Tags.
  • Schritt 10: Fügen Sie in ISmart TagRecognizer_Desc folgenden Befehl ein:

ISmartTagRecognizer_Desc = "Erkennt die Namen meiner _ besten Freunde"

Dies ist eine zusätzliche Beschreibung für die Smart-Tag-Komponente.  
Der bisher vorgestellte Code erledigt lediglich ein paar Formalitäten. Es fehlt noch die eigentliche Funktionalität. Sobald ein Smart Tag von einer Anwendung geladen wird, wird er erst einmal befragt. Dabei muss er angeben, wie viele und welche Namen er erkennt. Dazu werden die Eigenschaften SmartTagCount, SmartTagName und SmartTagDownloadURL implementiert. Die der SmartTagCount-Eigenschaft zugewiesene Zahl legt fest, wie oft die Anwendung die anderen beiden Funktionen SmartTagName und SmartTagDownloadURL aufruft. Bei jedem Aufruf wird die dem Smart-Tag-Namen entsprechende Kennummer, die zwischen 1 und SmartTagCount liegt, übergeben.
  • Schritt 11: Fügen Sie in ISmartTagRecognizer_SmartTagCount folgenden Befehl ein:

ISmartTagRecognizer_SmartTagCount = 1

Die 1 gibt an, dass der Recognizer nur einen Smart Tag unterstützt.
  • Schritt 12: Fügen Sie in ISmartTagRecognizer_SmartTagName folgende Befehle ein:

If SmartTagID = 1 Then ISmartTagRecognizer_SmartTagName = "Friends#Friends" End If

Auch wenn der Smart Tag mehrere Namen erkennt, ist es nur ein Smart Tag, daher muss auch nur die ID 1 abgefragt werden. Welcher Name zurückgegeben wird, spielt hier keine Rolle. Der Name muss lediglich den Aufbau Namensraum\#Kennzeichen besitzen, da sonst ein Laufzeitfehler ausgelöst wird.
  • Schritt 13: Aus formalen Gründen muss auch eine URL zur Verfügung gestellt werden. Da es in diesem Fall keine gibt, wird Null übergeben. Fügen Sie in SmartTagDownloadURL folgenden Befehl ein:

SmartTagDownloadURL = Null

  • Schritt 14: Die noch fehlende Methode der Schnittstelle ISmartTagRecognizer ist Recognize. Sie wird aufgerufen, wenn Word XP einen Namen überprüft und wissen möchte, ob er für den Smart Tag eine besondere Bedeutung hat. Fügen Sie in Recognize folgende Befehle ein:

Dim i As Integer Dim iNx As Integer, Laenge As Integer Dim oPropBag As SmartTagLib.ISmartTagProperties Text = UCase(Text) For i = 1 To AnzahlFreunde iNx = Instr(Text, UCase(Freunde(i))) Laenge = Len(Freunde(i)) While iNx > 0 Set oPropBag = RecognizerSite.GetNewPropertyBag RecognizerSite.CommitSmartTag "Friends#Friends", _ iNx, Laenge, oPropBag iNx = Instr(iNx + Laenge, Text, Freunde(i)) Wend Next i

Die Namen der Freunde, die später einmal erkannt werden sollen, müssen irgendwo hinterlegt sein. Sie können aus einer Datenbank oder dem Outlook-Kontakte-Ordner stammen. Damit die Implementierung nicht so aufwändig ist, werden sie im Initialize-Ereignis in eine Feldvariable eingetragen.
  • Schritt 15: Wählen Sie in der Recognizer-Klasse aus der linken Auswahlliste Class und aus der rechten Auswahlliste Initialize aus. Geben Sie in die Prozedur folgende Befehle ein:
    Freunde(1) = "Susie"
    Freunde(2) = "Elke"
    Freunde(3) = "Anton"
    Freunde(4) = "Franzl"
    Freunde(5) = "Xaver"
    Freunde(6) = "Ignatz"
    Freunde(7) = "Wastel"
    Das sind die Namen, die von Word XP automatisch unterstrichen werden. Sie sind frei wählbar.
    Die Recognizer-Klasse ist nun vollständig (achten Sie darauf, dass stets alle Mitglieder der Schnittstelle implementiert werden, das heißt, es muss mindestens ein leerer Prozedurrahmen vorhanden sein, auch wenn das Mitglied nicht aufgerufen wird). Jetzt ist die Action-Klasse an der Reihe. Hier wird festgelegt, was passiert, wenn Word XP die Smart-Tag-DLL aufruft und den zu analysierenden Text übergibt (Word XP analysiert den Text absatzweise, das heißt, es übergibt ein Paragraph-Objekt).

    Listing 1 enthält unter anderem die Prozeduren ISmartTagAction_Desc, ISmartTagAction_Name und ISmartTagAction_ProgID, die denen der Klasse CSmartieRec gleichen. Letztere Eigenschaft erhält dieses Mal den Wert Smartie.CSmartieAct, da sich die ProgID einer COM-Komponente immer aus dem Projektnamen und dem Namen der Klasse zusammensetzt. In ISmartTagAction_Caption legen Sie die Überschrift fest, die über dem Bereich der Aktionen Ihres Smart Tags erscheint, wenn das Kontextmenü geöffnet wird.

    Listing 1: Standardmitglieder der Action-Klasse.

' Gibt eine Beschreibung des SmartTags zurück Private Property Get ISmartTagAction_Desc(ByVal LocaleID As Long) As String ISmartTagAction_Desc = "Erkennt die Namen meiner besten Freunde" End Property ' Gibt den Namen des SmartTag zurück Private Property Get ISmartTagAction_Name(ByVal LocaleID As Long) As String ISmartTagAction_Name = "Mein erster SmartTag" End Property ' Gibt die ProgID des Action-Moduls zurück Private Property Get ISmartTagAction_ProgId() As String ISmartTagAction_ProgId = "Smartie.CSmartieAct" End Property ' Gibt die Überschrift des SmartTags im Kontextmenü zurück Private Property Get ISmartTagAction_SmartTagCaption(ByVal SmartTagID As Long, ByVal LocaleID As Long) As String ISmartTagAction_SmartTagCaption = "Homepage meiner Freunde" End Property ' Gibt die Überschrift der einzelnen Verben zurück Private Property Get ISmartTagAction_VerbCaptionFromID(ByVal VerbID As Long,
ByVal ApplicationName As String, ByVal LocaleID As Long) As String If VerbID = 1 Then ISmartTagAction_VerbCaptionFromID = "Anzeigen der Homepage" End If End Property

  • Schritt 16: Fügen Sie die SmartTagCount-Eigenschaft ein. Sie gibt immer den Wert 1 zurück, da es nur einen Smart Tag gibt. Fügen Sie daher in ISmartTagAction_SmartTagCount folgenden Befehl ein:
    ISmartTagActionCount = 1
    Nun sind die Aktionen an der Reihe, die ein Smart-Tag-Typ unterstützen kann. Sie werden als Verben bezeichnet. Pro Typ soll es ebenfalls nur ein Verb geben.

  • Schritt 17: Fügen Sie in die Prozedur ISmartTagAction_VerbCount folgende Befehle ein:

If SmartTagName = "Friends#Friends" Then ISmartTagAction_VerbCount = 1 End If

  • Schritt 18: Bei Friends#Friends handelt es sich um den internen Namen des Smart Tags, dessen genauer Wortlaut keine Rolle spielt, der aber der Form URN#Name entsprechen muss. Dieser Name wird in der SmartTagName-Prozedur zugewiesen, in die Sie folgende Befehle einfügen:

If SmartTagID = 1 Then ISmartTagAction_SmartTagName = "Friends#Friends" End If

  • Schritt 19: Verbinden Sie ein Verb mit dem zugehörigen Index (dieser Schritt ergibt keinen so rechten Sinn, ist aber notwendig). Fügen Sie in ISmartTagAction_VerbID folgenden Befehl ein:

ISmartTagAction_VerbID = VerbIndex

Auch der nächste Schritt ist eine reine Formalität. Damit innerhalb des Objektmodells einer Anwendung die Smart Tags ansprechbar sind (es gibt dazu eine SmartTags-Auflistung und zum Beispiel ein Verb, das über die Execute-Methode programmgesteuert ausgeführt werden kann), muss der Smart Tag einen eindeutigen Namen erhalten, der aber ansonsten keine Rolle spielt.
  • Schritt 20: Fügen Sie in die Prozedur ISmartTagAction_VerbNameFromID folgende Befehle ein:

If VerbID = 1 Then ISmartTagAction VerbNameFromID = "HomepageZeigen" End If

  • Schritt 21: Um festzulegen, was passiert, wenn sich die Anwender für eine Aktion entscheiden, benötigen Sie die Prozedur ISmartTagAction_InvokeVerb, in die Sie die Befehle aus Listing 2 einfügen. Sie ruft eine fiktive Homepage auf, die bei Nichtvorhandensein einen Fehler auslöst. Sie können stattdessen auch eine Meldung ausgeben.

    Listing 2: Die Prozedur legt fest, was passiert, wenn der Smart Tag aufgerufen wird.

Sub ISmartTagAction_InvokeVerb(ByVal VerbID As Long, ByVal ApplicatioName _ As String, ByVal Target As Object, ByVal Properties As SmartTagLib _ .ISmartTagProperties, ByVal Text As String, ByVal Xml As String) Dim sURL As String Dim oIE As Object If VerbID = 1 Then sURL = "www.myfriends.de/ " & Text & ".htm" Set oIE = CreateObject("InternetExplorer.Application") oIE.Navigate2(sURL) oIE.Visible = True End If End Sub

Die DLL ist nun fertiggestellt und Sie können sie entweder über die [F5]-Taste starten (in diesem Fall müssen Sie beim ersten Mal einen Dialog mit OK schließen) oder kompilieren.

Bevor die Smart-Tag-DLL endlich in Aktion treten kann, muss sie noch registriert werden. Damit stellen Sie sicher, dass sie nach dem Start von Word XP automatisch geladen wird (Bild 2).

Bild03
Rufen Sie dazu Regedit über den Ausführen-Befehl im Windows-Start-Menü auf. Suchen Sie den Schlüssel HKey_Current_User\Software\ Microsoft\Office\Common\SmartTag\ Actions. Öffnen Sie das Kontextmenü von Actions und wählen Sie nacheinander Neu, Schlüssel und Zeichenfolge aus und geben Sie den Schlüssel der ProgID der Action-Komponente, in diesem Fall Smartie.CSmartieAct ein. Wiederholen Sie diesen Schritt für den Schlüssel Recognizers, nur dass der neue Unterschlüssel hier Smartie.CSmartieRec heißen muss (Bild 3).

Bild04
Diese umständliche Registrierung ist natürlich die Ausnahme. Normalerweise wird die Smart-Tag-DLL im Rahmen eines Setup-Programms installiert, das zuvor mit dem Paket- und Weitergabe-Assistenten oder dem neueren Windows-Installer-Toolkit für Visual Studio erstellt wurde.
Nun können Sie die Früchte Ihrer Arbeit genießen. Starten Sie Word XP und tippen Sie ein paar Namen ein. Stimmt die Schreibweise und haben Sie bei der Umsetzung alles richtig gemacht, wird das Wort lila gewellt unterstrichen. Bewegen Sie den Mauszeiger über das Wort, wird das kleine i-Symbol angezeigt, nach dessen Anklicken sich das Kontextmenü des Smart Tags öffnet. Hier sollte jetzt der Eintrag Homepage meiner Freunde, Name des Freundes sowie Anzeigen der Homepage erscheinen.

 

Zusammenfassung

Die Entwicklung von Smart Tags mit Visual Basic 6.0 ist nicht schwierig, aber ein wenig umständlich. Wer häufiger Smart Tags entwickeln möchte, wird ein allgemeines Grundgerüst anlegen und dieses bei jedem neuen Projekt gezielt erweitern, so dass die vielen kleinen Formalitäten nicht jedes Mal Zeit kosten. Natürlich hätte Microsoft alles in einen Assistenten zusammengefassen können. Ein solcher Assistent, der in Dialogen eine Reihe von Angaben abfragt und daraufhin ein komplettes Grundgerüst anfertigt, wäre nicht schwer zu realisieren gewesen. Es ist also nicht so, dass Microsoft in seinen Office-Produkten keinen Raum für Verbesserung mehr offen lässt.