Announcement

Collapse
No announcement yet.

OleContainer und Word fernsteuern

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

  • OleContainer und Word fernsteuern

    Hallo,<p>
    ich habe einen OleContainer (Delphi6) in das zur Laufzeit ein WordDoc geladen wird. Das Dokument erscheint eingebettet in die Anwendung als Edit-Control.<br>
    Wie kann man jetzt Word über die frühe Bindung fernsteuern (z.B. Bookmarks anspringen) ?<br>
    Wie bekommt man eine Verbindung von Word aus dem OleContainer und den Server Objekten von Delphi ?<p>
    Gruss Marcus

  • #2
    Hallo,

    der TOleConainer stellt über die Eigenschaft <b>OLEObject</b> einen direkten Interface-Zeiger auf das darunterliegende Automation-Objekt zur Verfügung. Über diesen Weg kann jede Automation-Methode direkt aufgerufen werden. Der folgende Auszug aus einem Beispielprojekt aus meinem <i>COM/DCOM/COM+</i>-Buch demonstriert dies:
    <pre>
    <font color="#003399"><i>{ Für den Fall, daß ein eingebettetes OLE-Objekt nicht im speziellen
    Format des OleContainers gespeichert werden soll, sondern im
    ursprünglichen Dateiformat, kann der Automation-Zugriff bemüht
    werden. }</i></font>
    <br>
    <b>procedure</b> TFormMain.MWExportDOCClick(Sender: TObject);
    <b>begin</b>
    <b>with</b> SaveDialog1 <b>do</b>
    <b>if</b> Execute <b>then</b>
    OleContainerWord.OLEObject.SaveAs(FileName:= FileName,
    FileFormat:= 0);
    <b>end</b>;
    </pre>
    Der zweite Auszug aus dem Beispiel demonstriert, wie man über das <b>Range</b>-Objekt von Word eigenen Text einfügen kann:
    <pre>
    <font color="#003399"><i>(* Immer dann, wenn ein neuer Datensatz eingefügt werden soll,
    öffnet der OLEContainer die Dokument-Vorlage, in der die
    Rohfassung des Dokuments steht. Anschließend kann das
    Programm einige Server-Befehle über »DoVerb« ausführen,
    wobei zur Information die gerade verfügbaren Befehle in die
    TMemo-Instanz im Programmfenster geschrieben werden. *)</i></font>
    <br>
    <b>procedure</b> TDM.TableWordOLENewRecord(DataSet: TDataSet);
    <b>var</b>
    aDoc : OLEVariant;
    iCnt : Integer;
    <b>begin</b>
    TableWordOLEDocName.Value := <font color="#9933CC">'Neu (unbenannt)'</font>;
    <font color="#003399"><i>// OLEContainer füllen</i></font>
    FormMain.OLEContainerWord.CreateObjectFromFile(cDo cPath,False);
    <font color="#003399"><i>// Befehl &quot;Bearbeiten&quot; ausführen</i></font>
    FormMain.OLEContainerWord.DoVerb(1);
    <font color="#003399"><i>// zur Demonstration alle Befehle auflisten</i></font>
    <b>with</b> FormMain, MemoVerb.Lines <b>do</b> <b>begin</b>
    Clear;
    AddStrings(OLEContainerWord.ObjectVerbs);
    <b>end</b>;
    <font color="#003399"><i>// im Dokument können via VBA-Objekt Daten eingesetzt werden</i></font>
    aDoc := FormMain.OLEContainerWord.OLEObject;
    <b>try</b>
    <font color="#003399"><i>// fiktive Daten in formatierter Form schreiben</i></font>
    WriteRTFDataFile;
    <font color="#003399"><i>// Inhalt der RTF-Datei an die Cursorposition einfügen</i></font>
    aDoc.Range.InsertFile(cRTFPath);
    aDoc.Paragraphs.Add;
    aDoc.Range.InsertAfter(Format(<font color="#9933CC">'Daten vom %s.'</font>,[DateTimeToStr(Now)]));
    <b>for</b> iCnt := 1 <b>to</b> 4 <b>do</b>
    aDoc.Paragraphs.Add;
    aDoc.Range.InsertAfter(<font color="#9933CC">'Unterschrift'</font>);
    <b>except</b>
    MessageBeep($FFFFFFFF);
    <b>end</b>;
    <b>end</b>;
    </pre&gt

    Comment


    • #3
      Vielen Dank,<p>
      das hat bei mir jetzt funktioniert.<p>
      Gruß Marcu

      Comment

      Working...
      X