Announcement

Collapse
No announcement yet.

Word-Events abfangen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Word-Events abfangen

    Hallo,

    ist es möglich - und wenn wie - die Ereignisse von Word (als COM-Server) in einem mit Delphi 3 entwickelten Automatisierungs-Client abzufangen? So möchte ich zum Beispiel wissen wann ein Anwender ein Dokument abspeichern möchte oder Word vorzeitig beendet wird.

  • #2
    Hallo,

    möglich ist mit Delphi alles, die Frage ist nur, mit welchem Aufwand das Ergebnis erzielt werden kann. Ab <b>Delphi 5</b> stehen die Word-Ereignisse direkt über den Objektinspektor zur Verfügung, man kann also genauso einfach wie bei jedem anderen Ereignis auch eine Ereignisbehandlungsmethode für die Word-Ereignisse anlegen. Möglich wird dieser Komfort durch die neue Delphi 5-Fähigkeit, <b>Wrapper</b>-Klassen für OLE Automation-Server automatisch generieren zu können.

    Mit <b>Delphi 4</b> liefert Borland eine Demo-Programm (Verzeichnis <i>Demos\ActiveX\OleAuto\Word8</i> aus, bei dem die Implementierung des <b>Sink-Objekts</b> bereits fertig ist.

    Mit <b>Delphi 3</b> gibt es aus meiner Sicht nur 2 Alternativen: <br>

    1. Das <b>Sink-Objekt</b> des Clients (d.h. das COM-Objekt, das von Word immer dann aufgerufen wird, wenn ein Ereignis übermittelt werden muss) wird von Hand geschrieben (Fleissaufgabe).

    2. Das <b>Sink-Objekt</b> des Clients wird von einem Generator automatisch angelegt. Vom COM-Guru <i>Binh Ly</i> gibt es das Freeware-Programm <b>Delphi Event Sink Generator</b> (siehe http://www.intac.com/~bly/com). Ein Beispiel für den Einsatz dieses Tools findet sich in meinem Buch <b>COM/DCOM mit Delphi</b> (dort wird auch der manuelle Weg beschrieben, wenn das Sink-Objekt von Hand angelegt werden soll)

    Comment


    • #3
      Hallo,

      das mit dem Sink-Objekt - Herrn Binh Ly sei Dank - funktioniert an sich wunderbar. Leider liefert Word97 noch kein Save-Event (oder sollte ich mich da täuschen?) welches man abfangen könnte.
      Daher lasse ich zur Zeit Word im Ole-Container laufen und übernehme das Abspeichern der Dokumente selbst. So weit so gut.
      Nun benötige ich allerdings noch eine Möglichkeit zur Anbindung eines Dokumentes an eine Datenquelle (dBase oder Textdatei). Kann man in vorliegendem Fall (Ole-Container) ein Word-Dokument mit einer Datenquelle (dBase oder Textdatei) verbinden oder auf eine andere Art und Weise besagte Datenfelder in ein Word-Dokument einfügen? Natürlich alles möglichst einfach...
      Vielen Dank im Vorraus

      Comment


      • #4
        Hallo,

        ja - auch in einem TOleContainer stehen die Automation-Objekte von Microsoft Word zur Verfügung. In meinem Buch <b>COM/DCOM mit Delphi</b> ist dafür ein Beispielprojekt zu finden. Das Dokument wird direkt im OleContainer berarbeitet, wobei über Automation das Programm Text an bestimmte Textmarken-Positionen einfügt. Dazu muss der eigene Controller über die Eigenschaft <b>OLEObject</b> auf den Automation-Server (MS Word im Container) zugreifen. Über diese Schnittstelle stehen dann alle VBA-Anweisungen von Word zur Verfügung

        Comment


        • #5
          Hallo

          Ich habe mich auch mit dem Tool von EventSinkImpl von Binh Ly. beschäftig um über Outlook das Event zu empfangen, wenn eine Mail versendet wird.

          Es klappt wunderbar.

          Doch bin ich ein wenig unsicher, was die Freigabe der Wrapper-Klassen (CoApplication_) angeht.

          Ich erzeuge, wie im beigefügtem Outlook98-Beispiel auch, über FOulook := CoApplication_.Create die Instanz, um dann über die beigefügten Methoden und Eigenschaften die gewünschten Effekte zu erzeugen, das ja auch funktioniert.

          Nur vermisse ich die altbekannte .free-Methode, damit ich mein Object wieder freigeben kann.

          Es ist mir aufgefallen, das aber beim Beenden meines Programms, der Outlook-Prozeß (wenn Outlook nicht schon vorher geöffnet war), ebenfalls beendet wird, woraufhin ich die Methode zur Freigabe von Objekten ala VB angewendet (FOutlook := nil) und das gleich Ergebnis erzielt habe.

          Sollte damit wirklich der gesamt Speicher wieder freigegeben werden? Oder fehlt eine Anweisung, um von Delphi belegten Speicher wieder freizugeben?

          Danke

          Gruß Ja

          Comment


          • #6
            Hallo,

            Delphi überwacht die Verwendung der Variablen, denen Interface-Zeiger zugewiesen wurden. Wenn diese Variable ihren Gültigkeitsbereich verlässt (Ende der Methode bei lokalen Variablen, Ende der Anwendung bei globalen Variablen) wird das COM-Objekt automatisch freigegeben, wenn der letzte Client den letzten Interface-Zeiger freigibt

            Comment

            Working...
            X