简单数据流(Stream)的问题(200分)

  • 主题发起人 delphi英雄
  • 开始时间
D

delphi英雄

Unregistered / Unconfirmed
GUEST, unregistred user!
怎样把字符串或者XML文件转换成Stream流的格式?然后怎样读取Stream流中指定字符串
(如:namealias="??" )的值?
 
把字符串或者XML文件转换成Stream流的格式:
var
x: string;
s: StringStream;
begin
x := '字符串';
s := TStringStream.Create(x);
// 现在,s 就是内容为字符串 x 的数据流(stream)
...
s.Free;
end;
直接读取会比较麻烦,需要直接分析。
建议用 msxml,微软提供的控件,处理 XML 数据相当简单。相关文章也比较多。
(大富翁就用了这个东西:))
 
使用流的时候,可以配套使用TReader和TWriter,在XML以前,俺的程序都是这么写的。
Delphi的Form二进制码就是这么写的。
写流:
proceduer WriteToStream(Stream: TStream);
var
writer: TWriter;
begin
writer := TWriter.Create(stream,4096);
try
writer.writestring('..');
writer.writeinteger(age);
writer.writeboolean .....
finally
writer.free;
end;
end;
读流:
procedure ReadStream(Stream: TStream);
var
reader: TReader;
begin
reader := TReader.Create(stream, 4096);
try
aa := reader.readstring;
bb := Reader.readinteger;
cc := Reader.readboolean;
......
finally
reader.free;
end;
end;
注意写的顺序和读的顺序要保持一致,否则就读不出来了。赫赫
更详细的请看看TReader和TWriter的源代码
 
谢谢各位关心,我还要说详细一点,我是用于在客户端的TClientDataSet组件中接收服
务器传送过来的流数据的,这个流数据包含有我们自定义的信息(如:namealias="QQ" ),
怎么才能在继承LoadFromStream方法的基础上增加读取自定义信息的功能?

 
看来你还需要说得再详细点,你的自定义信息是怎么包含在服务器传过来的数据中的,
还有。。。
 
如果里面有你们自定义的内容,那么恐怕没有更简单的办法了:(
假设你的自定义内容以空格结束:
function GetInfo(SourceStream: TStream; Info: string): string;
var
x: string;
s: StringStream;
i: Integer;
begin
s := TStringStream.Create('');
s.LoadFromStream(SourceStream);
x := s.DataString;
s.Free;
i := Pos(Info, x) + 1; // + 1 是跳过 '='
x := Copy(x, i + Length(Info) + 1, MaxInt);
i := Pos(' ', x); // 搜索结束的空格
Delete(x, i, MaxInt);
// 现在,字符串 x 里面就是 'QQ' 了
Result := x;
end;

使用:
s := GetInfo(aStream, 'namealias');
ShowMessage(s); // 'QQ'

麻烦吧:)
 
这样更有通用性吧:
procedure GetInfo(SourceString: string; strStart,
strEnd: string; lstFind: TStringList);
var
y: string;
i,j: Integer;
begin
SourceString:=Trim(SourceString);
i := Pos(strStart, SourceString); // 查找开始的'strStart'字符。
while i>0 do
begin
SourceString := Copy(SourceString, i + Length(strStart), MaxInt);
j := Pos(strEnd, SourceString); // 查找结束的'strEnd'字符。
y := Copy(SourceString,0,j-1);
if lstFind.IndexOf(Trim(y)) = -1 then
lstFind.Add(Trim(y));
i := Pos(strStart, SourceString); // 重新查找开始的'strStart'字符。
end;
end;
 
顶部