Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Word: Via OLE Automation RTF einfügen (https://www.delphipraxis.net/114868-word-via-ole-automation-rtf-einfuegen.html)

RedOne 2. Jun 2008 08:27


Word: Via OLE Automation RTF einfügen
 
Hallo zusammen

Ich hoffe, ich bin hier richtig :-)

Aus unserem Framework ist es möglich RTF-Templates zu erstellen und diese aus dem Framework mit Daten zu füllen.
Nun stellen wir einige Dinge auf Ole-Automation um, da RTF-Dokumente einige Probleme beinhalten.

Nun also Parse ich das ganze Worddokument via Ole und ersetze alle Platzhalter mit Daten aus der Datenbank. Mit normalem Text funktioniert dies gut. Nur kann der Benutzer auch formatierte Felder ausfüllen, die als RFT gespeichert werden, also direkt als String:

{\rtf1\ansi\deff0\deftab720{\fonttbl{\f0\fnil\fcha rset0 Arial;}{\f1\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\g reen0\blue0;\red0\green128\blue0;\red0\green0\blue 255;\red255\green255\blue0;\red255\...

Nun überschreibe ich den im Word selektierten Text mit meinem Dateninhalt:

v.Selection:= content; // content = Inhalt aus Datenbank. Z.B. Texte oder auch RFT, Bilder etc

Was nun passiert ist klar, er schreibt den RFT-Text unformatiert hinein... Nur halt nicht formatiert :-(
Ich habe verschiedene Lösungsansätze versucht, schliesslich auch übers Clipboard, aber bei keinem Versuch wurde der Text als RTF angesehen.
Hab jemand vielleicht eine findige Idee? :-)

Vielen Dank
RedOne

spaxxn 2. Jun 2008 08:58

Re: Word: Via OLE Automation RTF einfügen
 
Du kannst die RTF-Informationen nicht als Text einfügen.

Bin grad mal in die tiefen des Codes eingetaucht. Werde dann gleich mal wieder auftauchen

RedOne 2. Jun 2008 10:40

Re: Word: Via OLE Automation RTF einfügen
 
Ok. Was wäre wohl eine gute Lösung?
Momentan mache ich es so, dass ich es in eine RTF-Komponente (ähnlich dem Memo-Feld) einfügen, über die Methode .CopyToClipboard kopiere und im Word via Automation einfüge.
Eigentlich eine ziemlich Umständliche Lösung :-D

Aber Danke für die Antwort!
RedOne

spaxxn 2. Jun 2008 11:09

Re: Word: Via OLE Automation RTF einfügen
 
Woher kommt der RTF-Teil?

RedOne 2. Jun 2008 11:15

Re: Word: Via OLE Automation RTF einfügen
 
Aus einer zusätzlich eingekauften Komponente (WPTools).
Ich hab mir deren Code auch schon angeschaut, ist aber ziemlich komplex... :-)

spaxxn 2. Jun 2008 11:17

Re: Word: Via OLE Automation RTF einfügen
 
Die hab ich hier, guck mal rein ...

RedOne 2. Jun 2008 11:18

Re: Word: Via OLE Automation RTF einfügen
 
Das Teil heisst "TFormWPTEditor". Kopiert wird mit "rtfComp.RTF.CopyToClipboard;"
Merci

spaxxn 3. Jun 2008 07:18

Re: Word: Via OLE Automation RTF einfügen
 
Moin,

also zu der Komponente kann ich nichts sagen, da ich gestern rein arbeitstechnisch nicht dazu gekommen bin. Hier ziehe ich die Textbausteine aus der DB, lade sie im Anschluss in einen Stream, dann werden diese in die Zwischenablage kopiert und dort von kommen sie ins Dokument.

Allerdings arbeite ich mit TWordApplication und TWordDocument. Diese sollten ebenfalls auf OLE aufsetzen, nur weiss ich nicht genau, inwiefern dadurch das Einfügen beeinflusst wird. Funktioniert aber einwandfrei.

Remko 3. Jun 2008 21:45

Re: Word: Via OLE Automation RTF einfügen
 
Maybe the code below helps you, it's a snippet from one of my old programs.
ReadFromWord takes an active word document as input var and outputs the document's contents as RTF text. WriteToWord goes the other way round.


Delphi-Quellcode:
function TForm1.ReadFromWord(Doc: _Document): PChar;
var DataObject: IDataObject;
    ReturnData: TStgMedium;
    RTFFormat: TFormatEtc;

    begin
  if Assigned(Doc) then begin
    try
      if Doc.QueryInterface(IDataObject, DataObject) = 0 then begin
        cfRTF := RegisterClipboardFormat('Rich Text Format');
        RTFFormat.cfFormat := CFRTF;
        RTFFormat.tymed := TYMED_HGLOBAL;
        RTFFormat.ptd := nil;
        RTFFormat.dwAspect := DVASPECT_CONTENT;
        RTFFormat.lindex := -1;
        OleCheck(DataObject.GetData(RTFFormat, ReturnData));
        ReadFromWord := GlobalLock(ReturnData.hglobal);
        GlobalUnlock(ReturnData.hglobal);
      end
      else begin
        ShowMessage('QueryInterface failed');
      end;
    except
      ShowMessage('Error while getting RTF');
    end;
  end;
end;

procedure TForm1.WriteToMSWord(WordDoc: _Document; const RTFText: String);
var
  cfRTF: Integer;
  DataObj : IDataObject;
  RTFFormat: TFormatEtc;
  Medium : TStgMedium;
  pGlobal : Pointer;

begin
    OleCheck(WordDoc.QueryInterface(IDataObject,DataObj));
    cfRTF := RegisterClipboardFormat('Rich Text Format');
    RTFFormat.cfFormat := CFRTF;
    RTFFormat.tymed := TYMED_HGLOBAL;
    RTFFormat.ptd := nil;
    RTFFormat.dwAspect := DVASPECT_CONTENT;
    RTFFormat.lindex := -1;
    FillChar(Medium,SizeOf(Medium),0);
    Medium.tymed := RTFFormat.tymed;
    Medium.hGlobal := GlobalAlloc(GMEM_MOVEABLE, Length(RTFText)+1);
    try
     pGlobal := GlobalLock(Medium.hGlobal);
     CopyMemory(PGlobal,PChar(RTFText),Length(RTFText)+1);
     GlobalUnlock(Medium.hGlobal);
     OleCheck(DataOBJ.SetData(RTFFormat,Medium,True));
    finally
      GlobalFree(Medium.hGlobal);
      ReleaseStgMedium(Medium);
    end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:57 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz