![]() |
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 |
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 |
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 |
Re: Word: Via OLE Automation RTF einfügen
Woher kommt der RTF-Teil?
|
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... :-) |
Re: Word: Via OLE Automation RTF einfügen
Die hab ich hier, guck mal rein ...
|
Re: Word: Via OLE Automation RTF einfügen
Das Teil heisst "TFormWPTEditor". Kopiert wird mit "rtfComp.RTF.CopyToClipboard;"
Merci |
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. |
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 21:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz