2010中的StringBuilder对象用的比较爽快!于是稍作了一些修改(增加了几个函数和属性)然后移植到D2007中来使用了!效果不错,共享一下!

  1. unit DxStringBuilder;
  2. interface
  3. uses RTLConsts,Classes,SysUtils;
  4. type
  5. EExternal = class(Exception)
  6. public
  7. {$IFDEF MSWINDOWS}
  8. ExceptionRecord: PExceptionRecord platform;
  9. {$ENDIF}
  10. {$IF defined(LINUX) or defined(MACOSX)}
  11. ExceptionAddress: LongWord platform;
  12. AccessAddress: LongWord platform;
  13. SignalNumber: Integer platform;
  14. {$IFEND LINUX or MACOSX}
  15. end;
  16. EIntError = class(EExternal);
  17. ERangeError = class(EIntError);
  18. TCharArray = array of Char;
  19. TStringBuilder = class
  20. private
  21. const DefaultCapacity = $10;
  22. function GetCapacity: Integer;
  23. procedure SetCapacity(const Value: Integer);
  24. function GetLength: Integer;
  25. procedure Set_Length(const Value: Integer);
  26. function GetMaxCapacity: Integer;
  27. procedure ReduceCapacity;
  28. procedure ExpandCapacity;
  29. procedure CheckBounds(Index: Integer);
  30. function _Replace(Index: Integer; const Old, New: string): Boolean;
  31. function GetChars(index: Integer): Char;
  32. procedure SetChars(index: Integer; const Value: Char);
  33. protected
  34. FData: TCharArray;
  35. FLength: Integer;
  36. FMaxCapacity: Integer;
  37. public
  38. constructor Create; overload;
  39. constructor Create(aCapacity: Integer); overload;
  40. constructor Create(const Value: string); overload;
  41. function Append(const Value: Boolean): TStringBuilder; overload;
  42. function Append(const Value: Byte): TStringBuilder; overload;
  43. function Append(const Value: Char): TStringBuilder; overload;
  44. function Append(const Value: Currency): TStringBuilder; overload;
  45. function Append(const Value: Double): TStringBuilder; overload;
  46. function Append(const Value: Smallint): TStringBuilder; overload;
  47. function Append(const Value: Integer): TStringBuilder; overload;
  48. function Append(const Value: Int64): TStringBuilder; overload;
  49. function Append(const Value: TObject): TStringBuilder; overload;
  50. function Append(const Value: Shortint): TStringBuilder; overload;
  51. function Append(const Value: Single): TStringBuilder; overload;
  52. function Append(const Value: string): TStringBuilder; overload;
  53. function Append(const Value: UInt64): TStringBuilder; overload;
  54. function Append(const Value: TCharArray): TStringBuilder; overload;
  55. function Append(const Value: Word): TStringBuilder; overload;
  56. function Append(const Value: Cardinal): TStringBuilder; overload;
  57. function Append(const Value: Char; RepeatCount: Integer): TStringBuilder; overload;
  58. function Append(const Value: TCharArray; StartIndex: Integer; CharCount: Integer): TStringBuilder; overload;
  59. function Append(const Value: string; StartIndex: Integer; Count: Integer): TStringBuilder; overload;
  60. function AppendFormat(const Format: string; const Args: array of const): TStringBuilder; overload;
  61. function AppendLine: TStringBuilder; overload;
  62. function AppendLine(const Value: string): TStringBuilder; overload;
  63. procedure Clear;
  64. procedure CopyTo(SourceIndex: Integer; const Destination: TCharArray; DestinationIndex: Integer; Count: Integer);
  65. function EnsureCapacity(aCapacity: Integer): Integer;
  66. function Equals(StringBuilder: TStringBuilder): Boolean; reintroduce;
  67. function Insert(Index: Integer; const Value: Boolean): TStringBuilder; overload;
  68. function Insert(Index: Integer; const Value: Byte): TStringBuilder; overload;
  69. function Insert(Index: Integer; const Value: Char): TStringBuilder; overload;
  70. function Insert(Index: Integer; const Value: Currency): TStringBuilder; overload;
  71. function Insert(Index: Integer; const Value: Double): TStringBuilder; overload;
  72. function Insert(Index: Integer; const Value: Smallint): TStringBuilder; overload;
  73. function Insert(Index: Integer; const Value: Integer): TStringBuilder; overload;
  74. function Insert(Index: Integer; const Value: TCharArray): TStringBuilder; overload;
  75. function Insert(Index: Integer; const Value: Int64): TStringBuilder; overload;
  76. function Insert(Index: Integer; const Value: TObject): TStringBuilder; overload;
  77. function Insert(Index: Integer; const Value: Shortint): TStringBuilder; overload;
  78. function Insert(Index: Integer; const Value: Single): TStringBuilder; overload;
  79. function Insert(Index: Integer; const Value: string): TStringBuilder; overload;
  80. function Insert(Index: Integer; const Value: Word): TStringBuilder; overload;
  81. function Insert(Index: Integer; const Value: Cardinal): TStringBuilder; overload;
  82. function Insert(Index: Integer; const Value: UInt64): TStringBuilder; overload;
  83. function Insert(Index: Integer; const Value: string; count: Integer): TStringBuilder; overload;
  84. function Insert(Index: Integer; const Value: TCharArray; startIndex: Integer; charCount: Integer): TStringBuilder; overload;
  85. function Remove(StartIndex: Integer; RemLength: Integer): TStringBuilder;
  86. function Replace(const OldChar: Char; const NewChar: Char): TStringBuilder; overload;
  87. function Replace(const OldValue: string; const NewValue: string): TStringBuilder; overload;
  88. function Replace(const OldChar: Char; const NewChar: Char; StartIndex: Integer; Count: Integer): TStringBuilder; overload;
  89. function Replace(const OldValue: string; const NewValue: string; StartIndex: Integer; Count: Integer): TStringBuilder; overload;
  90. function ToString: string; overload;
  91. function ToString(StartIndex: Integer; StrLength: Integer): string; reintroduce; overload;
  92. procedure SaveToStream(Stream: TStream);
  93. procedure SaveToFile(FileName: string);
  94. procedure LoadFromStream(Stream: TStream);
  95. procedure LoadFromFile(FileName: string);
  96. property Capacity: Integer read GetCapacity write SetCapacity;
  97. property Chars[index: Integer]: Char read GetChars write SetChars; default;
  98. property Length: Integer read GetLength write Set_Length;
  99. property MaxCapacity: Integer read GetMaxCapacity;
  100. end;
  101. function UIntToStr(Value: Cardinal): string; overload;
  102. function UIntToStr(Value: UInt64): string; overload;
  103. resourcestring
  104. SParamIsNegative = 'Parameter %s cannot be a negative value';
  105. SInputBufferExceed = 'Input buffer exceeded for %s = %d, %s = %d';
  106. implementation
  107. function UIntToStr(Value: Cardinal): string;
  108. begin
  109. FmtStr(Result, '%u', [Value]);
  110. end;
  111. function UIntToStr(Value: UInt64): string;
  112. begin
  113. FmtStr(Result, '%u', [Value]);
  114. end;
  115. { TStringBuilder }
  116. constructor TStringBuilder.Create;
  117. begin
  118. inherited Create;
  119. FMaxCapacity := MaxInt;
  120. Capacity := DefaultCapacity;
  121. FLength := 0;
  122. end;
  123. constructor TStringBuilder.Create(aCapacity: Integer);
  124. begin
  125. inherited Create;
  126. FMaxCapacity := MaxInt;
  127. Capacity := aCapacity;
  128. FLength := 0;
  129. end;
  130. function TStringBuilder.Append(const Value: string): TStringBuilder;
  131. begin
  132. Length := Length + System.Length(Value);
  133. Move(PChar(Value)^, FData[Length - System.Length(Value)], System.Length(Value) * SizeOf(Char));
  134. Result := self;
  135. end;
  136. function TStringBuilder.Append(const Value: Currency): TStringBuilder;
  137. begin
  138. Append(CurrToStr(Value));
  139. Result := Self;
  140. end;
  141. function TStringBuilder.Append(const Value: Double): TStringBuilder;
  142. begin
  143. Append(FloatToStr(Value));
  144. Result := Self;
  145. end;
  146. function TStringBuilder.Append(const Value: Char): TStringBuilder;
  147. begin
  148. Length := Length + 1;
  149. FData[Length - 1] := Value;
  150. Result := Self;
  151. end;
  152. function TStringBuilder.Append(const Value: Boolean): TStringBuilder;
  153. begin
  154. Append(BoolToStr(Value, True));
  155. Result := Self;
  156. end;
  157. function TStringBuilder.Append(const Value: Byte): TStringBuilder;
  158. begin
  159. Append(IntToStr(Value));
  160. Result := Self;
  161. end;
  162. function TStringBuilder.Append(const Value: Smallint): TStringBuilder;
  163. begin
  164. Append(IntToStr(Value));
  165. Result := Self;
  166. end;
  167. function TStringBuilder.Append(const Value: Shortint): TStringBuilder;
  168. begin
  169. Append(IntToStr(Value));
  170. Result := Self;
  171. end;
  172. function TStringBuilder.Append(const Value: Single): TStringBuilder;
  173. begin
  174. Append(FloatToStr(Value));
  175. Result := self;
  176. end;
  177. function TStringBuilder.Append(const Value: TObject): TStringBuilder;
  178. begin
  179. {$if CompilerVersion >= 19}
  180. Append(Value.ToString());
  181. {$else}
  182. if Value.InheritsFrom(TComponent) then
  183. Append(TComponent(Value).Name+': '+Value.ClassName)
  184. else Append(Value.ClassName);
  185. {$ifend}
  186. Result := Self;
  187. end;
  188. function TStringBuilder.Append(const Value: Integer): TStringBuilder;
  189. begin
  190. Append(IntToStr(Value));
  191. Result := Self;
  192. end;
  193. function TStringBuilder.Append(const Value: Int64): TStringBuilder;
  194. begin
  195. Append(IntToStr(Value));
  196. Result := Self;
  197. end;
  198. procedure TStringBuilder.CheckBounds(Index: Integer);
  199. begin
  200. if Cardinal(Index) >= Cardinal(Length) then
  201. raise ERangeError.CreateResFmt(@SListIndexError, [Index]);
  202. end;
  203. procedure TStringBuilder.Clear;
  204. begin
  205. Length := 0;
  206. Capacity := DefaultCapacity;
  207. end;
  208. procedure TStringBuilder.CopyTo(SourceIndex: Integer;
  209. const Destination: TCharArray; DestinationIndex, Count: Integer);
  210. begin
  211. if Count < 0 then
  212. raise ERangeError.CreateResFmt(@SParamIsNegative, ['Count']); // DO NOT LOCALIZE
  213. if DestinationIndex < 0 then
  214. raise ERangeError.CreateResFmt(@SParamIsNegative, ['DestinationIndex']); // DO NOT LOCALIZE
  215. if DestinationIndex + Count > System.Length(Destination) then
  216. raise ERangeError.CreateResFmt(@SInputBufferExceed,
  217. ['DestinationIndex', DestinationIndex, 'Count', Count]);
  218. if Count > 0 then
  219. begin
  220. CheckBounds(SourceIndex);
  221. CheckBounds(SourceIndex + Count - 1);
  222. Move(FData[SourceIndex], Destination[DestinationIndex], Count * SizeOf(Char));
  223. end;
  224. end;
  225. constructor TStringBuilder.Create(const Value: string);
  226. begin
  227. Create;
  228. Append(Value);
  229. end;
  230. function TStringBuilder.EnsureCapacity(aCapacity: Integer): Integer;
  231. begin
  232. if Cardinal(aCapacity) > Cardinal(MaxCapacity) then
  233. raise ERangeError.CreateResFmt(@SListIndexError, [aCapacity]);
  234. if Capacity < aCapacity then
  235. Capacity := aCapacity;
  236. Result := Capacity;
  237. end;
  238. function TStringBuilder.Equals(StringBuilder: TStringBuilder): Boolean;
  239. begin
  240. Result := (StringBuilder <> nil) and (Length = StringBuilder.Length) and
  241. (MaxCapacity = StringBuilder.MaxCapacity) and
  242. CompareMem(@FData[0], @StringBuilder.FData[0], Length * SizeOf(Char));
  243. end;
  244. procedure TStringBuilder.ExpandCapacity;
  245. var
  246. NewCapacity: Integer;
  247. begin
  248. NewCapacity := Capacity * 2;
  249. if Length > NewCapacity then
  250. NewCapacity := Length * 2; // this line may overflow NewCapacity to a negative value
  251. if NewCapacity > MaxCapacity then
  252. NewCapacity := MaxCapacity;
  253. if NewCapacity < 0 then // if NewCapacity has been overflowed
  254. NewCapacity := Length;
  255. Capacity := NewCapacity;
  256. end;
  257. function TStringBuilder.GetCapacity: Integer;
  258. begin
  259. Result := System.Length(FData);
  260. end;
  261. function TStringBuilder.GetChars(index: Integer): Char;
  262. begin
  263. if Index < 0 then
  264. raise ERangeError.CreateResFmt(@SParamIsNegative, ['Index']); // DO NOT LOCALIZE
  265. CheckBounds(Index);
  266. Result := FData[Index];
  267. end;
  268. function TStringBuilder.GetLength: Integer;
  269. begin
  270. Result := FLength;
  271. end;
  272. function TStringBuilder.GetMaxCapacity: Integer;
  273. begin
  274. Result := FMaxCapacity;
  275. end;
  276. function TStringBuilder.Insert(Index: Integer;
  277. const Value: Integer): TStringBuilder;
  278. begin
  279. Insert(Index, IntToStr(Value));
  280. Result := Self;
  281. end;
  282. function TStringBuilder.Insert(Index: Integer;
  283. const Value: Smallint): TStringBuilder;
  284. begin
  285. Insert(Index, IntToStr(Value));
  286. Result := Self;
  287. end;
  288. function TStringBuilder.Insert(Index: Integer;
  289. const Value: Int64): TStringBuilder;
  290. begin
  291. Insert(Index, IntToStr(Value));
  292. Result := Self;
  293. end;
  294. function TStringBuilder.Insert(Index: Integer;
  295. const Value: TCharArray): TStringBuilder;
  296. begin
  297. if Index < 0 then
  298. raise ERangeError.CreateResFmt(@SParamIsNegative, ['Index']); // DO NOT LOCALIZE
  299. if Index > Length then
  300. raise ERangeError.CreateResFmt(@SListIndexError, [Index]);
  301. Length := Length + System.Length(Value);
  302. Move(FData[Index], FData[Index + System.Length(Value)], System.Length(Value) * SizeOf(Char));
  303. Move(Value[0], FData[Index], System.Length(Value) * SizeOf(Char));
  304. Result := Self;
  305. end;
  306. function TStringBuilder.Insert(Index: Integer;
  307. const Value: Double): TStringBuilder;
  308. begin
  309. Insert(Index, FloatToStr(Value));
  310. Result := Self;
  311. end;
  312. function TStringBuilder.Insert(Index: Integer;
  313. const Value: Byte): TStringBuilder;
  314. begin
  315. Insert(Index, IntToStr(Value));
  316. Result := Self;
  317. end;
  318. function TStringBuilder.Insert(Index: Integer;
  319. const Value: Boolean): TStringBuilder;
  320. begin
  321. Insert(Index, BoolToStr(Value, True));
  322. Result := Self;
  323. end;
  324. function TStringBuilder.Insert(Index: Integer;
  325. const Value: Currency): TStringBuilder;
  326. begin
  327. Insert(Index, CurrToStr(Value));
  328. Result := Self;
  329. end;
  330. function TStringBuilder.Insert(Index: Integer;
  331. const Value: Char): TStringBuilder;
  332. begin
  333. if Index < 0 then
  334. raise ERangeError.CreateResFmt(@SParamIsNegative, ['Index']); // DO NOT LOCALIZE
  335. if Index > Length then
  336. raise ERangeError.CreateResFmt(@SListIndexError, [Index]);
  337. Length := Length + 1;
  338. Move(FData[Index], FData[Index + 1], (Length - Index - 1) * SizeOf(Char));
  339. FData[Index] := Value;
  340. Result := Self;
  341. end;
  342. function TStringBuilder.Insert(Index: Integer;
  343. const Value: UInt64): TStringBuilder;
  344. begin
  345. Insert(Index, IntToStr(Value));
  346. Result := self;
  347. end;
  348. function TStringBuilder.Insert(Index: Integer;
  349. const Value: Cardinal): TStringBuilder;
  350. begin
  351. Insert(Index, IntToStr(Value));
  352. Result := self;
  353. end;
  354. function TStringBuilder.Insert(Index: Integer; const Value: TCharArray;
  355. startIndex, charCount: Integer): TStringBuilder;
  356. begin
  357. if Index - 1 >= Length then
  358. raise ERangeError.CreateResFmt(@SListIndexError, [Index])
  359. else if Index < 0 then
  360. raise ERangeError.CreateResFmt(@SListIndexError, [Index]);
  361. if StartIndex < 0 then
  362. raise ERangeError.CreateResFmt(@SParamIsNegative, ['StartIndex']); // DO NOT LOCALIZE
  363. if CharCount < 0 then
  364. raise ERangeError.CreateResFmt(@SParamIsNegative, ['CharCount']); // DO NOT LOCALIZE
  365. if StartIndex + CharCount > System.Length(Value) then
  366. raise ERangeError.CreateResFmt(@SInputBufferExceed,
  367. ['StartIndex', StartIndex, 'CharCount', CharCount]);
  368. Length := Length + CharCount;
  369. if Length - Index > 0 then
  370. Move(FData[Index], FData[Index + CharCount], (Length - Index) * SizeOf(Char));
  371. Move(Value[StartIndex], FData[Index], CharCount * SizeOf(Char));
  372. Result := Self;
  373. end;
  374. procedure TStringBuilder.LoadFromFile(FileName: string);
  375. var
  376. F: TFileStream;
  377. begin
  378. F := TFileStream.Create(FileName,fmOpenRead);
  379. LoadFromStream(F);
  380. F.Free;
  381. end;
  382. procedure TStringBuilder.LoadFromStream(Stream: TStream);
  383. begin
  384. Capacity := Stream.Size;
  385. Stream.Position := 0;
  386. Stream.ReadBuffer(FData[0],Stream.Size);
  387. Length := Stream.Size;
  388. end;
  389. procedure TStringBuilder.ReduceCapacity;
  390. var
  391. NewCapacity: Integer;
  392. begin
  393. if Length > Capacity div 4 then
  394. Exit;
  395. NewCapacity := Capacity div 2;
  396. if NewCapacity < Length then
  397. NewCapacity := Length;
  398. Capacity := NewCapacity;
  399. end;
  400. function TStringBuilder.Remove(StartIndex, RemLength: Integer): TStringBuilder;
  401. begin
  402. if RemLength <> 0 then
  403. begin
  404. if StartIndex < 0 then
  405. raise ERangeError.CreateResFmt(@SParamIsNegative, ['StartIndex']); // DO NOT LOCALIZE
  406. if RemLength < 0 then
  407. raise ERangeError.CreateResFmt(@SParamIsNegative, ['RemLength']); // DO NOT LOCALIZE
  408. CheckBounds(StartIndex);
  409. CheckBounds(StartIndex + RemLength - 1);
  410. if (Length - (StartIndex + RemLength)) > 0 then
  411. Move(FData[StartIndex + RemLength], FData[StartIndex], (Length - (StartIndex + RemLength)) * SizeOf(Char));
  412. Length := Length - RemLength;
  413. ReduceCapacity;
  414. end;
  415. Result := Self;
  416. end;
  417. function TStringBuilder.Replace(const OldValue,
  418. NewValue: string): TStringBuilder;
  419. begin
  420. Result := self;
  421. Replace(OldValue, NewValue, 0, Length);
  422. end;
  423. function TStringBuilder.Replace(const OldChar, NewChar: Char): TStringBuilder;
  424. var
  425. Ptr: PChar;
  426. EndPtr: PChar;
  427. begin
  428. EndPtr := @FData[Length - 1];
  429. Ptr := @FData[0];
  430. while Ptr <= EndPtr do
  431. begin
  432. if Ptr^ = OldChar then
  433. Ptr^ := NewChar;
  434. Inc(Ptr);
  435. end;
  436. Result := Self;
  437. end;
  438. function TStringBuilder.Replace(const OldValue, NewValue: string; StartIndex,
  439. Count: Integer): TStringBuilder;
  440. var
  441. CurPtr: PChar;
  442. EndPtr: PChar;
  443. Index: Integer;
  444. EndIndex: Integer;
  445. oldLen, newLen: Integer;
  446. begin
  447. Result := Self;
  448. if Count <> 0 then
  449. begin
  450. if StartIndex < 0 then
  451. raise ERangeError.CreateResFmt(@SParamIsNegative, ['StartIndex']); // DO NOT LOCALIZE
  452. if Count < 0 then
  453. raise ERangeError.CreateResFmt(@SParamIsNegative, ['Count']); // DO NOT LOCALIZE
  454. if StartIndex + Count > Length then
  455. raise ERangeError.CreateResFmt(@SInputBufferExceed,
  456. ['StartIndex', StartIndex, 'Count', Count]);
  457. oldLen := System.Length(OldValue);
  458. newLen := System.Length(NewValue);
  459. Index := StartIndex;
  460. CurPtr := @FData[StartIndex];
  461. EndIndex := StartIndex + Count - oldLen;
  462. EndPtr := @FData[EndIndex];
  463. while CurPtr <= EndPtr do
  464. begin
  465. if CurPtr^ = OldValue[1] then
  466. begin
  467. if StrLComp(CurPtr, PChar(OldValue), oldLen) = 0 then
  468. begin
  469. if _Replace(Index, OldValue, NewValue) then
  470. begin
  471. CurPtr := @FData[Index];
  472. EndPtr := @FData[EndIndex];
  473. end;
  474. Inc(CurPtr, newLen - 1);
  475. Inc(Index, newLen - 1);
  476. Inc(EndPtr, newLen - oldLen);
  477. Inc(EndIndex, newLen - oldLen);
  478. end;
  479. end;
  480. Inc(CurPtr);
  481. Inc(Index);
  482. end;
  483. end;
  484. end;
  485. function TStringBuilder.Replace(const OldChar, NewChar: Char; StartIndex,
  486. Count: Integer): TStringBuilder;
  487. var
  488. Ptr: PChar;
  489. EndPtr: PChar;
  490. begin
  491. if Count <> 0 then
  492. begin
  493. if StartIndex < 0 then
  494. raise ERangeError.CreateResFmt(@SParamIsNegative, ['StartIndex']); // DO NOT LOCALIZE
  495. if Count < 0 then
  496. raise ERangeError.CreateResFmt(@SParamIsNegative, ['Count']); // DO NOT LOCALIZE
  497. CheckBounds(StartIndex);
  498. CheckBounds(StartIndex + Count - 1);
  499. EndPtr := @FData[StartIndex + Count - 1];
  500. Ptr := @FData[StartIndex];
  501. while Ptr <= EndPtr do
  502. begin
  503. if Ptr^ = OldChar then
  504. Ptr^ := NewChar;
  505. Inc(Ptr);
  506. end;
  507. end;
  508. Result := Self;
  509. end;
  510. function TStringBuilder.Insert(Index: Integer; const Value: string;
  511. count: Integer): TStringBuilder;
  512. var
  513. I: Integer;
  514. begin
  515. for I := 0 to Count - 1 do
  516. Insert(Index, Value);
  517. Result := Self;
  518. end;
  519. function TStringBuilder.Insert(Index: Integer;
  520. const Value: Word): TStringBuilder;
  521. begin
  522. Insert(Index, IntToStr(Value));
  523. Result := Self;
  524. end;
  525. function TStringBuilder.Insert(Index: Integer;
  526. const Value: Shortint): TStringBuilder;
  527. begin
  528. Insert(Index, IntToStr(Value));
  529. Result := Self;
  530. end;
  531. function TStringBuilder.Insert(Index: Integer;
  532. const Value: TObject): TStringBuilder;
  533. begin
  534. {$if CompilerVersion >= 19}
  535. Insert(Index, Value.ToString());
  536. {$else}
  537. Insert(Index, IntToStr(Integer(Value)));
  538. {$ifend}
  539. Result := Self;
  540. end;
  541. function TStringBuilder.Insert(Index: Integer;
  542. const Value: string): TStringBuilder;
  543. begin
  544. if Index < 0 then
  545. raise ERangeError.CreateResFmt(@SParamIsNegative, ['Index']); // DO NOT LOCALIZE
  546. if Index > Length then
  547. raise ERangeError.CreateResFmt(@SListIndexError, [Index]);
  548. Length := Length + System.Length(Value);
  549. Move(FData[Index], FData[Index + System.Length(Value)], (Length - System.Length(Value) - Index) * SizeOf(Char));
  550. Move(Value[1], FData[Index], System.Length(Value) * SizeOf(Char));
  551. Result := Self;
  552. end;
  553. function TStringBuilder.Insert(Index: Integer;
  554. const Value: Single): TStringBuilder;
  555. begin
  556. Insert(Index, FloatToStr(Value));
  557. Result := Self;
  558. end;
  559. procedure TStringBuilder.SaveToFile(FileName: string);
  560. var
  561. FileStream: TFileStream;
  562. begin
  563. FileStream := TFileStream.Create(FileName,fmOpenWrite);
  564. SaveToStream(FileStream);
  565. FileStream.Free;
  566. end;
  567. procedure TStringBuilder.SaveToStream(Stream: TStream);
  568. begin
  569. Stream.WriteBuffer(FData[0],Length * SizeOf(Char));
  570. end;
  571. procedure TStringBuilder.SetCapacity(const Value: Integer);
  572. begin
  573. if Value < Length then
  574. raise ERangeError.CreateResFmt(@SListCapacityError, [Value]);
  575. if Value > FMaxCapacity then
  576. raise ERangeError.CreateResFmt(@SListCapacityError, [Value]);
  577. SetLength(FData, Value);
  578. end;
  579. procedure TStringBuilder.SetChars(index: Integer; const Value: Char);
  580. begin
  581. if Index < 0 then
  582. raise ERangeError.CreateResFmt(@SParamIsNegative, ['Index']); // DO NOT LOCALIZE
  583. CheckBounds(Index);
  584. FData[Index] := Value;
  585. end;
  586. procedure TStringBuilder.Set_Length(const Value: Integer);
  587. var
  588. LOldLength: Integer;
  589. begin
  590. if Value < 0 then
  591. raise ERangeError.CreateResFmt(@SParamIsNegative, ['Value']); // DO NOT LOCALIZE
  592. if Value > MaxCapacity then
  593. raise ERangeError.CreateResFmt(@SListCapacityError, [Value]);
  594. LOldLength := FLength;
  595. try
  596. FLength := Value;
  597. if FLength > Capacity then
  598. ExpandCapacity;
  599. except
  600. on E: EOutOfMemory do
  601. FLength := LOldLength;
  602. end;
  603. end;
  604. function TStringBuilder.ToString: string;
  605. begin
  606. SetLength(Result, Length);
  607. Move(FData[0], Result[1], Length * SizeOf(Char));
  608. end;
  609. function TStringBuilder.ToString(StartIndex, StrLength: Integer): string;
  610. begin
  611. if StrLength <> 0 then
  612. begin
  613. if StartIndex < 0 then
  614. raise ERangeError.CreateResFmt(@SParamIsNegative, ['StartIndex']); // DO NOT LOCALIZE
  615. if StrLength < 0 then
  616. raise ERangeError.CreateResFmt(@SParamIsNegative, ['StrLength']); // DO NOT LOCALIZE
  617. CheckBounds(StartIndex);
  618. CheckBounds(StartIndex + StrLength - 1);
  619. SetLength(Result, StrLength);
  620. Move(FData[StartIndex], Result[1], StrLength * SizeOf(Char));
  621. end
  622. else Result := '';
  623. end;
  624. function TStringBuilder._Replace(Index: Integer; const Old,
  625. New: string): Boolean;
  626. var
  627. OldCapacity: Integer;
  628. SizeChange: Integer;
  629. begin
  630. Result := False;
  631. SizeChange := System.Length(New) - System.Length(Old);
  632. if SizeChange = 0 then
  633. begin
  634. Move(New[1], FData[Index], System.Length(New) * SizeOf(Char));
  635. end
  636. else
  637. begin
  638. if SizeChange > 0 then
  639. begin
  640. OldCapacity := Capacity;
  641. Length := Length + SizeChange;
  642. if OldCapacity <> Capacity then
  643. Result := True;
  644. end;
  645. Move(FData[Index + System.Length(Old)], FData[Index + System.Length(New)], (Length - (System.Length(Old) + Index)) * SizeOf(Char));
  646. Move(New[1], FData[Index], System.Length(New) * SizeOf(Char));
  647. if SizeChange < 0 then
  648. Length := Length + SizeChange;
  649. end;
  650. end;
  651. function TStringBuilder.Append(const Value: Word): TStringBuilder;
  652. begin
  653. Append(IntToStr(Value));
  654. Result := self;
  655. end;
  656. function TStringBuilder.Append(const Value: TCharArray): TStringBuilder;
  657. var
  658. I: Integer;
  659. begin
  660. Result := self;
  661. for I := 0 to System.Length(Value) - 1 do
  662. if Value[I] = #0 then
  663. Break;
  664. Append(Value, 0, I);
  665. end;
  666. function TStringBuilder.Append(const Value: UInt64): TStringBuilder;
  667. begin
  668. Append(UIntToStr(Value));
  669. Result := self;
  670. end;
  671. function TStringBuilder.Append(const Value: Cardinal): TStringBuilder;
  672. begin
  673. Append(UIntToStr(Value));
  674. Result := self;
  675. end;
  676. function TStringBuilder.Append(const Value: string; StartIndex,
  677. Count: Integer): TStringBuilder;
  678. begin
  679. if StartIndex + Count > System.Length(Value) then
  680. raise ERangeError.CreateResFmt(@SListIndexError, [StartIndex]);
  681. if StartIndex < 0 then
  682. raise ERangeError.CreateResFmt(@SListIndexError, [StartIndex]);
  683. Length := Length + Count;
  684. Move(Value[StartIndex + 1], FData[Length - Count], Count * SizeOf(Char));
  685. Result := Self;
  686. end;
  687. function TStringBuilder.AppendFormat(const Format: string;
  688. const Args: array of const): TStringBuilder;
  689. begin
  690. Append(SysUtils.Format(Format, Args));
  691. Result := Self;
  692. end;
  693. function TStringBuilder.AppendLine: TStringBuilder;
  694. begin
  695. Append(sLineBreak);
  696. Result := Self;
  697. end;
  698. function TStringBuilder.AppendLine(const Value: string): TStringBuilder;
  699. begin
  700. Append(Value);
  701. AppendLine;
  702. Result := Self;
  703. end;
  704. function TStringBuilder.Append(const Value: TCharArray; StartIndex,
  705. CharCount: Integer): TStringBuilder;
  706. begin
  707. if StartIndex + CharCount > System.Length(Value) then
  708. raise ERangeError.CreateResFmt(@SListIndexError, [StartIndex]);
  709. if StartIndex < 0 then
  710. raise ERangeError.CreateResFmt(@SListIndexError, [StartIndex]);
  711. Length := Length + CharCount;
  712. Move(Value[StartIndex], FData[Length - CharCount], CharCount * SizeOf(Char));
  713. Result := self;
  714. end;
  715. function TStringBuilder.Append(const Value: Char;
  716. RepeatCount: Integer): TStringBuilder;
  717. begin
  718. Append(System.StringOfChar(Value, RepeatCount));
  719. Result := Self;
  720. end;
  721. end.

