AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Word: Via OLE Automation RTF einfügen
Thema durchsuchen
Ansicht
Themen-Optionen

Word: Via OLE Automation RTF einfügen

Ein Thema von RedOne · begonnen am 2. Jun 2008 · letzter Beitrag vom 3. Jun 2008
Antwort Antwort
RedOne

Registriert seit: 2. Jun 2008
71 Beiträge
 
Delphi XE2 Professional
 
#1

Word: Via OLE Automation RTF einfügen

  Alt 2. Jun 2008, 08:27
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
  Mit Zitat antworten Zitat
Benutzerbild von spaxxn
spaxxn

Registriert seit: 19. Nov 2004
253 Beiträge
 
Delphi XE2 Enterprise
 
#2

Re: Word: Via OLE Automation RTF einfügen

  Alt 2. Jun 2008, 08:58
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
  Mit Zitat antworten Zitat
RedOne

Registriert seit: 2. Jun 2008
71 Beiträge
 
Delphi XE2 Professional
 
#3

Re: Word: Via OLE Automation RTF einfügen

  Alt 2. Jun 2008, 10:40
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

Aber Danke für die Antwort!
RedOne
  Mit Zitat antworten Zitat
Benutzerbild von spaxxn
spaxxn

Registriert seit: 19. Nov 2004
253 Beiträge
 
Delphi XE2 Enterprise
 
#4

Re: Word: Via OLE Automation RTF einfügen

  Alt 2. Jun 2008, 11:09
Woher kommt der RTF-Teil?
  Mit Zitat antworten Zitat
RedOne

Registriert seit: 2. Jun 2008
71 Beiträge
 
Delphi XE2 Professional
 
#5

Re: Word: Via OLE Automation RTF einfügen

  Alt 2. Jun 2008, 11:15
Aus einer zusätzlich eingekauften Komponente (WPTools).
Ich hab mir deren Code auch schon angeschaut, ist aber ziemlich komplex...
  Mit Zitat antworten Zitat
Benutzerbild von spaxxn
spaxxn

Registriert seit: 19. Nov 2004
253 Beiträge
 
Delphi XE2 Enterprise
 
#6

Re: Word: Via OLE Automation RTF einfügen

  Alt 2. Jun 2008, 11:17
Die hab ich hier, guck mal rein ...
  Mit Zitat antworten Zitat
RedOne

Registriert seit: 2. Jun 2008
71 Beiträge
 
Delphi XE2 Professional
 
#7

Re: Word: Via OLE Automation RTF einfügen

  Alt 2. Jun 2008, 11:18
Das Teil heisst "TFormWPTEditor". Kopiert wird mit "rtfComp.RTF.CopyToClipboard;"
Merci
  Mit Zitat antworten Zitat
Benutzerbild von spaxxn
spaxxn

Registriert seit: 19. Nov 2004
253 Beiträge
 
Delphi XE2 Enterprise
 
#8

Re: Word: Via OLE Automation RTF einfügen

  Alt 3. Jun 2008, 07:18
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.
  Mit Zitat antworten Zitat
Benutzerbild von Remko
Remko

Registriert seit: 10. Okt 2006
Ort: 's-Hertogenbosch, Die Niederlande
222 Beiträge
 
RAD-Studio 2010 Arc
 
#9

Re: Word: Via OLE Automation RTF einfügen

  Alt 3. Jun 2008, 21:45
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;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:35 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