BPL与继承的问题,各位大侠救急啊!!待会就要演示了!!如果分不够再加!(200分)

G

Grape

Unregistered / Unconfirmed
GUEST, unregistred user!
我的程序是一个主程序加上数个BPL组成的,每个BPL是一个功能模块,BPL中的窗体都是从一个
父类窗体(TBaseForm)继承下来的,这样的话,就是说每个Package中都包含了这个父类窗体的单
元,我用主程序调用BPL的时候,第一个调用的BPL(假设为A.bpl)没有问题,OK,可是调用其
他BPL(比如B.bpl)的时候,就会报错:
“Cannot load package 'B', It contains unit 'BaseForm,'
which is also contained in package 'A'”

请问这是什么原因造成的,如何解决?多谢多谢
 
这说明a.bpl里和b.bpl里含有相同的单元baseform,两者只能存其一,你可以把baseform从a.bpl
和b.bpl里去掉,单独作一包.
 
to louhong:
应为BPL中的所有窗体都是从BaseForm继承下来的,如果吧BaseForm单独作一个Package的话,
A中的From如何继承BaseForm这个类呢?(我这里的继承就是new 一个Form的时候从Delphi IDE里
的File->New->other 选项目那一页,再选BaseForm)
 
"就是说每个Package中都包含了这个父类窗体的单元"
晕!!!有必要吗?????
原因就在你在多个包里引用了同一个基类窗体!!
 
你先加载那个包含基本窗体的包, 然后别的就不要包含了.
 
to 无忧鱼
有必要!父窗体中有一些通用代码,而且界面风格也可以定好,
要不这么多开发人员作出来的东西肯定不一致。
 
to kkyy:
哪一个包先加载是不一定的,而且其他包不包含的话,里面的Form如何继承呢?
 
就是说,你的所有的BPL里面都有这个BaseForm单元,所以不同的BPL之间发生了冲突,
所以,我想您应该把只包含这个BaseForm的单元单独作一个BPL,然后现在的各个BPL里面
不在有这个BaseForm就应该OK了吧!
祝您好运!
 
to 宁柯
你的建议和louhong是一样的,我觉得也不错,但是这样做的话还是有问题。
[purple] 因为BPL中的所有窗体都是从BaseForm继承下来的,如果把BaseForm单独作一个Package的话,
A中的From如何继承BaseForm这个类呢?(我这里的继承就是new 一个Form的时候从Delphi IDE里
的File->New->other 选项目那一页,再选BaseForm)[/purple]
 
To:Grape
哦 可能按您说得是有问题,不如这样吧!
你把每个包含BaseForm的BPL里面的BaseForm类的名称改变一下,比如说:第一个BPL里面的
BaseForm叫做aBaseForm,第二个叫做bBaseForm,这样虽然每个BaseForm窗体都一样,但是
不同BPL里面BaseForm的名称不一样,就不会出现问题了吧!
我曾经这样试过,应该没有问题,您试试吧!
 
你要这样做窗体继承就只能把基类的窗体都放到单独的一个公共包中去。
新增继承窗体的时候可以先在公共包中新增,新增完后保存移出来,加到
新的模块包中去。或者你先新增好一个干净的继承窗体,每次直接复制就
用。
另外,要把这个公共包和你的模块包一起放到同一个项目组中,然后把整个
项目组一起打开,否则你的模块包中的窗体没法打开。
 
你们是不是将问题复杂化了?
首先不同的BPL中包含同一个UNIT肯定是不行的,
也没有必要将BaseForm单独做一个包。
解决办法:
A.BPL中包含BaseForm单元,
B.BPL或其它包中不要加入BaseForm单元,但在DPK的Requires中加入A.DCP
用到TBaseForm的单元中Uses BaseForm单元,然后:
TNewForm=class(TBaseForm)
...

 
to 宁柯,京工之鸟
复制->重命名的方法肯定是可行的,京工之鸟的其他方法应该也是可以的,多谢两
位,保命的法子有了,俺还想看看有没有更好的方法,毕竟仅仅创建一个窗体就要花如
此多的时间和繁琐的过程,对程序的开发进度和以后的维护都是很麻烦的事情。[:)][:)]

to Shuzi:
似乎不行吧,每个package都是平等地,要么都包含要么都不包含,因为并不知道哪个
bpl被先调用,或者根本不被调用,而且
[blue]用到TBaseForm的单元中Uses BaseForm单元,然后:
TNewForm=class(TBaseForm)
...[/blue]
这样可行么?
 
嘿嘿,我早就说过,BPL是中看不中用的东西,实际上麻烦得很,特别是以后维护的时候。
 
可以的,我们都是这样用
你可以这样作一个试验:
新建一个窗体:
TForm1=class(TForm)
...
你把class(TForm)换成class(TBaseForm)
Uses子句中加入BaseForm
如果捆包编译,将你包含BaseForm单元的包A.BPL加入到Build With...中,
如果不捆包编译,设置好工程的搜索路径
 
我是用DLL,虽然老土,好象还能用。
 
唯一的解决办法:
把BaseForm放入一个单独的BaseBpl中,然后其他BPL不是直接引用BaseForm,而是引用
BaseBpl。
 
to 宁柯:你的方法看起来是可行的,但是这种方法是在浪费资源!
to 京工之鸟:你的第一种方法是最好的,但第二种方法我不赞同
to Grape:BPL的运用方法看起来你还不熟,其实我觉得非常好用,关于后期维护方面,我从
不认为它很麻烦,而且不用BPL还比它麻烦。所谓有所得必有所失。
还有如果你所谓的继承只是继承几个按钮与几个GRID的话,我看你不要用
继承窗体了,因为你根本就没有将父类窗体发挥到最大的共享代码的限度。如果你有一套非常
好的开发基类再加上BPL的效果将非常爽,当然这也造成了后期维护麻烦。但这不是BPL惹的
祸!
 
同意SHUZI的说法一定可行!
 
顶部