Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16495364
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 20:46:51

下载本文示例代码
p>  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; .... p>  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; .... 下载本文示例代码


活用 SetSelTextBuf活用 SetSelTextBuf活用 SetSelTextBuf活用 SetSelTextBuf活用 SetSelTextBuf活用 SetSelTextBuf活用 SetSelTextBuf活用 SetSelTextBuf活用 SetSelTextBuf活用 SetSelTextBuf活用 SetSelTextBuf活用 SetSelTextBuf活用 SetSelTextBuf活用 SetSelTextBuf活用 SetSelTextBuf
阅读(207) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~