COM - ActiveX

Programmierung mit COM / ActiveX

 

MS Word starten

Um MS Word (oder auch andere COM/ActiveX Serveranwendungen) zu starten und dann zu kontrollieren gibt es generell zwei verschiedene Methoden:

a.) Die Delphi OLE Automation Komponenten benutzen
Die mit Delphi mitgelieferten Automation Komponenten (auf der Seite “Servers” in der Komponentenpalette) bieten eine extrem einfache Möglichkeit z.B. MS Word zu starten und dann zu kontrollieren. Legen Sie dazu einfach die Komponente “WordApplication” auf das Formular. Um MS Word zu starten reicht es aus, die Methode “WordApplication.Connect” aufzurufen. Danach können Sie die eben gestartete Instanz von MS Word sichtbar machen, indem Sie der Eingenschaft “WordApplication.Visible” den Wert “true” zuweisen. Andernfalls läuft die Instanz unsichbar im Hintergrund.

b.) Eine importierte Typenbibliothek verwenden
Um mit COM Servern arbeiten zu können muss in Delphi eine so genannte “Typenbibliothek” importiert werden. Verwendet man die mitgelieferten Automationskomponenten so wurde eine solche Typenbibliothek schon während des Setups installiert. Will man aber mit einer anderen Version von MS Word arbeiten so kann man diese Typenbibliothek auch selbst importieren.

Da die Automatisierungskomponenten nichts anderes als ein “Wrapper” um eine solche Bibliothek herum sind, ist es oftmals einfacher direkt mit dieser Typenbibliothek zu arbeiten!

Als erstes muss die entsprechende Unit, welche die Bibliothek enthält in die Uses-Liste der aktuellen Unit aufgenommen werden. Normalerweise richtet sich der Name der Typenbibliothek nach der benutzen Word Version (WORD2000.pas für MS Word 2000, WORDXP.PAS für MS Word XP usw.)

Dann deklarieren wir eine Variable vom Typ “WordApplication”. Über diese Variable finden später alle Zugriffe auf die Methoden und Eigenschaften von MS Word statt:

1 var
2   WordApp: WordApplication;

Jetzt kann das Interface zu MS Word erzeugt werden indem eine Instanz dieser Klasse angelegt wird:

 WordApp := CoApplication.Create;

Wenn diese Zeile ausgeführt wird so wird automatisch MS Word geladen und die Methoden und Eigenschaften können über diese Instanz angesprochen werden.

 

Feststellen ob MS Word schon gestartet ist

In vielen Situationen kann es sinnvoll sein, zu wissen ob bereits eine Instanz von MS Word im Speicher vorhanden ist. Um auf eine laufende Instanz eines ActiveX Servers zuzugreifen existiert eine Funktion mit dem Namen “GetActiveOLEObject” in der Unit “ActiveX.pas.

Dieser Funktion wird der Names des ActiveX Servers übergeben den man ansprechen will. Der Rückgabewert dieser Funktion stellt einen Zeiger auf das betreffende ActiveX Objekt dar. Ist die Anwendung bisher noch nicht gestartet, so wird eine Exception ausgelöst. Aus diesem Grund sollte man eine solche Abfrage mitt try..except kapseln:

 1 function IsWordRunning: Boolean;
 2 var
 3   wordApp                               : WordApplication;
 4 begin
 5   try
 6     wordApp := GetActiveOLEObject(‘Word.Application’ as WordApplication);
 7     if wordApp <> nil then
 8       Result := true
 9   except
10     Result := false;
11   end;
12   wordApp := nil;
13 end;
14
 

Dokumente mit MS Word erstellen

Wenn Sie das Interface zu MS Word erstellt haben (siehe MS Word starten) können Sie mit den Methoden und Eigenschaften die von dem COM Server zur Verfügung gestellt werden arbeiten. Bei der Erzeugung des Interfaces wird MS Word ohne geöffnete Dokumente in den Speicher geladen. Es gibt also in diesem Moment kein “Dokument1” wie man es von einem manuellen Start gewohnt ist! Als erstes sollte man also ein neues, leeres, Dokument erzeugen.

MS Word verwaltet alle Dokumente in einer Datenstruktur die “Documents” genannt wird (irgendwie logisch, oder?). Diese Datenstruktur, eine “Collection”, hat eine Methode “Add()” mit der ein neues leeres Dokument erzeugt und der Collection hinzugefügt werden kann werden kann.

En anderer Weg, Einträge in dieser Collection zu erzeugen wäre es ein bereits existierendes Dokument mit der Methode “Open()” von der Festplatte zu laden.

 

 

aktualisiert: 11.11.2009