关于TPersistent及其子类打包成Package的问题。(100分)

  • 主题发起人 主题发起人 南京男生
  • 开始时间 开始时间

南京男生

Unregistered / Unconfirmed
GUEST, unregistred user!
关于TPersistent及其子类打包成Package的问题。

本人写了一个RegisterClass的例子,本意是希望从TPersistent继承下来的
类打包成Package,同时不必要公开类的源码而使安装此Package的用户在设计态
(Design Time)时实用包中的类。

如下:
unit pakg;

interface

uses
SysUtils, Windows, Messages, Classes ;

type
PPP=class(TPersistent)
public
constructor Create;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterClass(PPP);
end;

constructor ppp.Create;
begin
inherited Create;
end

end.

编译通过后安装成功。

可为另建工程文件中作如下编码时却编译不通过,在//**********行提示未PPP未定义。
请高手诊断。


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
p:PPP;//**********
begin
p:=ppp.create;
end;

end.
 
RegisterClass(PPP);
改為
RegisterComponent(....);
如果設計成BPL的調用形式,也不是這樣做的。
Initialization
RegisterClass(ppp);
Finalization
UnRegisterClass(ppp);
調用則用LoadPackage(...)
。。
 
呵呵,抱歉,这阵子忙,没来得及回答,先按楼上说法做做试试看.
 
呵呵,抱歉,这阵子忙,没来得及回答,先按楼上说法做做试试看.
 
to hiyaolee:
还是不行。
RegisterComponents()函数不行,因为此函数是用来注册
TComponent及其派生类的,对于TPersistent及其子类不能用;
采用BPL的方法也不行,还是请高手们改写我前面的例子,我
的邮箱:liaotom@sina.com
 
既然是采用RegisterClass
那么调用的时候就不能采用 P:=PPP.Create;这种方式,而应该是
P := FindClass('PPP').Create;
至于如何调用PPP的方法,可能就要借助接口或纯抽象类了,把P定义为接口或抽象类。
而在PPP的类实现中必须实现那个接口或从那个抽象类继承下来。
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1687832
 
多人接受答案了。
 
后退
顶部