转自:http://www.cnblogs.com/DxSoft/archive/2010/01/03/1638242.html

http://blog.csdn.net/rznice/article/details/8016565

TstringBuilder Delphi2007版的更多相关文章

  1. zw版·全程图解Halcon控件安装(delphi2007版)

    zw版·全程图解Halcon控件安装(delphi2007版) delphi+halcon,这个组合,可以说是图像分析的神级配置,无论是开发效率,还是运行实在是太高了,分分钟秒杀c+opencv,py ...

  2. 《zw版·Halcon入门教程与内置demo》

    <zw版·Halcon入门教程与内置demo> halcon系统的中文教程很不好找,而且大部分是v10以前的版本. 例如,QQ群: 247994767(Delphi与halcon), 共享 ...

  3. Delphi2007精简版加载Borland.Studio.Together.dll错误解决办法

    安装Delphi2007精简版,启动提示Borland.Studio.Together.dll加载错误,错误信息如下: Failed to load IDE add in 'C:\Program Fi ...

  4. 问题-[delphi2007、2010]无法二次启动,报EditorLineEnds.ttr被占用,进程一直有bds.exe?

    问题现象:delphi2007.2010无法二次启动,报EditorLineEnds.ttr被占用,而且进程中一直有bds.exe的进程? 问题原因:问题处理:方法一:可能是系统更新的东东造在的.KB ...

  5. Delphi2007中正确调用SetWindowLong隐藏程序任务栏图标

    http://terony.blog.sohu.com/71347192.html‍ Delphi2007中正确调用SetWindowLong隐藏程序任务栏图标 标签: Delphi2007 SetW ...

  6. 读书笔记:JavaScript DOM 编程艺术(第二版)

    读完还是能学到很多的基础知识,这里记录下,方便回顾与及时查阅. 内容也有自己的一些补充. JavaScript DOM 编程艺术(第二版) 1.JavaScript简史 JavaScript由Nets ...

  7. jQuery实践-网页版2048小游戏

    ▓▓▓▓▓▓ 大致介绍 看了一个实现网页版2048小游戏的视频,觉得能做出自己以前喜欢玩的小游戏很有意思便自己动手试了试,真正的验证了这句话-不要以为你以为的就是你以为的,看视频时觉得看懂了,会写了, ...

  8. 一起学微软Power BI系列-使用技巧(4)Power BI中国版企业环境搭建和帐号问题

    千呼万唤的Power BI中国版终于落地了,相信12月初的微软技术大会之后已经铺天盖地的新闻出现了,不错,Power BI中国版真的来了,但还有些遗憾,国际版的一些重量级服务如power bi emb ...

  9. 将表里的数据批量生成INSERT语句的存储过程 增强版

    将表里的数据批量生成INSERT语句的存储过程 增强版 有时候,我们需要将某个表里的数据全部或者根据查询条件导出来,迁移到另一个相同结构的库中 目前SQL Server里面是没有相关的工具根据查询条件 ...

