Move WriteBuffer ReadBuffer String

 在实际编程中,经常会用到Buffer,当string作为Buffer传值时需要注意的是

 1, string的值的起始索引是1,千万记住!

 2, 有时候需要先告诉系统去开辟出内存空间,用SetLength函数。

如下代码,示范了再Move、 WriteBuffer、 ReadBuffer时候的用法:

[delphi] view plaincopy
 
  1. unit Unit3;  
  2.   
  3. interface  
  4.   
  5. uses  
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  
  7.   Dialogs, StdCtrls;  
  8.   
  9. type  
  10.   TForm3 = class(TForm)  
  11.     Memo1: TMemo;  
  12.     Button1: TButton;  
  13.     Button2: TButton;  
  14.     Button3: TButton;  
  15.     Button4: TButton;  
  16.     procedure Button1Click(Sender: TObject);  
  17.     procedure Button2Click(Sender: TObject);  
  18.     procedure FormCreate(Sender: TObject);  
  19.     procedure FormDestroy(Sender: TObject);  
  20.     procedure Button3Click(Sender: TObject);  
  21.     procedure Button4Click(Sender: TObject);  
  22.   private  
  23.     { Private declarations }  
  24.     FMemoryStream: TMemoryStream;  
  25.     FBuffer: string;  
  26.   public  
  27.     { Public declarations }  
  28.   end;  
  29.   
  30. var  
  31.   Form3: TForm3;  
  32.   
  33. implementation  
  34.   
  35. {$R *.dfm}  
  36.   
  37. procedure TForm3.Button1Click(Sender: TObject);  
  38. var  
  39.   LStr: string;  
  40.   LLen: Integer;  
  41. begin  
  42.   LStr := '太棒了!Hello, 世界 我太爱你了';  
  43.   LLen := Length(LStr);  
  44.   
  45.   FMemoryStream.WriteBuffer(LLen, SizeOf(LLen));  
  46.   // 要用LStr[1], 而不是LStr  
  47.   FMemoryStream.WriteBuffer(LStr[1], LLen);  
  48. end;  
  49.   
  50. procedure TForm3.Button2Click(Sender: TObject);  
  51. var  
  52.   LStr: string;  
  53.   LLen: Integer;  
  54. begin  
  55.   // 因为写入与读出在一个工程中,所以先把指针指向开头位置  
  56.   FMemoryStream.Position := 0;  
  57.   FMemoryStream.ReadBuffer(LLen, SizeOf(LLen));  
  58.   SetLength(LStr, LLen);  
  59.   // 要用LStr[1], 而不是LStr  
  60.   FMemoryStream.ReadBuffer(LStr[1], LLen);  
  61.   
  62.   Memo1.Lines.Add(LStr);  
  63. end;  
  64.   
  65. procedure TForm3.Button3Click(Sender: TObject);  
  66. var  
  67.   LStr: string;  
  68.   LLen: Integer;  
  69.   LIndex: Integer;  
  70. begin  
  71.   LStr := '世界很美好 Hello, World!';  
  72.   LLen := Length(LStr);  
  73.   // 先为FBuffer开辟出空间  
  74.   SetLength(FBuffer, SizeOf(LLen) + LLen);  
  75.   
  76.   LIndex := 1;  
  77.   // FBuffer的起始位置为1  
  78.   Move(LLen, FBuffer[1], SizeOf(LLen));  
  79.   // 计算Buffer指针的移动位置  
  80.   Inc(LIndex, SizeOf(LLen));  
  81.   // 要用LStr[1], 而不是LStr  
  82.   Move(LStr[1], FBuffer[LIndex], LLen);  
  83. end;  
  84.   
  85. procedure TForm3.Button4Click(Sender: TObject);  
  86. var  
  87.   LStr: string;  
  88.   LLen: Integer;  
  89.   LIndex: Integer;  
  90. begin  
  91.   LIndex := 1;  
  92.   Move(FBuffer[1], LLen, SizeOf(LLen));  
  93.   Inc(LIndex, SizeOf(LLen));  
  94.   SetLength(LStr, LLen);  
  95.   // 要用LStr[1], 而不是LStr  
  96.   Move(FBuffer[LIndex], LStr[1], LLen);  
  97.   
  98.   Memo1.Lines.Add(LStr);  
  99. end;  
  100.   
  101. procedure TForm3.FormCreate(Sender: TObject);  
  102. begin  
  103.   FMemoryStream := TMemoryStream.Create;  
  104.   
  105. end;  
  106.   
  107. procedure TForm3.FormDestroy(Sender: TObject);  
  108. begin  
  109.   FMemoryStream.Free;  
  110. end;  
  111.   
  112. end.

 http://blog.csdn.net/procedure1984/article/details/5419454

原文地址:https://www.cnblogs.com/findumars/p/5087578.html