2012-04-02 11 views
1

Ich verwende die folgende Methode, um zwei separate RTF-Texte zu verketten und schließlich das Ergebnis auf einer TcxCustomRichEdit Kontrolle anzuzeigen. Es funktioniert perfekt von Jahren. Jetzt muss ich Bilder auch im RTF-Text unterstützen. Das Problem ist, wenn Bilder in TcxCustomRichEdit Steuerelemente sind, verkettet es aber einfach die Bilder ausschließt.2 RTF-Texte mit Bildern verschmelzen

Wie kann ich das erreichen?

Beispielcode: Beispielcode aus http://delphi.about.com/od/tmemotrichedit/a/richedit-append.htm genommen und

geändert Im Code

wie Sie, dass es TcxCustomRichEdit platziert sind zwei und schließlich nach Verkettung Ergebnisse sind auf dem First TcxCustomRichEdit Kontrolle zu sehen.

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

Bewertung des Frage, bitte. Ich habe 'TcxCustomRichEdit' hervorgehoben, da es etwas anders als' TRichEdit' sein kann, obwohl sie viele Dinge gemeinsam haben. – TLama

+0

Die [Original-Code'] (http://delphi.about.com/od/tmemotrichedit/a/richedit-append.htm) funktioniert auch mit Bildern gut; getestet auf 'TJvRichEdit' Kontrollen. – TLama

Antwort

1

in der Funktion ConcatenateAndShow redTemp.properties.AllowObjects Hinzufügen = True, um das Problem zu lösen, weil Dault Wert von allowobejcts Eigenschaft falsch ist, so dass es nicht das Bildobjekt in RTF ermöglicht wird

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

+1, guter Punkt, @ user193655, überprüfen Sie, ob Sie 'Properties.AllowObjects' auf einem Ziel' TcxRichEdit' auf True gesetzt haben. Ich habe es jetzt versucht und mit 'TcxRichEdit's auf dem Formular mit der einzigen Änderung' Properties.AllowObjects: = True' platziert, funktioniert Ihr Code wie erwartet. – TLama

Verwandte Themen