关于构件的流控制(100分)

  • 主题发起人 主题发起人 abchjb
  • 开始时间 开始时间
A

abchjb

Unregistered / Unconfirmed
GUEST, unregistred user!
本人因为工作关系,在TQuickRep基础上编写了TInvoice构件,
在用WriteComponentResFile存储时可以,但在用ReadComponentResFile总是出现 EClassNotFound 异常.
本人查找帮助,可能和TReader有关,尤其是DefineProperties
但本人对流控制不熟悉,有劳各位仁兄帮忙!
 
Hi abchjb

你的问题一般很少遇到, 因为通常我们写自己的控件时极少使用TReader/TWriter,
除非见到你的构件的全部源代码, 否则无法知道问题具体位置
 
你在调用ReadComponentResFile的时候要这样用:
var Invoice1:TInvoice;
begin
...
Invoice1:=TInvoice.Create(Self);
...//做好Invoice1的初始化工作,比如设置parent
ReadComponentResFile(FileName,Invoice1);//Instance 设为Invoice1
...//这样就OK了!
end;
其他类似的用Stream或TWriter/TReader读写控件也要注意这个问题,就是要
初始化一个实例再传给读控件的函数。
不初始化也可以,取而代之的是要先调用RegisterClass(TInvoice),如下:
var Invoice1:TInvoice;
begin
...
RegisterClass(TInvoice);
Invoice1:=ReadComponentResFile(FileName,nil);//Instance 设为nil
Invoice1.Parent:=self;//可视控件要设parent属性
...//这样就OK了!
end;
就是说如果没有传入一个类的实例对象的话,就要先登记这个类。
 
我很久以前作的一个程序,也用到了存取Component,但用的是:

//save:
sFile := TFileStream.Create(FileName,fmOpenWrite);
sFile.WriteComponent(TheComponent);
sFile.Free;
//load
lFile := TFileStream.Create(FileName,fmOpenRead);
lFile.ReadComponent(TheComponent);
lFile.Free;

并且也没有初始化TheComponent,但是没有问题,提出来供大家参考。

顺便说一句:当初就是因为觉得TReader/TWriter太麻烦,
才用这个方法,方便的多,因此建议你也试一下。
 
我曾经如下做法,将TQuickRep存到TFileStream中,并能恢复.

const AResFile: string = 'c:/test.stm';
procedure TForm1.SaveToFile;
var Stream: TFileStream;
CName: string;
begin
CName := Copy(QuickRep1.ClassName, 2, 99);
Stream := TFileStream.Create(AResFile, fmCreate);
try
Stream.WriteComponentRes(CName, QuickRep1);
finally
Stream.Free;
end;
end;

procedure TForm1.LoadFromFile;
var Stream: TFileStream;
begin
Stream := TFileStream.Create(AResFile, fmOpenRead);
try
for I := QuickRep1.ComponentCount - 1 downto 0 do
QuickRep1.Components.Free;
Stream.ReadComponentRes(QuickRep1);
finally
Stream.Free;
end;
end;

请教您的TInvoice构件是派什么用场的?
 
那么,dwwang,这个TheComponent是nil吗?
 
写的时候当然不会是nil,但读的时候确实没有initialize.
仅仅有声明.

请看delphi的帮助:

If Instance is nil, ReadComponent constructs a component
based on the type information in the stream and returns
the newly-constructed component.
 
确实如此,那么Stream读写Component是不需要自己调用RegisterClass的。
但是ReadComponentResFile以及TReader.ReadComponent是需要的。
可见还是用Stream方便。
 
嘻嘻!多谢。

tqz兄好像有一段没来嘛!被人超过不少。
这两天一回来就又飞速上升,可见功力不凡。
 
//shy
果酱果酱
小的初学...
 
Hi! Thank You! tqz!dwwang!
小弟按照各位方法已经成功!
但RegisterClasses只能在Application中初始化,在控件中的
Register中则不能成功,Why?
另外,各位知晓TQRDesigner的用法吗?
如果我想在应用中使用TQRDesigner应如何处理? TDesigner?

告YYSun:
本人为了写单据的方便编写TInvoice及相关控件,
另外有EndUser Editor, like TEditor 所以储存TInvoice!

再次Thanks!

Because I use BIG5 WIN95, I must write the simpilies
chinese in RichWin.
So have some character can not type! Sorry!
 
为什么还要用registerclass呢?

如果真想把自己的控件加到componentPalette上,可以多看看例子嘛。
 
tqz:

说句玩笑你别生气,看了你那些‘自导自演’的问题,
真快相信你是初学了。
 
abchjb,您的100分打算如何分配呢?
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部