还是看看TStringBuilder的属性与方法:
1.Append:为StringBuilder增加内容.
这个方法重载了N多个版本,可以把任意类型的变量加入到SB中,该想到的都实现了。
2.AppendFormat:加一个格式化的字符串
例如:
var
sb:TStringBuilder;
Begin
sb:=TStringBuilder.Create;
sb.AppendFormat('%dtimes',[1000]);
showmessage(sb.ToString);//显示1000
3.AppendLine:加入一个换行符
例:
sb.Append('我是中国人')
.AppendLine()
.Append('我爱中国.');
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;10.Capacity:设置SB的长度,这个属性会分配内存,但不会改变Length的值(没明白为什么不改变)
替换一个特定的字符
例:
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;
从指定位置开始替换特定的字符串
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
注:delphihelp中说如果给定的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数组,达到象操作一个字符串一样。