if inputquery('请输入字符串','输入',Str1) then
  begin
    StrStream:=TMemoryStream.Create;
    StrStream.Position:=0;
    StrStream.Write(Str1,length(str1));
    StrStream.Position:=0;
    StrStream.Read(Str,StrStream.Size);
    messagedlg(str,mterror,[mbok],0);
    StrStream.Free;
  end;
如果我将StrStream、Str、Str1都定义成全局变量,那么运行时是没有问题的,但是如果我全定义成函数内部的变量,那么当运行到StrStream.free的时候就会出现问题:Access violation at address 00404504 in module'porject.exe'.Read of address 00013700.请问为什么会出现这个问题,能不能解决(变量要在函数内部定义)

解决方案 »

  1.   

    写字符串先把字符串得长度写入stream中
      

  2.   

    if inputquery('请输入字符串','输入',Str1) then
      begin
        StrStream:=TMemoryStream.Create;
        StrStream.Position:=0;
        StrStream.Write(Str1,length(str1));
        StrStream.Position:=0;
        StrStream.Read(Str,StrStream.Size);
        messagedlg(str,mterror,[mbok],0);
        StrStream.Clear;//在这儿加一个clear就没问题了!
        StrStream.Free;
      end;
      

  3.   

    你的Str1的长度太长的原因 我刚刚试了 还是会出现问题 如果不是很长的话就不会出问题了
      

  4.   

    len := length(str);
    stream.write(len,sizeof(len));
    if len > 0 then
      stream.write(str[1],len);stream.postion := 0;
    stream.read(len,sizeof(len));
    if len > 0 then
       steam.read(str[1],len);
      

  5.   

    procedure TForm1.Button1Click(Sender: TObject);
     var
     Str1:string;
    begin
    if inputquery('请输入字符串','输入',Str1) then
        messagedlg(str1,mterror,[mbok],0);
    end;这样可以吗??为什么要用MemoryStream
      

  6.   

    老兄,我得目的就是要用MemoryStream,因为我有一个压缩的控件,输入参数和输出参数都是TStream类型,但是我要从获得的数据和需要保存的书籍都是字符串