RxRichEdit高级操作
2007-09-14 13:20
411 查看
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.
相关文章推荐
- RxRichEdit,Rich98插入图像完全解决方案[Delphi]!
- richedit 相关操作[c#为主]
- 快速对Memo或者RichEdit内的文字进行批量操作
- RxRichEdit中文支持BUG修正(1)
- Delphi,Rxlib,RxRichEdit,Richedit 高版本 ,Rich Text Edit Control, v4.1 控件,打印Bug
- 史上最简单的 MySQL 教程(二十一)「数据的高级操作 之 蠕虫复制」
- ldd3学习之十二(1):高级字符驱动程序操作--ioctl
- 使用RICHEDIT
- 分布式缓存技术redis学习系列(四)——redis高级应用(集群搭建、集群分区原理、集群操作)
- vim编辑器的高级操作用法:宏的录制与播放
- JavaScrip高级应用:操作模态与非模态对话框
- 8天学通MongoDB——第三天 细说高级操作
- svn执行update操作后出现:Error : Previous operation has not finished; run 'cleanup' if it was interrupted.
- RichEdit Friendly Name Hyperlinks
- JS-DOM操作应用高级(二)
- [转]Richedit使用大全
- MongoDB:详细解释mongodb的高级操作,聚合和游标
- 【Oracle】day04_子查询_分页查询_DECODE_排序_集合操作_高级分组
- IT超级畅销书作者、策划编辑高级培训班 开始招生
- Javascript基础_09DOM高级操作