2

Using delphi 7 TRichEdit component, RTF data is being imported from a msword document through copy and paste, but if data is contained in a box, it is not displaying correctly i.e.

enter image description here

Please assist

5
  • If you paste it to WordPad, does it display it correctly? Commented May 8, 2012 at 12:22
  • Yes it appears well but using the RTF editors from RX and from Delphi,the layout changes. Commented May 8, 2012 at 12:33
  • 2
    That's got to do something with the version of the richedit control used by the VCL. I'm sure someone will remember the details.. Commented May 8, 2012 at 12:35
  • 2
    I think Sertac is right, maybe you can try to upgrade to a newer version like François described on his blog. Commented May 8, 2012 at 12:53
  • SertacAkyuz and TLama thanks for the prompt replies i think this is the way to go, only problem is the fix by Francois is for delphi 10. Commented May 8, 2012 at 13:20

2 Answers 2

3

Try to use the following, it should subclass the TRichEdit class to version 4.1. However I don't know if Delphi 7 supports interposed classes, so just try to paste the following code and try to build the project.
If it compiles then if you put a TRichEdit component and run the project you should get RichEdit 4.1.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, RichEdit;

type
  TRichEdit = class(ComCtrls.TRichEdit)
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  end;

type
  TForm1 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  FRichEditModule: THandle;

implementation

{$R *.dfm}

{ TRichEdit }

procedure TRichEdit.CreateParams(var Params: TCreateParams);
const
  RichEditClassName = 'RICHEDIT50A';
  RichEditModuleName = 'MSFTEDIT.DLL';
  HideScrollBarsStyle: array[Boolean] of DWORD = (ES_DISABLENOSCROLL, 0);
  HideSelectionsStyle: array[Boolean] of DWORD = (ES_NOHIDESEL, 0);
begin
  if FRichEditModule = 0 then
  begin
    FRichEditModule := LoadLibrary(RichEditModuleName);
    if FRichEditModule <= HINSTANCE_ERROR then
      FRichEditModule := 0;
  end;
  inherited CreateParams(Params);    
  CreateSubClass(Params, RichEditClassName);
  Params.Style := Params.Style or HideScrollBarsStyle[HideScrollBars] or
    HideSelectionsStyle[HideSelection];
  Params.WindowClass.style := Params.WindowClass.style and
    not (CS_HREDRAW or CS_VREDRAW);
end;

initialization

finalization
  if FRichEditModule <> 0 then
    FreeLibrary(FRichEditModule);

end.
Sign up to request clarification or add additional context in comments.

7 Comments

IIRC the RxRichEdit already used RICHED20.DLL. If it doesn't display the box correctly OP should perhaps aim for 'RICHEDIT50W' (or perhaps 'RICHEDIT50A' if it has got an Ansi counterpart) as you've mentioned in your comment to the question.
@Sertac, there is already version 5.0 ? Never noticed that (I'm not an advanced rich edit user, I've been just satisfied with 2.0 :-) And I really lost an overview what's in Delphi 7 (I was thinking about v.1.0).
it gives a 'RichEdit Line Insertion' error after adding a TRichEdit component
@TLama - Well, I was reading the blog you mentioned. AFAIU that's the class name for the 4.1 version. Confusing..
I confirm the modified answer works in D7. However I cannot confirm it will help or not, since when I paste a text box from Word to WordPad there's no box at all.
|
2

Finally got it to work,

It was as simple as adding the Riched20.dll (Latest version) to the application folder

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.