RxRichEdit高级操作

原创 2007年09月14日 13:20:00

 

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, 00);
  SendMessage(aRichEdit.Handle, WM_SETREDRAW, 
00);
  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, 
10);
  InvalidateRect(aRichEdit.Handle, nil, True);
  SendMessage(aRichEdit.Handle, EM_SETEventMask, 
0, EventMask);
end;

end.
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

RxRichEdit_v2.76

  • 2014-08-15 16:44
  • 188KB
  • 下载

24、DOM的高级应用1-------表格的动态删除和添加行的操作

1、DOM的高级应用1-------表格的动态删除和添加行的操作 2、注意oTab.tBodies[0].rows[0].cells[1].innerHTML的使用形式 3、代码的实现 ...

RxRichEdit v2.7(修改版)

  • 2010-06-18 16:59
  • 166KB
  • 下载

RXRICHEDIT图文混排

  • 2013-05-12 22:47
  • 244KB
  • 下载

第六章:高级字符驱动程序操作

1、ioctl ​除了读取和写入设备之外,大部分驱动程序还需要另外一种能力,即通过设备驱动程序执行各种类型的硬件控制。 在用户空间,ioctl系统调用有如下原型: int ioctl(in...

RxRichEdit_v2.76

  • 2012-10-27 15:40
  • 188KB
  • 下载

高级sql操作

  • 2015-04-17 12:41
  • 352KB
  • 下载

Linux设备驱动程序学习(6) -高级字符驱动程序操作[(3)设备文件的访问控制]

Linux设备驱动程序学习(6) -高级字符驱动程序操作[(3)设备文件的访问控制]   提供访问控制对于一个设备节点来的可靠性来说有时是至关重要的。这部分的内容只是在open和re...

windows高级编程可视化操作

  • 2015-12-27 19:16
  • 8.34MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)