注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

鑫淼梦园的博客

圆你的梦想 从这里开始

 
 
 

日志

 
 

Delphi XE4 TStringBuilder详解  

2013-09-07 12:04:14|  分类: delphi xe4 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
TStringBuilder,可以理解他为一个字符数组,但是具有一个String对象支持的所有功能,因此,可以把一个TStringBuilder对象理解为一个可以编辑的字符串。在Delphi XE4中明确说明:TStringBuilder完全与.NET framework的StringBuilder完全兼容,如此说,易博龙还真有把C#程序员要拉过来的想法,并且这个想法还是在2008年,让人佩服。跑题了...
还是看看TStringBuilder的属性与方法:

1.Append:为StringBuilder增加内容.

这个方法重载了N多个版本,可以把任意类型的变量加入到SB中,该想到的都实现了。


2.AppendFormat:加一个格式化的字符串

例如:
var
  sb:TStringBuilder;
Begin
  sb:=TStringBuilder.Create;
  sb.AppendFormat('%d times', [1000]);
  showmessage(sb.ToString);//显示1000

3.AppendLine:加入一个换行符
例:
  sb.Append('我是中国人')
     .AppendLine()
     .Append('我爱中国.');

Delphi <wbr>XE4 <wbr>TStringBuilder详解

4.CopyTo:将StringBuilder指定部分的字符复制到TCharArray类型的变量中,同时,将目标实例中对应的字符替换掉。
参数说明:
SourceIndex:StringBuilder指定的起始位置,位置从0开始;
Destination:复制到的目标实例,类型为TCharArray;
DestionationIndex:目标实例的起启位置,位置也从0开始;
Count:复制字符数

例:
procedure TForm1.Button1Click(Sender: TObject);
var
  sb:TStringBuilder;
  ca:TCharArray;
begin
  SetLength(ca,5);//初始化长度
  sb:=TStringBuilder.Create;

  sb.Append('0123456789');

  sb.CopyTo(1,ca,0,5);//把12345复制到ca中

  sb.Clear;//清空sb
  sb.Append(ca);
  ShowMessage(sb.ToString); //显示12345

end;

5.EnsureCapacity:设置SB的大小
参数:
aCapacity:要重新设置SB新的长度的值,当设置的值大于StringBuilder的Capacity值时,再分配内存给SB.
返回值:
返回SB新的长度值。

6.Equals:比较两个StringBuilder是否相等
实际比较的是两个SB中Chars,Length及MaxCapacity三个属性值是否相同。(注:文档中说是Chars,Capacity及MaxCapacity三个属性是错误的)。
列:
procedure TForm1.Button2Click(Sender: TObject);
var
 sb1,sb2:TStringBuilder;
begin
 sb1:=TStringBuilder.Create;
 sb2:=TStringBuilder.Create;
 sb1.Append('0123456789');
 sb2.Append('0123456789');
 if sb1.Equals(sb2) then
   ShowMessage('相等');//这个对话框会显示

 //sb1.EnsureCapacity(20);
 sb1.Capacity:=20;//增加sb1的长度
 if not sb1.Equals(sb2) then
   ShowMessage('不相等');//这个不显示

 sb1.Length:=20;
 if not sb1.Equals(sb2) then
   ShowMessage('不相等');//这个显示对话框

end;

最后看一下源码,就是比较的SB的Length,MaxCapacity及Chars三个属性:
FData保存SB的Chars值,是一个TArrayChar类型。

function TStringBuilder.Equals(StringBuilder: TStringBuilder): Boolean;
begin
  Result := (StringBuilder <> nil) and (Length = StringBuilder.Length) and
    (MaxCapacity = StringBuilder.MaxCapacity) and
    CompareMem(@FData[0], @StringBuilder.FData[0], Length * SizeOf(Char));
end;

7.Insert:向StringBuilder的指定位置插入新的值,这个方法重载了多个版本,支持各种数据类型。

8.Remove:删除

9.Replace:将SB的内容中指定的值替换为新值,重载了四个版本:
function Replace(const OldChar: Char; const NewChar: Char): TStringBuilder; overload;
替换一个特定的字符
例:
procedure TForm1.Button3Click(Sender: TObject);
var
  sb:TStringBuilder;
begin
  sb:=TStringBuilder.Create;
  sb.Append('01234567890');
  sb.Replace('0','x');
  ShowMessage(sb.ToString);//显示x123456789
end;

function Replace(const OldValue: string; const NewValue: string): TStringBuilder; overload; 
替换指定的字符串

procedure TForm1.Button3Click(Sender: TObject);
var
  sb:TStringBuilder;
begin
  sb:=TStringBuilder.Create;
  sb.Append('01234567890');
  sb.Replace('012345','xxxxxx');
  ShowMessage(sb.ToString);//显示xxxxxx6789
end;

function Replace(const OldChar: Char; const NewChar: Char; StartIndex: Integer; Count: Integer):TStringBuilder; overload; 
从指定位置开始替换特定的字符
function Replace(const OldValue: string; const NewValue: string; StartIndex: Integer; Count:Integer): TStringBuilder; overload;
从指定位置开始替换特定的字符串
10.Capacity:设置SB的长度,这个属性会分配内存,但不会改变Length的值(没明白为什么不改变)

11.Chars:读取一个字符,实际上就是读取内部FData的指定字符,FData的类型为TArrayChar.
例:
procedure TForm1.Button4Click(Sender: TObject);
var
  sb:TStringBuilder;
  i:Integer;
begin
  sb:=TStringBuilder.Create;
  sb.Append('中国人');
  for i := 0 to sb.Length-1 do
    ShowMessage(sb.Chars[i]);//显示三次,每次显示一个汉字

  ShowMessage(sb.Length.ToString);//显示3
end;

12.Length:重新设置SB的长度,这个属性会分配内存,也会改变Capacity的值。所以,建议用Length来设置Sb的大小。
当设置的长度小时SB内部的字符数组(内部的FData)的长度时,自动截取FData;
  sb.Append('01234567890');
  sb.Length:=2;
  ShowMessage(sb.ToString);//显示01
注:delphi help中说如果给定的Length大于SB内部的字符数组长度时,分配内存再用空格填充。经查是错误的说法。查看代码,只是对内部的FData重新分配了长度。

13.MaxCapacity:最大长度,默认值为MaxInt 值为:$7FFFFFFF

14.ToString:将SB转换为String。重载了两个版本:
a.ToString:string; 无参数,将SB的内容全部输出为一个String
b.ToString(StartIndex:Integer;StrLength:Integer):string; 指定SB的一个位置开始,并指定长度,输出为String.

小结:通过查看TStringBuilder的代码,整体感觉就是对FData:TArrayChar的封装,并且是按.NET的StringBuilder来实现,能过提供的属性与方法,用以操作一个Char数组,达到象操作一个字符串一样。

  评论这张
 
阅读(456)| 评论(3)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017