问题在哪里? Twrite treader

风之谷 2009-12-18 03:20:27
  s:=TFileStream.Create('D:\A.txt',fmOpenWrite);
Writ:=TWriter.Create(S,SizeOf(My.InstanceSize));
Writ.Root:=Self;
Writ.WriteSignature;
// Writ.WriteComponent(btn1);
Writ.WriteListEnd;
Writ.Free;
s.Free;


写入 btn1为按钮

读出

var
Reader:TReader;
s:TFileStream;
tv:TButton;
begin
s:=TFileStream.Create('D:\A.txt',fmOpenRead);
S.Position:=0;
Reader:=TReader.Create(S,4096);
tv:=TButton.Create(Self);
tv.Parent:=Self;
tv:=TButton(Reader.ReadComponent(nil));
...全文
122 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
风之谷 2009-12-21
  • 打赏
  • 举报
回复
没人回答啊?
Jekhn 2009-12-21
  • 打赏
  • 举报
回复
按照书上所说你要实现持久化,你的类必须要从TComponent继承下来,并且要重写DefineProperties方法。你举的btn例子用TStream的ReadComponent及WriteComponent方法就可以实现了。下面是自己写的,在Inside VCL里面有许多例子。

procedure TForm1.Button1Click(Sender: TObject);
var
aBtn: TButton;
begin
aBtn := TButton.Create(Self);
aBtn.Parent := Self;
aBtn.Caption := 'Test';
aBtn.Left := 10;
ms.WriteComponent(aBtn);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
abtn: TButton;
begin
try
Classes.FindClass('TButton')
except
Classes.RegisterClass(TButton);
end;
abtn := TButton(ms.ReadComponent(nil));
aBtn.Parent := Self;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ms := TMemoryStream.Create;
if FileExists('btn.data') then
ms.LoadFromFile('btn.data');
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
ms.SaveToFile('btn.data');
FreeAndNil(ms);
end;
风之谷 2009-12-21
  • 打赏
  • 举报
回复
Tstream 通过委托的方式实现了 Twriter treader的读写方式,理论上可以写插件的published中的属性,
也可以通过代码控制写入其他信息。

自己的做法,将Object需保存的信息published然后通过tstream进行读写

另外注意 自定义类中的属性 要符合规范,目前发现
property Imgwidth:Integer;GetImgWidth;

FUNCTION Getimgwidth;
RESULT:=fIMG.WIDTH;

这样的方式是行不通的。 如果在类中操作变量中的属性 需在变量中进行 也就是继承先类 重写属性
Jekhn 2009-12-21
  • 打赏
  • 举报
回复
总结在哪里?
风之谷 2009-12-21
  • 打赏
  • 举报
回复
明白了,总结一下
风之谷 2009-12-19
  • 打赏
  • 举报
回复
UPUP
Jekhn 2009-12-19
  • 打赏
  • 举报
回复
既然你的Button要从流里面读出来,那这里就不应该再创建实例了tv:=TButton.Create(Self);
dd_zhouqian 2009-12-18
  • 打赏
  • 举报
回复
我帮顶
风之谷 2009-12-18
  • 打赏
  • 举报
回复
兄弟们帮帮忙啊
风之谷 2009-12-18
  • 打赏
  • 举报
回复
到这一步报错

function TObject.ClassType: TClass;
begin
Pointer(Result) := PPointer(Self)^;
end;

风之谷 2009-12-18
  • 打赏
  • 举报
回复
写入后 删除btn1 持久化它 然后读出 总是报错

是不是我的用法有问题?

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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