一个很简单的问题???流手来看看(100分)

  • 主题发起人 主题发起人 天真
  • 开始时间 开始时间

天真

Unregistered / Unconfirmed
GUEST, unregistred user!
var s,s1 :string;
temp : tMemorystream;
begin
temp := tmemorystream.create(self);
s := 'aaaa';
temp.write(s,length(s));//改成temp.write(s,length(s)*sizeof(s))
s1 := temp.read(s,temp.size);
showmessage(s1); //这出错
end;
为什么,我以前看到过的,现在忘了,请多帮忙◎◎◎!!!
 
在说明白线行吗/
 
procedure writestring(MS:TMemoryStream;const Str:string );
var
Len: Integer;
begin
Len := Length(Str);
MS.Write(Len, SizeOf(Integer));
if Len > 0 then MS.Write(PChar(Str)^, Len);
end;

function readstring(MS:TMemoryStream):string;
var
Len: Integer;
begin
Result := '';
MS.Read(Len, SizeOf(Integer));
if Len > 0 then
begin
SetLength(Result, Len);
MS.Read(Pointer(Result)^, Len);
end;
end;

-------------

var
MS:TMemoryStream;
begin
MS:=TMemoryStream.Create(self);
writestring(MS,'Write a String1!');
writestring(MS,'Write a String2!');
MS.Position :=0;
showmessage(readstring(MS));// Write a String1!
showmessage(readstring(MS));// Write a String2!
MS.Free;
end;

大致这样,没有很好的测试!

你可以参照writestring和readstring,从TMemoryStream继承建一个类,把这两个过程
作为扩展的方法添加进去,算了,给你写完整吧!好用,测试过的!

unit WSStream;

interface

uses
classes;

type
TWSStream = class(TMemoryStream)
public
procedure WriteString(Const Value:String);
function ReadString:String;
end;

implementation

{ TWSStream }

function TWSStream.ReadString: String;
var
Len: Integer;
begin
Result := '';
Read(Len, SizeOf(Integer));
if Len > 0 then
begin
SetLength(Result, Len);
Read(Pointer(Result)^, Len);
end;
end;

procedure TWSStream.WriteString(const Value: String);
var
Len: Integer;
begin
Len := Length(Value);
Write(Len, SizeOf(Integer));
if Len > 0 then Write(PChar(Value)^, Len);
end;

end.
 
昏倒,世界上不是有个东西叫TStringStream吗?

》temp := tmemorystream.create(self);
这个SELF是啥?
 
哈哈哈,我也晕倒,世界上原来还有个东西叫TStringStream,我还研究了半天,搞了个TWSStream,糗!
 
SELF就是.create的那个“.”前面的东东:)
 
呵,不好意思,(SELF)是不用写的,那回一不小心写上去,但我的测试程序中没有的,
大家帮我想想吧!
 
var temp : tmemorystream;
s1,s :string;
begin
temp :=tmemorystream.Create;
s := 'aaaa';
temp.SetSize(length(s)*sizeof(s));
temp.Position := 0;
temp.write(s,length(s)*sizeof(s));
temp.Position :=0 ;
temp.read(s1,temp.size);
showmessage(s1);
temp.Clear ;
temp.free;
///为什么会出错,运行到最后的时候????
 
需要吗?pchar就够了,何必自找麻烦。
 
Chenlili,能否写个简单的???
 
确实是由于String引起的,由于在String的最前面有一位是用于存放字符串长度的,而此位
是你所不能访问的,所以尽量不要用String做Buffer,改用Pchar或是Array of Char;
还有,你的temp.setsize是不需要的,而且你的Buffer的Size也不对,不用再*SizeOf了。
var temp : tmemorystream;
s1,s :array[1..5] of char;
begin
temp :=tmemorystream.Create;
s := 'aaaaa';
// temp.SetSize(length(s));
// temp.Position := 0;
temp.write(s,length(s));//*sizeof(s));
temp.Position :=0 ;
temp.read(s1,temp.size);
showmessage(s1);
temp.Clear ;
temp.free;
end;
 
以前在李颖的程序里发现一些函数,还是很有用的。

function ReadString(Stream:TStream):String;
begin
SetLength(Result,ReadInteger(Stream));
if Length(Result)>0 then
Stream.Read(Result[1],Length(Result));
end;

procedure WriteString(Stream:TStream;Value:String);
begin
WriteInteger(Stream,Length(Value));
if Length(Value)>0 then
Stream.Write(Value[1],Length(Value));
end;

procedure WriteInteger(Stream:TStream;Value:Integer);
begin
Stream.Write(Value,SizeOf(Value));
end;

function ReadInteger(Stream:TStream):Integer;
begin
Stream.Read(Result,SizeOf(Result));
end;

 
教父老乡,看到你的回答,真的高兴:)
也谢谢大家了,!!!
 
多人接受答案了。
 
后退
顶部