RxRichEdit高级操作

 

unit InsertRichEditUnit;

interface

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

type
  TEditStreamCallBack 
=  function(dwCookie: Longint; pbBuff: PByte; cb: Longint;
    var pcb: Longint): DWORD; stdcall;

  TEditStream 
=  record
    dwCookie: Longint;
    dwError: Longint;
    pfnCallback: TEditStreamCallBack;
  end;

procedure GetRTFSelection(aRichEdit: TUHISRichEdit; IntoStream: TStream);
procedure PutRTFSelection(aRichEdit: TUHISRichEdit; SourceStream: TStream);
procedure InsertRTF(aRichEdit: TUHISRichEdit; S: 
string );
procedure CopyRTF(aSource, aDest: TUHISRichEdit);
procedure CopyAllRTF(aSource, aDest: TUHISRichEdit);
procedure AppendRTF(aRichEdit: TUHISRichEdit; S: 
string );

implementation

function EditStreamInCallback(dwCookie: Longint; pbBuff: PByte; cb: Longint;
  var pcb: Longint): DWORD; stdcall;
var
  TheStream: TStream;
  DataAvail: LongInt;
begin
  TheStream :
=  TStream(dwCookie);
  with TheStream 
do
  begin
    DataAvail :
=  Size  -  Position;
    Result :
=   0 ;
    
if  DataAvail  <=  cb then
    begin
      pcb :
=  Read(pbBuff ^ , DataAvail);
      
if  pcb  <>  DataAvail then
        result :
=  DWord(E_FAIL);
    end
    
else
    begin
      pcb :
=  Read(pbBuff ^ , cb);
      
if  pcb  <>  cb then
        result :
=  DWord(E_FAIL);
    end;
  end;
  TheStream :
=  TStream(dwCookie);
end;

function EditStreamOutCallback(dwCookie: Longint; pbBuff: PByte; cb: Longint;
  var pcb: Longint): DWORD; stdcall;
var
  TheStream: TStream;
begin
  TheStream :
=  TStream(dwCookie);
  with TheStream 
do
  begin
    
if  cb  >   0  then
      pcb :
=  Write(pbBuff ^ , cb);
    Result :
=   0 ;
  end;
end;

procedure GetRTFSelection(aRichEdit: TUHISRichEdit; IntoStream: TStream);
var
  EditStream: TEditStream;
begin
  with EditStream 
do
  begin
    dwCookie :
=  Longint(IntoStream);
    dwError :
=   0 ;
    pfnCallback :
=  EditStreamOutCallBack;
  end;
  aRichEdit.Perform(EM_STREAMOUT, SF_RTF or SFF_SELECTION, longint(@EditStream));
end;

procedure PutRTFSelection(aRichEdit: TUHISRichEdit; SourceStream: TStream);
var
  EditStream: TEditStream;
begin
  with EditStream 
do
  begin
    dwCookie :
=  Longint(SourceStream);
    dwError :
=   0 ;
    pfnCallback :
=  EditStreamInCallBack;
  end;
  aRichEdit.Perform(EM_STREAMIN, SF_RTF or SFF_SELECTION, longint(@EditStream));
end;

procedure InsertRTF(aRichEdit: TUHISRichEdit; S: 
string );
var
  aMemStream: TMemoryStream;
begin
  
if  Length(S)  >   0  then
  begin
    aMemStream :
=  TMemoryStream.Create;
    
try
      aMemStream.Write(S[
1 ], length(S));
      aMemStream.Position :
=   0 ;
      PutRTFSelection(aRichEdit, aMemStream);
    
finally
      aMemStream.Free;
    end;
  end;
end;

procedure CopyRTF(aSource, aDest: TUHISRichEdit);
var
  aMemStream: TMemoryStream;
begin
  aMemStream :
=  TMemoryStream.Create;
  
try
    GetRTFSelection(aSource, aMemStream);
    aMemStream.Position :
=   0 ;
    PutRTFSelection(aDest, aMemStream);
  
finally
    aMemStream.Free;
  end;
end;

procedure CopyAllRTF(aSource, aDest: TUHISRichEdit);
var
  aMemStream: TMemoryStream;
begin
  aMemStream :
=  TMemoryStream.Create;
  
try
    aSource.SelectAll;
    GetRTFSelection(aSource, aMemStream);
    aMemStream.Position :
=   0 ;
    aDest.SelStart :
=  Length(aDest.Lines.Text);
    PutRTFSelection(aDest, aMemStream);
  
finally
    aMemStream.Free;
  end;
end;

procedure AppendRTF(aRichEdit: TUHISRichEdit; S: 
string );
var
  Start, Length, EventMask: Integer;
begin
  EventMask :
=  SendMessage(aRichEdit.Handle, EM_SETEventMask,  0 0 );
  SendMessage(aRichEdit.Handle, WM_SETREDRAW, 
0 0 );
  Start :
=  aRichEdit.SelStart;
  Length :
=  aRichEdit.SelLength;
  aRichEdit.SelLength :
=   0 ;
  aRichEdit.SelStart :
=  System.Length(aRichEdit.Text);
  InsertRTF(aRichEdit, s);
  aRichEdit.SelStart :
=  Start;
  aRichEdit.SelLength :
=  Length;
  SendMessage(aRichEdit.Handle, WM_SETREDRAW, 
1 0 );
  InvalidateRect(aRichEdit.Handle, nil, True);
  SendMessage(aRichEdit.Handle, EM_SETEventMask, 
0 , EventMask);
end;

end.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值