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. JS学习笔记 - 点击、回车、ctrl+回车提交留言

    疑点: oTxt1.onkeydown = function (ev) 为什么这里的onkeydown = function有变量 (ev),前面onclick函数没有? window.onload ...

  2. Day3:集合

    一.集合的定义及特性 1.集合的特性 1.1   去重,把一个列表变成集合,就自动去重了 1.2   关系测试,测试两组数据之间的交集.差集等关系 #!/usr/bin/env python # -* ...

  3. C#学习笔记——常量、字段以及事件

    一 常量与字段 (一) 常量 常量总是被视为静态成员,而不是实例成员.定义常量将导致创建元数据.代码引用一个常量时,编译器会在定义常量的程序集的元数据中查找该符号,提取常量的值,并将值嵌入IL中.由于 ...

  4. 利用Attribute实现Aop

    Aop“面向切面编程”,与OOP“面向对象编程”一样是一种编程思路.个人理解:在不改变原有逻辑的基础上,注入其他行为. 基础代码(仿MVC拦截器实现) namespace HGL.Toolkit.Ao ...

  5. [Nuxt] Add Arrays of Data to the Vuex Store and Display Them in Vue.js Templates

    You add array of todos to the store simply by adding them to the state defined in your store/index.j ...

  6. SQLITE3 使用总结(直接使用C函数)

    转载网址:http://blog.chinaunix.net/uid-8447633-id-3321394.html 前序: Sqlite3 的确很好用.小巧.速度快.但是因为非微软的产品,帮助文档总 ...

  7. 8、hzk16的介绍以及简单的使用方法

    HZK16 字库是符合GB2312标准的16×16点阵字库,HZK16的GB2312-80支持的汉字有6763个,符号682个.其中一级汉字有3755个,按 声序排列,二级汉字有3008个,按偏旁部首 ...

  8. codeforces 571B--Minimization(贪心+dp)

    D. Minimization time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  9. js进阶 11-24 jquery如何实现选项卡的制作

    js进阶 11-24 jquery如何实现选项卡的制作 一.总结 一句话总结:ul>li做选项卡的选项卡头,多个div做选项卡的内容,点到对应的li,就切换到对应的div,用index()获取l ...

  10. udp网络程序-发送、接收数据

    1. udp网络程序-发送数据 创建一个基于udp的网络程序流程很简单,具体步骤如下: 创建客户端套接字 发送/接收数据 关闭套接字 代码如下: #coding=utf-8from socket im ...