有没有RxRichEdit的替代控件,要求可以显示图片?我对RxRichEdit对中文的支持情况失望极了

解决方案 »

  1.   

    InfoPower 3000---->wwDBRichEdit1
    in www.delphi51.com
      

  2.   

    RxRichEdit对中文支持很不好?我正想用呢,不知道怎么的不好法?能叙述一下吗?谢谢!!!
      

  3.   

    首先,在获得一行的文本时会漏字,漏上一个两个字没关系,关键是他容易漏半个字,就全变成乱码了。另外,在计算文字位置的时候,和选中文字的时候也容易出现类似问题,还要自己进行判断,看看得到的ascii码是不是大于128(中文由两个128以上的ascii码组成),有些时候就容易出错了。
    不过说起来这些问题也好解决,比如第一个问题,修改richeditstrings的get方法,将最后一行的L换为Sizeof(Text),你如果对读源代码很在行,完全可以修改rxlib控件,适合自己使用。我没那本事,也没那工夫,只好放弃了。
      

  4.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ComCtrls,RichEdit,activex,comobj;type
      _ReObject = record
        cbStruct: DWORD;           { Size of structure                }
        cp: ULONG;                 { Character position of object     }
        clsid: TCLSID;             { Class ID of object               }
        poleobj: IOleObject;       { OLE object interface             }
        pstg: IStorage;            { Associated storage interface     }
        polesite: IOleClientSite;  { Associated client site interface }
        sizel: TSize;              { Size of object (may be 0,0)      }
        dvAspect: Longint;         { Display aspect to use            }
        dwFlags: DWORD;            { Object status flags              }
        dwUser: DWORD;             { Dword for user's use             }
      end;
      TReObject = _ReObject;  type
      IRichEditOle = interface(IUnknown)
        ['{00020d00-0000-0000-c000-000000000046}']
        function GetClientSite(out clientSite: IOleClientSite): HResult; stdcall;
        function GetObjectCount: HResult; stdcall;
        function GetLinkCount: HResult; stdcall;
        function GetObject(iob: Longint; out reobject: TReObject;
          dwFlags: DWORD): HResult; stdcall;
        function InsertObject(var reobject: TReObject): HResult; stdcall;
        function ConvertObject(iob: Longint; rclsidNew: TIID;
          lpstrUserTypeNew: LPCSTR): HResult; stdcall;
        function ActivateAs(rclsid: TIID; rclsidAs: TIID): HResult; stdcall;
        function SetHostNames(lpstrContainerApp: LPCSTR;
          lpstrContainerObj: LPCSTR): HResult; stdcall;
        function SetLinkAvailable(iob: Longint; fAvailable: BOOL): HResult; stdcall;
        function SetDvaspect(iob: Longint; dvaspect: DWORD): HResult; stdcall;
        function HandsOffStorage(iob: Longint): HResult; stdcall;
        function SaveCompleted(iob: Longint; const stg: IStorage): HResult; stdcall;
        function InPlaceDeactivate: HResult; stdcall;
        function ContextSensitiveHelp(fEnterMode: BOOL): HResult; stdcall;
        function GetClipboardData(var chrg: TCharRange; reco: DWORD;
          out dataobj: IDataObject): HResult; stdcall;
        function ImportDataObject(dataobj: IDataObject; cf: TClipFormat;
          hMetaPict: HGLOBAL): HResult; stdcall;
      end;type
      TForm1 = class(TForm)
        RichEdit1: TRichEdit;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;const
      IID_IUnknown: TGUID = (
        D1:$00000000;D2:$0000;D3:$0000;D4:($C0,$00,$00,$00,$00,$00,$00,$46));
      IID_IRichEditOle: TGUID = (
        D1:$00020D00;D2:$0000;D3:$0000;D4:($C0,$00,$00,$00,$00,$00,$00,$46));
      IID_IOleObject: TGUID = (
        D1:$00000112;D2:$0000;D3:$0000;D4:($C0,$00,$00,$00,$00,$00,$00,$46));  REO_CP_SELECTION = -1;
      REO_IOB_SELECTION = -1;
      REO_IOB_USE_CP = -2;
      REO_RESIZABLE = 1;
      REO_BELOWBASELINE = 2;
      
    var
      Form1: TForm1;
      FRTF:IRichEditOle;
      FOLE:IOLEObject;
      formatEtc:tagFORMATETC;
      FStorage :ISTORAGE;   //混合文档接口
      FClientSite:IOLECLIENTSITE;
      FLockBytes:ILockBytes;
      ReObject:TReObject;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
    var
    //  v:olevariant;
      xt:TGuid;
      FTemp:IUnknown;
    begin
      sendmessage(richedit1.handle,EM_GETOLEINTERFACE,0,LongInt(@FRTF));
      if not assigned(FRTF)then
      begin
        showmessage('Error to get Richedit OLE interface');
        exit;
      end;  //建立一个可以访问全局内存的Byte数组 FLockBytes
      //返回ILockBytes接口
      if CreateILockBytesOnHGlobal(0,true,FLockBytes)<>S_OK then
      begin
        showmessage('Error to create Global Heap');
        exit;
      end;  //建立一个混合文档存取对象
      if StgCreateDocfileOnILockBytes(FLockBytes,STGM_SHARE_EXCLUSIVE or
            STGM_CREATE or STGM_READWRITE,0,FStorage)<>S_OK then
      begin
        showmessage('Error to create storage');
        exit;
      end;
            
      formatEtc.cfFormat := 0;
      FormatEtc.ptd := nil;
      FormatEtc.dwAspect := DVASPECT_CONTENT;
      FormatEtc.lindex := -1;
      FormatEtc.tymed := TYMED_NULL;  //从IRichEditOle中获得ClientSite对象
      FRTF.GetClientSite(FClientSite);  //从文件c:\wd.bmp中创建一个OLE对象 c:\wd.bmp  c:\doc1.doc
      if OleCreateFromFile(GUID_NULL,'c:\wd.bmp',IID_IUnknown,0,@formatEtc,
            FClientSite,FStorage,FOLE)<>S_OK then
      begin
        showmessage('Error');
        exit;
      end;  //现在的FOLE还是一个IUnKnown接口,将其转换为一个 IOleObject接口
      FTemp:=FOLE;
      FTemp.QueryInterface(IID_IOleObject, FOle);
      OleSetContainedObject(FOle, TRUE);  reobject.cbStruct := sizeof(TReObject);
      FOLE.GetUserClassID(xt);
      ReObject.clsid := xt;
      reobject.cp := ULong(REO_CP_SELECTION);
      reobject.dvaspect := DVASPECT_CONTENT;
      reobject.dwFlags := ULong(REO_RESIZABLE) or ULong(REO_BELOWBASELINE);
      reobject.dwUser := 0;
      reobject.poleobj := FOle;
      reobject.polesite := FClientSite;
      reobject.pstg := FStorage;
      reobject.sizel.cx := 0;
      reobject.sizel.cy := 0;  FRTF.InsertObject(reobject);
    end;end.
      

  5.   

    上面的代码在TForm1.Button1Click事件中将c:wd.bmp插入到FRTF中。RxRichEdit实际上也是使用的类似的方法(通过IRichEditOle接口和复合文档接口来访问)