var
  ms: tmemorystream;
  i, k: integer;
  s1, s2: string;
begin
  ms := tmemorystream.Create;
  i := 100;
  ms.Write(pinteger(i), sizeof(i));
  ms.Position := 0;
  ms.Read(k, sizeof(i));
  text := inttostr(k); // OK
  ms.Clear;
  s1 := 'hello world';
  ms.Write(pchar(s1)^, length(s1));
  ms.position := 0;
  ms.Read(s2, length(s1)); // 读不出。
  text := s2; // 出错。
  ms.free;
end;

解决方案 »

  1.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      ms: tmemorystream;
      s1,s2:String;
    begin
      ms := tmemorystream.Create;
      try
        s1 := 'hello world';
        ms.Write(s1[1], length(s1));  //s1[1]开始才是字符串数据
        ms.position := 0;
        setlength(s2,length(s1));  //下一句要用到s2[1],所以要先分配内存.
        ms.Read(s2[1], length(s1));
        label1.Caption := s2;
      finally
        ms.free;
      end;
    end;
      

  2.   

    var
      ms: tmemorystream;
      s1,s2:String;
    begin
      ms := tmemorystream.Create;
      try
        s1 := 'hello world';
        ms.Write(s1[1], length(s1));  //s1[1]开始才是字符串数据
        // ms.write(pchar(s1)^, length(s1));
        ms.position := 0;
        setlength(s2,length(s1));  //下一句要用到s2[1],所以要先分配内存.
        ms.Read(s2[1], length(s1)); // ^^是啊,但为什么平时使用string的时候不用分配?现在又要手工分配?
        // ms.read(pchar(s2)^, length(s1));
        label1.Caption := s2;
      finally
        ms.free;
      end;
    end;
      

  3.   

    String是动态分配内存的.平时使用到它(比如说s:='hello world';)的时候就会自动分配内存。但是用s[n]的形式访问时一定要先分配内存才行。