2011-11-16 215 views
2

我正在使用OLE搜索替換將帶有存儲在數據庫字段中的內容的「佔位符標籤」替換爲Word文檔。我使用類似於什麼的技術here在Word文檔中插入rtf文本

這是工作,但當然它不適用於rtf領域。我有一個包含RTF數據數據庫字段,如果一個做搜索替換我會得到充分的RTF代碼,所以也看不到

你好世界

我看到類似

{ \ RTF1 \ ANSI \ ansicpg1252 \ deff0 \ deflang1040 \ viewkind4 \ UC1 \ PARD \ SA200 \ sl276 \ slmult1 \ lang16 \ b \ F0 \ FS22你好\我 世界\ B0 \ I0 \相提並論}

有沒有人已經解決了這個問題?在StackOverflow上搜索我找到了a trick that uses the clipboard。注意:我不使用書籤,這個例子使用書籤,我簡單地將我的標籤定義爲純文本,如'',當我在搜索和替換循環中找到''時,我替換文本。

更新:你看到這個剪貼板技巧中的任何prolem?

您是否有其他想法並可以提出其他解決方案?

+0

所以使用例如與剪貼板伎倆,但它使用的書籤,查找並選擇你的標籤,你已經做的方式,通過對選定的文本PasteSpecial的像在與例如更換標籤剪貼板技巧。 –

+0

是的,我意識到我沒有表達我的自我,讓我更新這個問題。我「隱式地」寫在那裏(現在我將寫出它的爆炸式地)對這個技巧的評論。 – LaBracca

+2

是的,使用剪貼板這種東西通常被認爲是「壞/不禮貌的應用行爲」,因爲無論用戶放在那裏都會干擾(刪除/覆蓋)... –

回答

0

我建議使用Selection.InsertFile來代替。下面是一個例子,它可以做你想做的事情,找到「佔位符」並插入一個rtf文件。將你的rtf保存到臨時文件之前...

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Fword,FDocument,FFindObject:OleVariant; 
    Filename:String; 

begin 
    Filename := 'C:\temp\test.doc'; 
    Fword := CreateOleObject('Word.Application'); 
    FDocument := Fword.Documents.Add(Filename); 
    FFindObject := FDocument.ActiveWindow.Selection.Find; 
    Fword.visible := true; 
    FFindObject.ClearFormatting; 
    FFindObject.Replacement.ClearFormatting; 
    FFindObject.Text := 'placeholder'; 
    FFindObject.Forward := True; 
    FFindObject.Replacement.Text := ''; 
    FFindObject.Wrap := 1; 
    FFindObject.MatchCase := False; 
    FFindObject.MatchWholeWord := False; 
    FFindObject.MatchWildcards := False; 
    FFindObject.MatchSoundsLike := False; 
    FFindObject.MatchAllWordForms := False; 

    if FFindObject.Execute() then Fword.selection.InsertFile('C:\temp\test.rtf') 
end; 
0

這是我從很久以前保存的文章。它由TeamB的Peter Below博士發佈到舊的Borland Delphi新聞組,但它今天仍然適用。它顯示瞭如何使用EM_STREAMINEM_STREAMOUT消息和相關回調將RTF文本放入TRichEdit中並將其複製出來。

Uses RichEdit; 

Type 
    TEditStreamCallBack = function (dwCookie: Longint; pbBuff: PByte; 
    cb: Longint; var pcb: Longint): DWORD; stdcall; 

    TEditStream = record 
    dwCookie: Longint; 
    dwError: Longint; 
    pfnCallback: TEditStreamCallBack; 
    end; 

function EditStreamInCallback(dwCookie: Longint; pbBuff: PByte; 
cb: Longint; var pcb: Longint): DWORD; Stdcall; 
var 
    theStream: TStream; 
    dataAvail: LongInt; 
begin 
    theStream := TStream(dwCookie); 
    with theStream do begin 
    dataAvail := Size - Position; 
    Result := 0; {assume everything is ok} 
    if dataAvail <= cb then begin 
     pcb := Read(pbBuff^, dataAvail); 
     if pcb <> dataAvail then //couldn't read req. amount of bytes 
     result := E_FAIL; 
    end 
    else begin 
     pcb := Read(pbBuff^, cb); 
     if pcb <> cb then 
     result := E_FAIL; 
    end; 
    end; 
end; 


Function EditStreamOutCallback(dwCookie: Longint; pbBuff: PByte; 
    cb: Longint; var pcb: Longint): DWORD; stdcall; 
var 
    theStream: TStream; 
begin 
    theStream := TStream(dwCookie); 

    with theStream do begin 
    If cb > 0 Then 
     pcb := Write(pbBuff^, cb); 
    Result := 0; 
    end; 
end; 

Procedure GetRTFSelection(aRichEdit: TRichEdit; intoStream: TStream); 
Var 
    editstream: TEditStream; 
Begin 
    With editstream Do Begin 
    dwCookie:= Longint(intoStream); 
    dwError:= 0; 
    pfnCallback:= EditStreamOutCallBack; 
    end; 
    aRichedit.Perform(EM_STREAMOUT, SF_RTF or SFF_SELECTION, longint(@editstream)); 
End; 

Procedure PutRTFSelection(aRichEdit: TRichEdit; sourceStream: TStream); 
Var 
    editstream: TEditStream; 
Begin 
    With editstream Do Begin 
    dwCookie:= Longint(sourceStream); 
    dwError:= 0; 
    pfnCallback:= EditStreamInCallBack; 
    end; 
    aRichedit.Perform(EM_STREAMIN, SF_RTF or SFF_SELECTION, longint(@editstream)); 
End; 
+0

爲了說明代碼的年代,Peter的簽名地址是「Peter Below(TeamB)100113.1101 @ compuserve.com' :) –