在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
昨天装了个D2010,发现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 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论