TstringBuilder Delphi2007版
2010中的StringBuilder对象用的比较爽快!于是稍作了一些修改(增加了几个函数和属性)然后移植到D2007中来使用了!效果不错,共享一下!
- unit DxStringBuilder;
- interface
- uses RTLConsts,Classes,SysUtils;
- type
- EExternal = class(Exception)
- public
- {$IFDEF MSWINDOWS}
- ExceptionRecord: PExceptionRecord platform;
- {$ENDIF}
- {$IF defined(LINUX) or defined(MACOSX)}
- ExceptionAddress: LongWord platform;
- AccessAddress: LongWord platform;
- SignalNumber: Integer platform;
- {$IFEND LINUX or MACOSX}
- end;
- EIntError = class(EExternal);
- ERangeError = class(EIntError);
- TCharArray = array of Char;
- TStringBuilder = class
- private
- const DefaultCapacity = $10;
- function GetCapacity: Integer;
- procedure SetCapacity(const Value: Integer);
- function GetLength: Integer;
- procedure Set_Length(const Value: Integer);
- function GetMaxCapacity: Integer;
- procedure ReduceCapacity;
- procedure ExpandCapacity;
- procedure CheckBounds(Index: Integer);
- function _Replace(Index: Integer; const Old, New: string): Boolean;
- function GetChars(index: Integer): Char;
- procedure SetChars(index: Integer; const Value: Char);
- protected
- FData: TCharArray;
- FLength: Integer;
- FMaxCapacity: Integer;
- public
- constructor Create; overload;
- constructor Create(aCapacity: Integer); overload;
- constructor Create(const Value: string); overload;
- function Append(const Value: Boolean): TStringBuilder; overload;
- function Append(const Value: Byte): TStringBuilder; overload;
- function Append(const Value: Char): TStringBuilder; overload;
- function Append(const Value: Currency): TStringBuilder; overload;
- function Append(const Value: Double): TStringBuilder; overload;
- function Append(const Value: Smallint): TStringBuilder; overload;
- function Append(const Value: Integer): TStringBuilder; overload;
- function Append(const Value: Int64): TStringBuilder; overload;
- function Append(const Value: TObject): TStringBuilder; overload;
- function Append(const Value: Shortint): TStringBuilder; overload;
- function Append(const Value: Single): TStringBuilder; overload;
- function Append(const Value: string): TStringBuilder; overload;
- function Append(const Value: UInt64): TStringBuilder; overload;
- function Append(const Value: TCharArray): TStringBuilder; overload;
- function Append(const Value: Word): TStringBuilder; overload;
- function Append(const Value: Cardinal): TStringBuilder; overload;
- function Append(const Value: Char; RepeatCount: Integer): TStringBuilder; overload;
- function Append(const Value: TCharArray; StartIndex: Integer; CharCount: Integer): TStringBuilder; overload;
- function Append(const Value: string; StartIndex: Integer; Count: Integer): TStringBuilder; overload;
- function AppendFormat(const Format: string; const Args: array of const): TStringBuilder; overload;
- function AppendLine: TStringBuilder; overload;
- function AppendLine(const Value: string): TStringBuilder; overload;
- procedure Clear;
- procedure CopyTo(SourceIndex: Integer; const Destination: TCharArray; DestinationIndex: Integer; Count: Integer);
- function EnsureCapacity(aCapacity: Integer): Integer;
- function Equals(StringBuilder: TStringBuilder): Boolean; reintroduce;
- function Insert(Index: Integer; const Value: Boolean): TStringBuilder; overload;
- function Insert(Index: Integer; const Value: Byte): TStringBuilder; overload;
- function Insert(Index: Integer; const Value: Char): TStringBuilder; overload;
- function Insert(Index: Integer; const Value: Currency): TStringBuilder; overload;
- function Insert(Index: Integer; const Value: Double): TStringBuilder; overload;
- function Insert(Index: Integer; const Value: Smallint): TStringBuilder; overload;
- function Insert(Index: Integer; const Value: Integer): TStringBuilder; overload;
- function Insert(Index: Integer; const Value: TCharArray): TStringBuilder; overload;
- function Insert(Index: Integer; const Value: Int64): TStringBuilder; overload;
- function Insert(Index: Integer; const Value: TObject): TStringBuilder; overload;
- function Insert(Index: Integer; const Value: Shortint): TStringBuilder; overload;
- function Insert(Index: Integer; const Value: Single): TStringBuilder; overload;
- function Insert(Index: Integer; const Value: string): TStringBuilder; overload;
- function Insert(Index: Integer; const Value: Word): TStringBuilder; overload;
- function Insert(Index: Integer; const Value: Cardinal): TStringBuilder; overload;
- function Insert(Index: Integer; const Value: UInt64): TStringBuilder; overload;
- function Insert(Index: Integer; const Value: string; count: Integer): TStringBuilder; overload;
- function Insert(Index: Integer; const Value: TCharArray; startIndex: Integer; charCount: Integer): TStringBuilder; overload;
- function Remove(StartIndex: Integer; RemLength: Integer): TStringBuilder;
- function Replace(const OldChar: Char; const NewChar: Char): TStringBuilder; overload;
- function Replace(const OldValue: string; const NewValue: string): TStringBuilder; overload;
- 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;
- function ToString: string; overload;
- function ToString(StartIndex: Integer; StrLength: Integer): string; reintroduce; overload;
- procedure SaveToStream(Stream: TStream);
- procedure SaveToFile(FileName: string);
- procedure LoadFromStream(Stream: TStream);
- procedure LoadFromFile(FileName: string);
- property Capacity: Integer read GetCapacity write SetCapacity;
- property Chars[index: Integer]: Char read GetChars write SetChars; default;
- property Length: Integer read GetLength write Set_Length;
- property MaxCapacity: Integer read GetMaxCapacity;
- end;
- function UIntToStr(Value: Cardinal): string; overload;
- function UIntToStr(Value: UInt64): string; overload;
- resourcestring
- SParamIsNegative = 'Parameter %s cannot be a negative value';
- SInputBufferExceed = 'Input buffer exceeded for %s = %d, %s = %d';
- implementation
- function UIntToStr(Value: Cardinal): string;
- begin
- FmtStr(Result, '%u', [Value]);
- end;
- function UIntToStr(Value: UInt64): string;
- begin
- FmtStr(Result, '%u', [Value]);
- end;
- { TStringBuilder }
- constructor TStringBuilder.Create;
- begin
- inherited Create;
- FMaxCapacity := MaxInt;
- Capacity := DefaultCapacity;
- FLength := 0;
- end;
- constructor TStringBuilder.Create(aCapacity: Integer);
- begin
- inherited Create;
- FMaxCapacity := MaxInt;
- Capacity := aCapacity;
- FLength := 0;
- end;
- function TStringBuilder.Append(const Value: string): TStringBuilder;
- begin
- Length := Length + System.Length(Value);
- Move(PChar(Value)^, FData[Length - System.Length(Value)], System.Length(Value) * SizeOf(Char));
- Result := self;
- end;
- function TStringBuilder.Append(const Value: Currency): TStringBuilder;
- begin
- Append(CurrToStr(Value));
- Result := Self;
- end;
- function TStringBuilder.Append(const Value: Double): TStringBuilder;
- begin
- Append(FloatToStr(Value));
- Result := Self;
- end;
- function TStringBuilder.Append(const Value: Char): TStringBuilder;
- begin
- Length := Length + 1;
- FData[Length - 1] := Value;
- Result := Self;
- end;
- function TStringBuilder.Append(const Value: Boolean): TStringBuilder;
- begin
- Append(BoolToStr(Value, True));
- Result := Self;
- end;
- function TStringBuilder.Append(const Value: Byte): TStringBuilder;
- begin
- Append(IntToStr(Value));
- Result := Self;
- end;
- function TStringBuilder.Append(const Value: Smallint): TStringBuilder;
- begin
- Append(IntToStr(Value));
- Result := Self;
- end;
- function TStringBuilder.Append(const Value: Shortint): TStringBuilder;
- begin
- Append(IntToStr(Value));
- Result := Self;
- end;
- function TStringBuilder.Append(const Value: Single): TStringBuilder;
- begin
- Append(FloatToStr(Value));
- Result := self;
- end;
- function TStringBuilder.Append(const Value: TObject): TStringBuilder;
- begin
- {$if CompilerVersion >= 19}
- Append(Value.ToString());
- {$else}
- if Value.InheritsFrom(TComponent) then
- Append(TComponent(Value).Name+': '+Value.ClassName)
- else Append(Value.ClassName);
- {$ifend}
- Result := Self;
- end;
- function TStringBuilder.Append(const Value: Integer): TStringBuilder;
- begin
- Append(IntToStr(Value));
- Result := Self;
- end;
- function TStringBuilder.Append(const Value: Int64): TStringBuilder;
- begin
- Append(IntToStr(Value));
- Result := Self;
- end;
- procedure TStringBuilder.CheckBounds(Index: Integer);
- begin
- if Cardinal(Index) >= Cardinal(Length) then
- raise ERangeError.CreateResFmt(@SListIndexError, [Index]);
- end;
- procedure TStringBuilder.Clear;
- begin
- Length := 0;
- Capacity := DefaultCapacity;
- end;
- procedure TStringBuilder.CopyTo(SourceIndex: Integer;
- const Destination: TCharArray; DestinationIndex, Count: Integer);
- begin
- if Count < 0 then
- raise ERangeError.CreateResFmt(@SParamIsNegative, ['Count']); // DO NOT LOCALIZE
- if DestinationIndex < 0 then
- raise ERangeError.CreateResFmt(@SParamIsNegative, ['DestinationIndex']); // DO NOT LOCALIZE
- if DestinationIndex + Count > System.Length(Destination) then
- raise ERangeError.CreateResFmt(@SInputBufferExceed,
- ['DestinationIndex', DestinationIndex, 'Count', Count]);
- if Count > 0 then
- begin
- CheckBounds(SourceIndex);
- CheckBounds(SourceIndex + Count - 1);
- Move(FData[SourceIndex], Destination[DestinationIndex], Count * SizeOf(Char));
- end;
- end;
- constructor TStringBuilder.Create(const Value: string);
- begin
- Create;
- Append(Value);
- end;
- function TStringBuilder.EnsureCapacity(aCapacity: Integer): Integer;
- begin
- if Cardinal(aCapacity) > Cardinal(MaxCapacity) then
- raise ERangeError.CreateResFmt(@SListIndexError, [aCapacity]);
- if Capacity < aCapacity then
- Capacity := aCapacity;
- Result := Capacity;
- end;
- 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;
- procedure TStringBuilder.ExpandCapacity;
- var
- NewCapacity: Integer;
- begin
- NewCapacity := Capacity * 2;
- if Length > NewCapacity then
- NewCapacity := Length * 2; // this line may overflow NewCapacity to a negative value
- if NewCapacity > MaxCapacity then
- NewCapacity := MaxCapacity;
- if NewCapacity < 0 then // if NewCapacity has been overflowed
- NewCapacity := Length;
- Capacity := NewCapacity;
- end;
- function TStringBuilder.GetCapacity: Integer;
- begin
- Result := System.Length(FData);
- end;
- function TStringBuilder.GetChars(index: Integer): Char;
- begin
- if Index < 0 then
- raise ERangeError.CreateResFmt(@SParamIsNegative, ['Index']); // DO NOT LOCALIZE
- CheckBounds(Index);
- Result := FData[Index];
- end;
- function TStringBuilder.GetLength: Integer;
- begin
- Result := FLength;
- end;
- function TStringBuilder.GetMaxCapacity: Integer;
- begin
- Result := FMaxCapacity;
- end;
- function TStringBuilder.Insert(Index: Integer;
- const Value: Integer): TStringBuilder;
- begin
- Insert(Index, IntToStr(Value));
- Result := Self;
- end;
- function TStringBuilder.Insert(Index: Integer;
- const Value: Smallint): TStringBuilder;
- begin
- Insert(Index, IntToStr(Value));
- Result := Self;
- end;
- function TStringBuilder.Insert(Index: Integer;
- const Value: Int64): TStringBuilder;
- begin
- Insert(Index, IntToStr(Value));
- Result := Self;
- end;
- function TStringBuilder.Insert(Index: Integer;
- const Value: TCharArray): TStringBuilder;
- begin
- if Index < 0 then
- raise ERangeError.CreateResFmt(@SParamIsNegative, ['Index']); // DO NOT LOCALIZE
- if Index > Length then
- raise ERangeError.CreateResFmt(@SListIndexError, [Index]);
- Length := Length + System.Length(Value);
- Move(FData[Index], FData[Index + System.Length(Value)], System.Length(Value) * SizeOf(Char));
- Move(Value[0], FData[Index], System.Length(Value) * SizeOf(Char));
- Result := Self;
- end;
- function TStringBuilder.Insert(Index: Integer;
- const Value: Double): TStringBuilder;
- begin
- Insert(Index, FloatToStr(Value));
- Result := Self;
- end;
- function TStringBuilder.Insert(Index: Integer;
- const Value: Byte): TStringBuilder;
- begin
- Insert(Index, IntToStr(Value));
- Result := Self;
- end;
- function TStringBuilder.Insert(Index: Integer;
- const Value: Boolean): TStringBuilder;
- begin
- Insert(Index, BoolToStr(Value, True));
- Result := Self;
- end;
- function TStringBuilder.Insert(Index: Integer;
- const Value: Currency): TStringBuilder;
- begin
- Insert(Index, CurrToStr(Value));
- Result := Self;
- end;
- function TStringBuilder.Insert(Index: Integer;
- const Value: Char): TStringBuilder;
- begin
- if Index < 0 then
- raise ERangeError.CreateResFmt(@SParamIsNegative, ['Index']); // DO NOT LOCALIZE
- if Index > Length then
- raise ERangeError.CreateResFmt(@SListIndexError, [Index]);
- Length := Length + 1;
- Move(FData[Index], FData[Index + 1], (Length - Index - 1) * SizeOf(Char));
- FData[Index] := Value;
- Result := Self;
- end;
- function TStringBuilder.Insert(Index: Integer;
- const Value: UInt64): TStringBuilder;
- begin
- Insert(Index, IntToStr(Value));
- Result := self;
- end;
- function TStringBuilder.Insert(Index: Integer;
- const Value: Cardinal): TStringBuilder;
- begin
- Insert(Index, IntToStr(Value));
- Result := self;
- end;
- function TStringBuilder.Insert(Index: Integer; const Value: TCharArray;
- startIndex, charCount: Integer): TStringBuilder;
- begin
- if Index - 1 >= Length then
- raise ERangeError.CreateResFmt(@SListIndexError, [Index])
- else if Index < 0 then
- raise ERangeError.CreateResFmt(@SListIndexError, [Index]);
- if StartIndex < 0 then
- raise ERangeError.CreateResFmt(@SParamIsNegative, ['StartIndex']); // DO NOT LOCALIZE
- if CharCount < 0 then
- raise ERangeError.CreateResFmt(@SParamIsNegative, ['CharCount']); // DO NOT LOCALIZE
- if StartIndex + CharCount > System.Length(Value) then
- raise ERangeError.CreateResFmt(@SInputBufferExceed,
- ['StartIndex', StartIndex, 'CharCount', CharCount]);
- Length := Length + CharCount;
- if Length - Index > 0 then
- Move(FData[Index], FData[Index + CharCount], (Length - Index) * SizeOf(Char));
- Move(Value[StartIndex], FData[Index], CharCount * SizeOf(Char));
- Result := Self;
- end;
- procedure TStringBuilder.LoadFromFile(FileName: string);
- var
- F: TFileStream;
- begin
- F := TFileStream.Create(FileName,fmOpenRead);
- LoadFromStream(F);
- F.Free;
- end;
- procedure TStringBuilder.LoadFromStream(Stream: TStream);
- begin
- Capacity := Stream.Size;
- Stream.Position := 0;
- Stream.ReadBuffer(FData[0],Stream.Size);
- Length := Stream.Size;
- end;
- procedure TStringBuilder.ReduceCapacity;
- var
- NewCapacity: Integer;
- begin
- if Length > Capacity div 4 then
- Exit;
- NewCapacity := Capacity div 2;
- if NewCapacity < Length then
- NewCapacity := Length;
- Capacity := NewCapacity;
- end;
- function TStringBuilder.Remove(StartIndex, RemLength: Integer): TStringBuilder;
- begin
- if RemLength <> 0 then
- begin
- if StartIndex < 0 then
- raise ERangeError.CreateResFmt(@SParamIsNegative, ['StartIndex']); // DO NOT LOCALIZE
- if RemLength < 0 then
- raise ERangeError.CreateResFmt(@SParamIsNegative, ['RemLength']); // DO NOT LOCALIZE
- CheckBounds(StartIndex);
- CheckBounds(StartIndex + RemLength - 1);
- if (Length - (StartIndex + RemLength)) > 0 then
- Move(FData[StartIndex + RemLength], FData[StartIndex], (Length - (StartIndex + RemLength)) * SizeOf(Char));
- Length := Length - RemLength;
- ReduceCapacity;
- end;
- Result := Self;
- end;
- function TStringBuilder.Replace(const OldValue,
- NewValue: string): TStringBuilder;
- begin
- Result := self;
- Replace(OldValue, NewValue, 0, Length);
- end;
- function TStringBuilder.Replace(const OldChar, NewChar: Char): TStringBuilder;
- var
- Ptr: PChar;
- EndPtr: PChar;
- begin
- EndPtr := @FData[Length - 1];
- Ptr := @FData[0];
- while Ptr <= EndPtr do
- begin
- if Ptr^ = OldChar then
- Ptr^ := NewChar;
- Inc(Ptr);
- end;
- Result := Self;
- end;
- function TStringBuilder.Replace(const OldValue, NewValue: string; StartIndex,
- Count: Integer): TStringBuilder;
- var
- CurPtr: PChar;
- EndPtr: PChar;
- Index: Integer;
- EndIndex: Integer;
- oldLen, newLen: Integer;
- begin
- Result := Self;
- if Count <> 0 then
- begin
- if StartIndex < 0 then
- raise ERangeError.CreateResFmt(@SParamIsNegative, ['StartIndex']); // DO NOT LOCALIZE
- if Count < 0 then
- raise ERangeError.CreateResFmt(@SParamIsNegative, ['Count']); // DO NOT LOCALIZE
- if StartIndex + Count > Length then
- raise ERangeError.CreateResFmt(@SInputBufferExceed,
- ['StartIndex', StartIndex, 'Count', Count]);
- oldLen := System.Length(OldValue);
- newLen := System.Length(NewValue);
- Index := StartIndex;
- CurPtr := @FData[StartIndex];
- EndIndex := StartIndex + Count - oldLen;
- EndPtr := @FData[EndIndex];
- while CurPtr <= EndPtr do
- begin
- if CurPtr^ = OldValue[1] then
- begin
- if StrLComp(CurPtr, PChar(OldValue), oldLen) = 0 then
- begin
- if _Replace(Index, OldValue, NewValue) then
- begin
- CurPtr := @FData[Index];
- EndPtr := @FData[EndIndex];
- end;
- Inc(CurPtr, newLen - 1);
- Inc(Index, newLen - 1);
- Inc(EndPtr, newLen - oldLen);
- Inc(EndIndex, newLen - oldLen);
- end;
- end;
- Inc(CurPtr);
- Inc(Index);
- end;
- end;
- end;
- function TStringBuilder.Replace(const OldChar, NewChar: Char; StartIndex,
- Count: Integer): TStringBuilder;
- var
- Ptr: PChar;
- EndPtr: PChar;
- begin
- if Count <> 0 then
- begin
- if StartIndex < 0 then
- raise ERangeError.CreateResFmt(@SParamIsNegative, ['StartIndex']); // DO NOT LOCALIZE
- if Count < 0 then
- raise ERangeError.CreateResFmt(@SParamIsNegative, ['Count']); // DO NOT LOCALIZE
- CheckBounds(StartIndex);
- CheckBounds(StartIndex + Count - 1);
- EndPtr := @FData[StartIndex + Count - 1];
- Ptr := @FData[StartIndex];
- while Ptr <= EndPtr do
- begin
- if Ptr^ = OldChar then
- Ptr^ := NewChar;
- Inc(Ptr);
- end;
- end;
- Result := Self;
- end;
- function TStringBuilder.Insert(Index: Integer; const Value: string;
- count: Integer): TStringBuilder;
- var
- I: Integer;
- begin
- for I := 0 to Count - 1 do
- Insert(Index, Value);
- Result := Self;
- end;
- function TStringBuilder.Insert(Index: Integer;
- const Value: Word): TStringBuilder;
- begin
- Insert(Index, IntToStr(Value));
- Result := Self;
- end;
- function TStringBuilder.Insert(Index: Integer;
- const Value: Shortint): TStringBuilder;
- begin
- Insert(Index, IntToStr(Value));
- Result := Self;
- end;
- function TStringBuilder.Insert(Index: Integer;
- const Value: TObject): TStringBuilder;
- begin
- {$if CompilerVersion >= 19}
- Insert(Index, Value.ToString());
- {$else}
- Insert(Index, IntToStr(Integer(Value)));
- {$ifend}
- Result := Self;
- end;
- function TStringBuilder.Insert(Index: Integer;
- const Value: string): TStringBuilder;
- begin
- if Index < 0 then
- raise ERangeError.CreateResFmt(@SParamIsNegative, ['Index']); // DO NOT LOCALIZE
- if Index > Length then
- raise ERangeError.CreateResFmt(@SListIndexError, [Index]);
- Length := Length + System.Length(Value);
- Move(FData[Index], FData[Index + System.Length(Value)], (Length - System.Length(Value) - Index) * SizeOf(Char));
- Move(Value[1], FData[Index], System.Length(Value) * SizeOf(Char));
- Result := Self;
- end;
- function TStringBuilder.Insert(Index: Integer;
- const Value: Single): TStringBuilder;
- begin
- Insert(Index, FloatToStr(Value));
- Result := Self;
- end;
- procedure TStringBuilder.SaveToFile(FileName: string);
- var
- FileStream: TFileStream;
- begin
- FileStream := TFileStream.Create(FileName,fmOpenWrite);
- SaveToStream(FileStream);
- FileStream.Free;
- end;
- procedure TStringBuilder.SaveToStream(Stream: TStream);
- begin
- Stream.WriteBuffer(FData[0],Length * SizeOf(Char));
- end;
- procedure TStringBuilder.SetCapacity(const Value: Integer);
- begin
- if Value < Length then
- raise ERangeError.CreateResFmt(@SListCapacityError, [Value]);
- if Value > FMaxCapacity then
- raise ERangeError.CreateResFmt(@SListCapacityError, [Value]);
- SetLength(FData, Value);
- end;
- procedure TStringBuilder.SetChars(index: Integer; const Value: Char);
- begin
- if Index < 0 then
- raise ERangeError.CreateResFmt(@SParamIsNegative, ['Index']); // DO NOT LOCALIZE
- CheckBounds(Index);
- FData[Index] := Value;
- end;
- procedure TStringBuilder.Set_Length(const Value: Integer);
- var
- LOldLength: Integer;
- begin
- if Value < 0 then
- raise ERangeError.CreateResFmt(@SParamIsNegative, ['Value']); // DO NOT LOCALIZE
- if Value > MaxCapacity then
- raise ERangeError.CreateResFmt(@SListCapacityError, [Value]);
- LOldLength := FLength;
- try
- FLength := Value;
- if FLength > Capacity then
- ExpandCapacity;
- except
- on E: EOutOfMemory do
- FLength := LOldLength;
- end;
- end;
- function TStringBuilder.ToString: string;
- begin
- SetLength(Result, Length);
- Move(FData[0], Result[1], Length * SizeOf(Char));
- end;
- function TStringBuilder.ToString(StartIndex, StrLength: Integer): string;
- begin
- if StrLength <> 0 then
- begin
- if StartIndex < 0 then
- raise ERangeError.CreateResFmt(@SParamIsNegative, ['StartIndex']); // DO NOT LOCALIZE
- if StrLength < 0 then
- raise ERangeError.CreateResFmt(@SParamIsNegative, ['StrLength']); // DO NOT LOCALIZE
- CheckBounds(StartIndex);
- CheckBounds(StartIndex + StrLength - 1);
- SetLength(Result, StrLength);
- Move(FData[StartIndex], Result[1], StrLength * SizeOf(Char));
- end
- else Result := '';
- end;
- function TStringBuilder._Replace(Index: Integer; const Old,
- New: string): Boolean;
- var
- OldCapacity: Integer;
- SizeChange: Integer;
- begin
- Result := False;
- SizeChange := System.Length(New) - System.Length(Old);
- if SizeChange = 0 then
- begin
- Move(New[1], FData[Index], System.Length(New) * SizeOf(Char));
- end
- else
- begin
- if SizeChange > 0 then
- begin
- OldCapacity := Capacity;
- Length := Length + SizeChange;
- if OldCapacity <> Capacity then
- Result := True;
- end;
- Move(FData[Index + System.Length(Old)], FData[Index + System.Length(New)], (Length - (System.Length(Old) + Index)) * SizeOf(Char));
- Move(New[1], FData[Index], System.Length(New) * SizeOf(Char));
- if SizeChange < 0 then
- Length := Length + SizeChange;
- end;
- end;
- function TStringBuilder.Append(const Value: Word): TStringBuilder;
- begin
- Append(IntToStr(Value));
- Result := self;
- end;
- function TStringBuilder.Append(const Value: TCharArray): TStringBuilder;
- var
- I: Integer;
- begin
- Result := self;
- for I := 0 to System.Length(Value) - 1 do
- if Value[I] = #0 then
- Break;
- Append(Value, 0, I);
- end;
- function TStringBuilder.Append(const Value: UInt64): TStringBuilder;
- begin
- Append(UIntToStr(Value));
- Result := self;
- end;
- function TStringBuilder.Append(const Value: Cardinal): TStringBuilder;
- begin
- Append(UIntToStr(Value));
- Result := self;
- end;
- function TStringBuilder.Append(const Value: string; StartIndex,
- Count: Integer): TStringBuilder;
- begin
- if StartIndex + Count > System.Length(Value) then
- raise ERangeError.CreateResFmt(@SListIndexError, [StartIndex]);
- if StartIndex < 0 then
- raise ERangeError.CreateResFmt(@SListIndexError, [StartIndex]);
- Length := Length + Count;
- Move(Value[StartIndex + 1], FData[Length - Count], Count * SizeOf(Char));
- Result := Self;
- end;
- function TStringBuilder.AppendFormat(const Format: string;
- const Args: array of const): TStringBuilder;
- begin
- Append(SysUtils.Format(Format, Args));
- Result := Self;
- end;
- function TStringBuilder.AppendLine: TStringBuilder;
- begin
- Append(sLineBreak);
- Result := Self;
- end;
- function TStringBuilder.AppendLine(const Value: string): TStringBuilder;
- begin
- Append(Value);
- AppendLine;
- Result := Self;
- end;
- function TStringBuilder.Append(const Value: TCharArray; StartIndex,
- CharCount: Integer): TStringBuilder;
- begin
- if StartIndex + CharCount > System.Length(Value) then
- raise ERangeError.CreateResFmt(@SListIndexError, [StartIndex]);
- if StartIndex < 0 then
- raise ERangeError.CreateResFmt(@SListIndexError, [StartIndex]);
- Length := Length + CharCount;
- Move(Value[StartIndex], FData[Length - CharCount], CharCount * SizeOf(Char));
- Result := self;
- end;
- function TStringBuilder.Append(const Value: Char;
- RepeatCount: Integer): TStringBuilder;
- begin
- Append(System.StringOfChar(Value, RepeatCount));
- Result := Self;
- end;
- end.
转自:http://www.cnblogs.com/DxSoft/archive/2010/01/03/1638242.html
http://blog.csdn.net/rznice/article/details/8016565
TstringBuilder Delphi2007版的更多相关文章
- zw版·全程图解Halcon控件安装(delphi2007版)
zw版·全程图解Halcon控件安装(delphi2007版) delphi+halcon,这个组合,可以说是图像分析的神级配置,无论是开发效率,还是运行实在是太高了,分分钟秒杀c+opencv,py ...
- 《zw版·Halcon入门教程与内置demo》
<zw版·Halcon入门教程与内置demo> halcon系统的中文教程很不好找,而且大部分是v10以前的版本. 例如,QQ群: 247994767(Delphi与halcon), 共享 ...
- Delphi2007精简版加载Borland.Studio.Together.dll错误解决办法
安装Delphi2007精简版,启动提示Borland.Studio.Together.dll加载错误,错误信息如下: Failed to load IDE add in 'C:\Program Fi ...
- 问题-[delphi2007、2010]无法二次启动,报EditorLineEnds.ttr被占用,进程一直有bds.exe?
问题现象:delphi2007.2010无法二次启动,报EditorLineEnds.ttr被占用,而且进程中一直有bds.exe的进程? 问题原因:问题处理:方法一:可能是系统更新的东东造在的.KB ...
- Delphi2007中正确调用SetWindowLong隐藏程序任务栏图标
http://terony.blog.sohu.com/71347192.html Delphi2007中正确调用SetWindowLong隐藏程序任务栏图标 标签: Delphi2007 SetW ...
- 读书笔记:JavaScript DOM 编程艺术(第二版)
读完还是能学到很多的基础知识,这里记录下,方便回顾与及时查阅. 内容也有自己的一些补充. JavaScript DOM 编程艺术(第二版) 1.JavaScript简史 JavaScript由Nets ...
- jQuery实践-网页版2048小游戏
▓▓▓▓▓▓ 大致介绍 看了一个实现网页版2048小游戏的视频,觉得能做出自己以前喜欢玩的小游戏很有意思便自己动手试了试,真正的验证了这句话-不要以为你以为的就是你以为的,看视频时觉得看懂了,会写了, ...
- 一起学微软Power BI系列-使用技巧(4)Power BI中国版企业环境搭建和帐号问题
千呼万唤的Power BI中国版终于落地了,相信12月初的微软技术大会之后已经铺天盖地的新闻出现了,不错,Power BI中国版真的来了,但还有些遗憾,国际版的一些重量级服务如power bi emb ...
- 将表里的数据批量生成INSERT语句的存储过程 增强版
将表里的数据批量生成INSERT语句的存储过程 增强版 有时候,我们需要将某个表里的数据全部或者根据查询条件导出来,迁移到另一个相同结构的库中 目前SQL Server里面是没有相关的工具根据查询条件 ...
随机推荐
- 嵌入式Qt-4.8.6显示中文并且改变字体大小和应用自己制作的字体库
问题: QT4.8.6在移植到开发板上的时候,中文支持是必不可少的,如何让QT支持中文,如何制作QT支持的字体文件,如何使QT UI编辑器中的字号与开发板中的字号一致. 详解: 1>如何让QT支 ...
- 15、NAND FLASH驱动程序框架
驱动可以参考At91_nand.c,这个比S3c2410.c (drivers\mtd\nand)简单多了 NAND FLASH是一个存储芯片那么: 这样的操作很合理"读地址A的数据,把数据 ...
- Unity(IOC)学习笔记
原文:Unity(IOC)学习笔记 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/m0_37591671/article/details/79432 ...
- 对象模型图(OMD)阅读指南
樱木 原文 对象模型图(OMD)阅读指南(转载) 补充几个名词概念: UML:Unified Modeling Language 统一建模语言,是用来对软件密集系统进行可视化建模的一种语言.UML为面 ...
- UVA 10106 Product (大数相乘)
Product The Problem The problem is to multiply two integers X, Y. (0<=X,Y<10250) The Input The ...
- js如何将字符串作为函数名调用函数
js将如何字符串作为函数名调用函数 一.总结 一句话总结:用eval来实现.eval可以执行参数字符串. 二.js将字符串作为函数名调用函数 比如我现在有一个字符串str = "func_a ...
- thinkphp3.2.3 小程序获取手机号 php 解密
首先是把这个文件夹放到\ThinkPHP\Library\Org里面 //zll 根据加密字符串和session_key和iv获取手机号 /** * [getphone description] * ...
- signature.html
原文网址:http://www.youdzone.com/signature.html 阮一峰:http://www.ruanyifeng.com/blog/2011/08/what_is_a_d ...
- Python数据分析环境和工具
一.数据分析工作环境 Anaconda: Anaconda(水蟒)是一个科学计算软件发行版,集成了大量常用扩展包的环境,包含了 Python 解释器,conda 包管理工具,以及 NumPy.Pand ...
- hibernate级联保存问题
异常:org.hibernate.TransientObjectException: object references an unsaved transient instance 解决方法: XML ...