随机推荐

  1. 过滤input框中的特殊字符

    两种方式,我觉得是一样的效果,请看: var charFilter1 = function(str) { var pattern = new RegExp("[`~!@#$^&*() ...

  2. 【z07】机器翻译

    [题目链接]:http://noi.qz5z.com/viewtask.asp?id=z07 [题解] 可以理解为一直往一个队列里面加东西: 然后每次查找一个东西在不在队列的最尾部长度为m的区间范围内 ...

  3. swift学习第九天:可选类型以及应用场景

    可选类型的介绍 注意: 可选类型时swift中较理解的一个知识点 暂时先了解,多利用Xcode的提示来使用 随着学习的深入,慢慢理解其中的原理和好处 概念: 在OC开发中,如果一个变量暂停不使用,可以 ...

  4. FZU 1650 1752 a^b mod c

    http://acm.fzu.edu.cn/problem.php?pid=1752 http://acm.fzu.edu.cn/problem.php?pid=1650 给跪了. 我的快速幂会越界. ...

  5. Android Wear之android穿戴式设备应用开发平台

    Android Wear于2014年03月19日公布,并有Moto 360和LG watch两款产品. 眼下源代码还没有开放.可是开发人员能够下载它的Image及相应的开发SDK,这样开发人员通过模拟 ...

  6. 【苦读官方文档】2.Android应用程序基本原理概述

    官方文档原文地址 应用程序原理 Android应用程序是通过Java编程语言来写.Android软件开发工具把你的代码和其它数据.资源文件一起编译.打包成一个APK文件,这个文档以.apk为后缀,保存 ...

  7. [Angular] Auxiliary named router outlets

    Define a auxilliary router: export const ROUTES: Routes = [ { path: 'folder/:name', component: MailF ...

  8. [Angular Testing] Unit Testing -- Test component and service.

    Recommend to use angular-cli to generate component and service, so we can get testing templates. ng ...

  9. cat /proc/cpuinfo 引发的思考--CPU 物理封装-物理核心-逻辑核心-超线程之间关系

    CPU的物理封装,一个物理封装使用独立的一个CPU物理插槽,共享电源和风扇: CPU物理核心:在一个物理封装中封装了多个独立CPU核心,每一个CPU核心都有自己独立的完整硬件单元. CPU逻辑核心:一 ...

  10. Thinking in UML 学习笔记(二)——UML核心视图之用例图

    在UML中,需求模型又称为用例模型,它主要用于描述系统的功能性需求,即软件可以实现的功能,如登录.注册.入库.出库.查看库存报表.增加员工信息等.常规的用例建模一般包括两个组成部分:绘制用例图和编写用 ...