想使用Stream进行Socket开发,在用到TMemroyStream一直不能走出阴影,求解!!
就拿sting做例子,本意是想将2个string进行合并使用流的方式,可总不能达到预期效果,看代码:procedure TForm1.Button1Click(Sender: TObject);
var
size: Integer;
s1, s2, s3: string;
m1, m2: TMemoryStream;
begin
m1 := TMemoryStream.Create;
m2 := TMemoryStream.Create; size := 5;
s1 := 'ABCDE'; s2 := '12345'; s3 := ''; m1.WriteBuffer(s1, size);
m2.WriteBuffer(s2, size); m1.Seek(0,soFromEnd);
m2.Seek(0,soFromBeginning);
m1.CopyFrom(m2, m2.Size); m1.Seek(0, soFromBeginning);
m1.ReadBuffer(s3,m1.Size);
ShowMessage(s3); m2.Clear;
m1.Clear;
m2.Free;
m1.Free;
end;
其结果是ABCDE而不是我想要的ABCDE12345,并且还会包内存错误!
就拿sting做例子,本意是想将2个string进行合并使用流的方式,可总不能达到预期效果,看代码:procedure TForm1.Button1Click(Sender: TObject);
var
size: Integer;
s1, s2, s3: string;
m1, m2: TMemoryStream;
begin
m1 := TMemoryStream.Create;
m2 := TMemoryStream.Create; size := 5;
s1 := 'ABCDE'; s2 := '12345'; s3 := ''; m1.WriteBuffer(s1, size);
m2.WriteBuffer(s2, size); m1.Seek(0,soFromEnd);
m2.Seek(0,soFromBeginning);
m1.CopyFrom(m2, m2.Size); m1.Seek(0, soFromBeginning);
m1.ReadBuffer(s3,m1.Size);
ShowMessage(s3); m2.Clear;
m1.Clear;
m2.Free;
m1.Free;
end;
其结果是ABCDE而不是我想要的ABCDE12345,并且还会包内存错误!
m1.WriteBuffer(s1[1], size);另外,流是自己可以拼接的
m1.WriteBuffer(s1[1], size);
m1.WriteBuffer(s2[1], size);
就可以完成你那一大堆代码所做的事了,没必要弄两个流对象
这里你的s3没有分配内存,要先setlength(s3,10); 否则肯定会报内存错误而且同样要改成
m1.ReadBuffer(s3[1],m1.Size);