转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> Delphi程序 >> 正文
活用 SetSelTextBuf         ★★★★

活用 SetSelTextBuf

作者:闵涛 文章来源:闵涛的学习笔记 点击数:953 更新时间:2009/4/23 18:24:06
  SetSelTextBuf 是 TCustomEdit 类及其子类的文本替换方法,原本用它来置换选定的数据,如我们最常用的 Replace 命令多半是由它来完成的。现在,我们把其延伸使用一下,看会有什么结果。我们先从 SetSelTextBuf 的定义开始:
  procedure SetSelTextBuf(Buffer: PChar);
  这里,SetSelTextBuf需要一个以空字符结尾字串,所以我们可以知道其后果肯定是一个块操作。在使用 SetSelTextBuf的时候,一般要配合 SelText 属性来确诊是否有文本块被选中,然后才进行下一步。当有被选择的文本对象时,SelText即是其内容,我们可以简单地修改 SelText 来达到目的,一旦被更改的对象比较庞大, SetSelTextBuf 就会被派上用途。我们试想一下,当没有选中或是SelText属性为空 ,这时调用 SetSelTextBuf 就会发生了什么:Buffer 里的东西被填进了当前光标所在的位置。果真如此。这样一来,对于可以格式化的数据流(文本),利用 SetSelTextBuf 就能大大增强 TCustomEdit类的编辑能力,最起码对于文本的 Insert, Append 就不费多大的气力就容易搞定,尽管 TCustomEdit 类没有提供这样的函数和方法。
下面就来说说这种 Insert 与 Append 如何实现。
  Append 对我们来说比较容易,把光标移到文本后,调用 SetSelTextBbuf 即可。而 移动光标最笨最直接的方法就是追加一空字符或空行,然后再将它删了,这在TCustom-Edit 类中简直就是举手之劳。Insert 要相对复杂一些。只要完成了光标的移动,那么在任何地方的插入就容易多了(SetSelTextBuf)。从 TCustomEdit 的定义中我们了解到有一个 SetSelStart 的方法起定义为:
   procedure SetSelStart(Value: Integer); virtual;
  本身是个虚方法,具体实现是在子类。它仅仅是发送了一个 EM_SETSEL 消息给编辑控件(当前获得焦点的对象), 把光标移到了需要编辑的地方(开始选择之处),对任何文本都不例外,如把上面的移动‘追加一空字符或空行,然后删除’换成这种方法。学会了移动,还得控制选择的范围为0,这样才能插入。接下来就是:
   procedure SetSelLength(Value: Integer); virtual;
  这也是个虚方法。不过顾名思义,应该知道它是控制选择长度的函数。这下大家明白该怎么做了吧。最后应该注意的是在各个TCustomEdit子类中,针对不同的构件函数的实现,操作方法应有所不同,如 TEdit、TMemo(无 SetSelStart)、 TRichEdit...。最后是一简单的例子。


...

type

TForm1 = class(TForm)
...
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
Button3: TButton;
...

private

{ Private declarations }

public

{ Public declarations }

end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin

//清空 Memo1
Memo1.Clear;
//在未载入任何内容时,禁止使用 Append、Insert
Button2.Enabled := False;
Button3.Enabled := False;
...

end;

//装载任意文本文件
procedure TForm1.Button1Click(Sender: TObject);
begin
...

Memo1.Lines.LoadFromFile( OpenDialog1.FileName );
Caption := Hint + 调入: + OpenDialog1.FileName;
Button2.Enabled := True;
Button3.Enabled := True;
...

end;

//在文件头插入
procedure TForm1.Button2Click(Sender: TObject);
Var
SWA : TMemoryStream; //建立临时交换内存镜象
CNULL : char; //空字符
begin

SWA := NIL;
CNULL := #0;
...
//初始化内存流
SWA := TMemoryStream.Create;
//加载要插入的文件
SWA.LoadFromFile( OpenDialog1.FileName );
//把指针移到流尾,以 #0 结尾,
SWA.Seek(0, soFromEnd);
SWA.Write( CNULL, 1);
//再移到头
SWA.Seek( 0, soFromBeginning );
//插入偏移量为 0
Memo1.SelStart := 0;
Memo1.SetSelTextBuf(SWA.Memory);
....

end;

procedure TForm1.Button3Click(Sender: TObject);
Var
SWA : TMemoryStream;
CNULL : char; //空字符
begin

SWA := NIL;
CNULL := #0;
...
//初始化内存流
SWA := TMemoryStream.Create;
//加载要追加的文件
SWA.LoadFromFile( OpenDialog1.FileName );
//把指针移到流尾,以 #0 结尾,
SWA.Seek(0, soFromEnd);
SWA.Write( CNULL, 1);
//再移到头
SWA.Seek( 0, soFromBeginning );
//把 Memo1 的指针移到 Memo1 尾部
Memo1.Lines.Add();
Memo1.Lines.Delete( Memo1.Lines.Count -1 );
//追加
Memo1.SetSelTextBuf(SWA.Memory);
...

end;
....


没有相关教程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台