怎么把组件里的内容转成流,需要时再将流转成原来的内容。(50分)

  • 主题发起人 易名烦
  • 开始时间
那你改成 BinStream.Position := 0; 试一试?

不过这不是主要问题,我刚才说了,你读和写的时候用的方法是不一样的。
 
[blue]你写的时候是用的二进制流[/blue],[red]读的时候也应该用二进制流[/red]:
BinStream := TMemoryStream.Create;
AD1.Fields.FieldBYNAME('MESSAGEPARTS').SaveToStream(BinStream);
BinStream.ReadComponent(TComponent(MESSAGEPART));

不过记住,你的 MESSAGEPART 是在局部函数中定义和创建的
出了函数过后就没有用了!!!要用全局变量!
 
我改为:
procedure TForm1.Button5Click(Sender: TObject);
VAR
BINSTREAM:TMEMORYSTREAM;
MESSAGEPART:TIDMESSAGEPARTS;
begin
IF NOT AD1.Active THEN
AD1.Open;
MESSAGEPART:=TIDMESSAGEPARTS.Create(APPLICATION);
BINSTREAM:=TMEMORYSTREAM.Create;
TBLOBFIELD(AD1.FieldByName('MESSAGEPARTS')).SaveToStream(BINSTREAM);
BINSTREAM.Seek(0,SOFROMBEGINNING);
BINSTREAM.ReadComponent(TCOMPONENT(MESSAGEPART));
......................
END;
再在提示:Stream read error;
好象错在:BINSTREAM.ReadComponent(TCOMPONENT(MESSAGEPART));
 
那你像刚才那样:
S := TComponent(MESSAGEPART);
BINSTREAM.ReadComponent(S);
这样呢?
 
还是同样的:Stream read error!
 
to jsxjd:
我就是参照DELPHI帮助里的代码写的!
 
TBLOBFIELD(AD1.FieldByName('MESSAGEPARTS')).SaveToStream(BINSTREAM);
BINSTREAM.Seek(0,SOFROMBEGINNING);
[red]ShowMessage(IntToStr(BinStream.Size));[/red]
看看这个对话框弹出什么?

还有,这样试一试:
TComponent(MESSAGEPART) := BinStream.ReadComponent(nil);
试一试?
 
着了,我发现是我写入数据库时出错了,大小只有4。
 
呵呵,找到问题就好,回过头去看看问题再说吧
 
着起了,我不知道怎么办了?
 
你再在这里看看:
messagepart.WriteComponent(tcomponent(msg.MessageParts));
messagepart.Seek(0,sofrombeginning);
[red]ShowMessage(IntToStr(messagepart));[/red]
看看这是多少?
 
先前我就看了,也只有4,怎么办?一定要帮我啊!
 
那说明根本就没有写进去,你的 MessageParts 是不是从 TComponent 继承的啊?
要是不是,你只能自己写转换代码了,如果 MessageParts 本身并不复杂的话,
这个转换也不会很难吧。

 
啊,我死了,我不会啊!
 
那个类值得你保存的属性就那么几个嘛,即使是用最笨的办法,将每个要转换的
属性变为字符串,然后加入一个 TStringList,最后将该 StringList 的 Text
保存到数据库就可以了啊。

 
你当然不能把整个对象一次性写到 MemoryStream 中,我的意思是你自己一个属性
一个属性地写:(我不知道 MESSAGEPART 的结构,随便举例,你自己举一反三吧)

funtion MessagePartToStr(MESSAGEPART: TMESSAGEPART): string;
var
List: TStringList;
begin
List := TStringList.Create;
List.Add(MESSAGEPART.Msg); // 若 Msg 是字符串型
List.Add(IntToStr(MESSAGEPART.MsgCount)); // 若 MsgCount 是整型
Result := List.Text;
List.Free;
end;

procedure StrToMessagePart(Str: string; MESSAGEPART: MESSAGEPART);
var
List: TStringList;
begin
List := TStringList.Create;
// 注意读出来的顺序要跟刚才写的顺序一致!
MESSAGEPART.Msg := List[0];
MESSAGEPART.MsgCount := StrToInt(List[1]);
List.Free;
end;

这样你看懂了吗?

我还要赶数据库试验报告,我已经用 Word 写了20页了,重头戏才刚开始写,
明天要交了,真可怜:(
 
BETA师兄,有坐机吗?
我想打电话讨教。
 
可是要用的东西没一个是字符串啊数据啊什么的。
我用TSTRINGS()强转出错。
 
那是什么类型啊?
 
tidmessageparts!是INDY的东东!
 
顶部