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.

数据库高级操作

数据高级操作 数据的操作无外乎就是对数据的增删改查 增加数据 基本方式:insert into 表名[(字段列表)] values(值列表);   主键冲突:在插入数据的时候,主键值已经存...
  • qq_33808550
  • qq_33808550
  • 2016年07月27日 15:47
  • 633

python中list列表的高级应用 高级函数

在python所有的数据结构中,list具有重要地位,并且非常的方便,这篇文章主要是讲解list列表的高级应用,基础知识可以查看博客。 此文章为python英文文档的翻译版本,你也可以查看英文版。h...
  • Winterto1990
  • Winterto1990
  • 2015年08月17日 23:17
  • 3816

shell脚本高级技巧

shell 语句出错自动退出 许多人用shell脚本完成一些简单任务,而且变成了他们生命的一部分。不幸的是,shell脚本在运行异常时会受到非常大的影响。在写脚本时将这类问题最小化是十分必要的。本文...
  • andylauren
  • andylauren
  • 2017年04月03日 09:57
  • 460

JavaScript DOM 编程之高级篇

1.样式 ①判断是否支持css2样式 document.implementation.hasFeature("CSS2", "2.0"); ②访问元素之间的样式 a...
  • super_yang_android
  • super_yang_android
  • 2016年04月03日 15:01
  • 899

windows 下文件的高级操作

本文主要说明在Windows下操作文件的高级方法,比如直接读写磁盘,文件的异步操作,而文件普通的读写方式在网上可以找到一大堆资料,在这也就不再进行专门的说明。 判断文件是否存在 在Windows中...
  • lanuage
  • lanuage
  • 2017年06月11日 19:02
  • 483

MySQL学习笔记_10_MySQL高级操作(下)

MySQL高级操作(下) 五、MySQL预处理语句 1、设置预处理stmt,传递一个数据作为where的判断条件 prepare stmt from “select * from table_n...
  • hanqing280441589
  • hanqing280441589
  • 2014年03月01日 19:56
  • 2673

史上最全最强大VIM操作

简评:Vim编辑器在程序员界可谓无人不知,无人不晓,它功能强大,扩展性极高。小编就经常看到高手可以使用Vim熟练地对文本进行各种操作,那可以比鼠标点来点去快得多了。但想成为Vim高手可没那么简单,摆在...
  • zhongqi2513
  • zhongqi2513
  • 2017年03月28日 14:14
  • 553

Scala教程(十二)List操作高级进阶实战

List组成结构:数组由head tail两部分组成:head表示第一个元素,tail表示其它元素。 :::操作符:list与list之间进行连接符::: List的foldLeft、foldRigh...
  • yuan_xw
  • yuan_xw
  • 2015年10月13日 16:43
  • 1856

MySQL数据库高级操作

前面已经完成 索引 索引是一种单独的、存储在磁盘上的数据结构。使用索引可以快速查找某个或者多列中有 特定值得行。 创建索引: 1、可以在简历表的同时进行创建,如:...
  • xunixianshi123
  • xunixianshi123
  • 2014年07月24日 13:31
  • 239

MySQL数据库的数据高级操作(复习4)

数据操作: 增删改查新增数据基本语法 Insert into 表名 [(字段列表)] values (值列表);在数据插入的时候, 假设主键对应的值已经存在: 插入一定会失败!insert into...
  • simplebam
  • simplebam
  • 2017年03月09日 17:52
  • 162
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:RxRichEdit高级操作
举报原因:
原因补充:

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