本文整理自网络,侵删。
TStringBuilder,可以理解他为一个字符数组,但是具有一个String对象支持的所有功能,因此,可以把一个TStringBuilder对象理解为一个可以编辑的字符串。在Delphi XE4中明确说明:TStringBuilder完全与.NET framework的StringBuilder完全兼容,如此说,易博龙还真有把C#程序员要拉过来的想法,并且这个想法还是在2008年,让人佩服。跑题了...还是看看TStringBuilder的属性与方法:
1.Append:为StringBuilder增加内容.
这个方法重载了N多个版本,可以把任意类型的变量加入到SB中,该想到的都实现了。Delphi <wbr>TStringBuilder详解
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>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);//显示x123456789end;
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);//显示xxxxxx6789end;
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);//显示3end;
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的内容全部输出为一个Stringb.ToString(StartIndex:Integer;StrLength:Integer):string; 指定SB的一个位置开始,并指定长度,输出为String.
小结:通过查看TStringBuilder的代码,整体感觉就是对FData:TArrayChar的封装,并且是按.NET的StringBuilder来实现,能过提供的属性与方法,用以操作一个Char数组,达到象操作一个字符串一样。
来源:http://blog.sina.com.cn/s/blog_44fa172f0101n4zc.html
相关阅读 >>
更多相关阅读请进入《Delphi》频道 >>