Слияние 2 RTF текстов с изображениями - PullRequest
1 голос
/ 02 апреля 2012

Я использую следующий метод для объединения двух отдельных текстов RTF и, наконец, отображаю результат на элементе управления TcxCustomRichEdit. Он отлично работает с годами. Теперь мне нужно поддерживать изображения тоже в тексте RTF. Проблема в том, что когда в элементах управления TcxCustomRichEdit есть изображения, они объединяются, но просто исключают изображения.

Как мне этого добиться?

Пример кода: Пример кода взят из http://delphi.about.com/od/tmemotrichedit/a/richedit-append.htm и изменен

В коде, как вы можете видеть, есть два TcxCustomRichEdit, помещенных и, наконец, после конкатенации. Результаты отображаются в первом TcxCustomRichEdit Control.

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;

1 Ответ

1 голос
/ 03 апреля 2012

в функции ConcatenateAndShow добавление redTemp.properties.AllowObjects = True может решить проблему, так как значение значения свойства allowobejcts равно false, поэтому оно не допускает объект изображения в RTF

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