关于TMemoryStream,这段代码中的Write()怎么用?

wm7523 2003-08-21 10:14:37
procedure TForm1.SaveCtrls(Stream: TMemoryStream);
const
EditorFlag =$10000;
var
Flag:LongInt;
Ctrl:TControl;
begin
for i:=0 to ControlCount-1 do
begin
Ctrl:=Controls[i];
if(Ctrl is TEditor)then
begin
Flag:=EditorFlag+Ord(TEditor(Ctrl).CtrlType);
Stream.Write(Flag,sizeof(LongInt));
TEditor(Ctrl).SaveToStream(Stream);
end;
end;
Flag:= 0;
Stream.Write(Flag,sizeof(LongInt));
end;

这里面的Stream.Write()怎么用,
这句话Stream.Write(Flag,sizeof(LongInt));起什么作用,我看了帮助,它说第一个参数为将要写入数据的缓冲区

,但是这里把什么写到里面了呢
急急解决马上结贴
...全文
67 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
baguli 2003-08-21
  • 打赏
  • 举报
回复
上述代码我没太看明白,干什么用?
我猜想Stream.Write(Flag,sizeof(LongInt));//这句什么作用?
是一个TEditor记录的开始。
后一个Stream.Write(Flag,sizeof(LongInt));
是写入一个结束符
wm7523 2003-08-21
  • 打赏
  • 举报
回复
怎么没有人邦忙呀
wm7523 2003-08-21
  • 打赏
  • 举报
回复
up有分
wm7523 2003-08-21
  • 打赏
  • 举报
回复
begin
for i:=0 to ControlCount-1 do
begin
Ctrl:=Controls[i];
if(Ctrl is TEditor)then
begin
Flag:=EditorFlag+Ord(TEditor(Ctrl).CtrlType);
Stream.Write(Flag,sizeof(LongInt));//这句什么作用
TEditor(Ctrl).SaveToStream(Stream);
end;
end;
Flag:= 0;
Stream.Write(Flag,sizeof(LongInt));//这句又什么作用
end;
请高手解释
wm7523 2003-08-21
  • 打赏
  • 举报
回复
太感谢大家了,我明白了一些了,
如果再没有回复的话准备结贴...
lxpbuaa 2003-08-21
  • 打赏
  • 举报
回复
“那么我要想把top,left,width读出来是不是还是要按顺序读呢?”
是的。
如果是对数组类操作,如字符串、数组等,写入的时候应该加上起始位子,否则可能出错,入:
var
S: String;
stream.write(s, sizeof(s));
应该是
stream.write(s[1], sizeof(s));

————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————

zhangheaaa 2003-08-21
  • 打赏
  • 举报
回复
Stream: TMemoryStream 是获取内存流的变量
Stream.Write(Flag,sizeof(LongInt));是直接操纵内存流变量,将flag写入内存流
TEditor(Ctrl).SaveToStream(Stream);是调用teditor的函数方法将该editor的信息写入内存
cristinehowe 2003-08-21
  • 打赏
  • 举报
回复
是这样的,先进先出
不过要记得Stream.Position=0
wm7523 2003-08-21
  • 打赏
  • 举报
回复
比如我写时这样
top=100;
left=200;
width=220;
stream.write(top,4);
stream.write(left,4);
stream.write(width,4);
那么我要想把top,left,width读出来是不是还是要按顺序读呢
var h:longint;
stream.read(h, 4);
top = h;
stream.read(h, 4);
left = h;
stream.read(h, 4);
width = h;

这样对吧,

如果要是串的话呢,
var s:String;
a: string;
用stream.write(s, sizeof(s));读
用stream.read(a, length(s));取
是这样吧




lxpbuaa 2003-08-21
  • 打赏
  • 举报
回复
write和 writebuffer的唯一区别是:
如果writebuffer操作不成功,会激发异常而write不会。

————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————
lxpbuaa 2003-08-21
  • 打赏
  • 举报
回复
function Write(const Buffer; Count: Longint): Longint;
将Count字节长度的Buffer数据写入流中。

Stream.Write(Flag,sizeof(LongInt));
意思是将整数Flag写入流。sizeof(LongInt)结果为4,因为一个LongInt类型整数占用4个字节。

————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————
wm7523 2003-08-21
  • 打赏
  • 举报
回复
up有分,不够可再加分,今天我必须解决了
IORILI 2003-08-21
  • 打赏
  • 举报
回复
up 学习才是硬道理
wm7523 2003-08-21
  • 打赏
  • 举报
回复
谁能讲一下TmemoryStream的write, writebuffer的用法,谢谢
wm7523 2003-08-21
  • 打赏
  • 举报
回复
急急急
wm7523 2003-08-21
  • 打赏
  • 举报
回复
procedure WriteStream(Stream:TStream;const s:string);
var
iLen:Integer;
begin
iLen:=Length(s);
Stream.Write(iLen,Sizeof(iLen));
if(iLen>0)then begin
Stream.WriteBuffer(Pointer(s)^,iLen);
end;
end;
那这个可以看明白了吧这里也有一个
Stream.Write(iLen,Sizeof(iLen));
我查了一些贴子,但还是弄不明白

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