2012-04-02 37 views
1

我使用以下方法連接兩個單獨的RTF文本,並最終在TcxCustomRichEdit控件上顯示結果。它從多年來完美運作。現在我需要在RTF文本中支持圖片。 問題是當TcxCustomRichEdit控件中存在圖像時,它會連接,但只是排除圖像。合併2 RTF文本與圖像

我該如何做到這一點?

示例代碼:示例代碼從http://delphi.about.com/od/tmemotrichedit/a/richedit-append.htm截取和修改

在代碼,你可以看到,有兩個TcxCustomRichEdit放置並終於之後級聯結果示於首先TcxCustomRichEdit控制。

Procedure AppendFromRichEdit(FromRch,ToRch: TcxCustomRichEdit); // Function to append rich edit text from source to Destination 
var 
    MemStream: TMemoryStream; 
    rtfStream: TEditStream; 


    function EditStreamReader(
    dwCookie: DWORD; 
    pBuff: Pointer; 
    cb: LongInt; 
    pcb: PLongInt): DWORD; stdcall; 
    begin 
    result := $0000; 
    try 
     pcb^ := TStream(dwCookie).Read(pBuff^, cb) ; 
    except 
     result := $FFFF; 
    end; 
    end; (*EditStreamReader*) 

begin 
    MemStream := TMemoryStream.Create; 
    try 
    with FromRch as TcxCustomRichEdit do Begin 
     Lines.SaveToStream(MemStream); 
    end; 
    MemStream.Position := 0; 
    rtfStream.dwCookie := DWORD(MemStream) ; 
    rtfStream.dwError := $0000; 
    rtfStream.pfnCallback := @EditStreamReader; 
    Try 
     ToRch.InnerControl.Perform(
     EM_STREAMIN, 
     SFF_SELECTION or SF_RTF or SFF_PLAINRTF, LPARAM(@rtfStream) 
    ) ; 
     if rtfStream.dwError <> $0000 then 
     raise Exception.Create(TranslateQBMessage('QBToolsErrorAppendingRTFData')); 
    except 
     On E: Exception do 
     // do nothing  MsgBox(E.Message) 
    end; 
    finally 
     MemStream.Free; 
    end; 
end; 

procedure ConcatenateAndShow; 
var 
    redTemp: TcxRichEdit; 
begin 
    try 
    redTemp := TcxRichEdit.Create(memTesto.Owner); 
    redTemp.Parent := memTesto.Parent; 
    redTemp.Visible := False; 
    redTemp.Clear; 
    redTemp.Text := MySecondRichEditControl.Text; //Text in Second Rich Edit Control 
    AppendFromRichEdit(redTemp, memTesto); 
    finally 
    redTemp.Free; 
    end; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    FirstRicheditControl.lines.Append('This is My Text in First Richedit Control'); 
    FirstRicheditControl.lines.Append('And Finally after concatenation it will show in Same Control'); 
    ConcatenateAndShow; 
end; 
+0

審查問題,請。我已經強調過'TcxCustomRichEdit',因爲它可能與'TRichEdit'有一點不同,儘管它們可能有許多共同之處。 – TLama 2012-04-02 14:55:24

+0

['原始代碼]](http://delphi.about.com/od/tmemotrichedit/a/richedit-append.htm)即使對圖像也能正常工作;在'TJvRichEdit'控件上進行測試。 – TLama 2012-04-02 15:32:14

回答

1
在功能ConcatenateAndShow加入redTemp.properties.AllowObjects

=真可以解決問題,因爲allowobejcts屬性的dault值爲false,那麼它不允許RTF圖像對象

Try 
redTemp := TcxRichEdit.Create(memTesto.Owner); 
redTemp.Parent := memTesto.Parent; 
redTemp.Visible := False; 
redtemp.Properties.AllowObjects := True; 
. 
. 
+0

+1,good point @ user193655,檢查你的目標'TcxRichEdit'上的'Properties.AllowObjects'是否設置爲True。我現在已經嘗試過了,只用一個變量'Properties.AllowObjects:= True',將'TcxRichEdit'放在窗體上,代碼按預期工作。 – TLama 2012-04-04 08:26:06