DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: cuiqingbo
今日帖子: 20
在线用户: 11
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 akai1203 (w-dins) ★☆☆☆☆ -
普通会员
2021/3/3 22:21:05
标题:
请教一个关于bpl包引用的问题 浏览:1468
加入我的收藏
楼主: 各位D友,我现在有一个common.bpl公共包和bplA、BplB两个业务包,bplA和bplB都在require处引用了 common.bpl公共包,其中,common.bpl包中包含了一个unitCommon 。

遇到的问题:

 程序在动态加载bplA后,提示包引用冲突(我在bplA里的某个单元, uses 了unitCommon 单元),这个要如何解决? 我的业务包bplA需要unitCommon单元中的一个功能?
----------------------------------------------
-把学习当信仰
作者:
男 redhan (晓寒) ★☆☆☆☆ -
盒子活跃会员
2021/3/4 9:48:04
1楼: exe 引用 common.bpl 包
----------------------------------------------
-
作者:
男 akai1203 (w-dins) ★☆☆☆☆ -
普通会员
2021/3/4 9:55:26
2楼: exe是引用了common.bpl包的,问题是我现在要在bplA中要用到common.bpl中的一个类
----------------------------------------------
-把学习当信仰
作者:
男 hnxxcxg (咏南中间件) ★☆☆☆☆ -
盒子活跃会员
2021/3/4 10:15:01
3楼: 把错误截图出来,感觉你没讲清问题。
----------------------------------------------
中间件QQ群: 92449782 博客: http://www.cnblogs.com/hnxxcxg/
作者:
男 akai1203 (w-dins) ★☆☆☆☆ -
普通会员
2021/3/4 10:46:37
3楼: bplA和bplB中的单元都是从common.bpl中的基类窗体继承而来的,unitA和unitB的interface部分也都包含有baseform(common.bpl中),这样没有错误,但是再引用一个unitTool(也在common.bpl中),就会出错,提示 bplA中已经引用了untiTool.pas单元了,奇怪
----------------------------------------------
-把学习当信仰
作者:
男 akai1203 (w-dins) ★☆☆☆☆ -
普通会员
2021/3/4 10:49:41
4楼: unitA和unitB的窗体都是自baseform继承而来(common.bpl中的baseform.pas),unitA和unitB两个单元的interface部分处都包含了baseform单元,为什么这里不出错?但是我再在unitA和unitB 再加一个单元unitTool(这个单元也是在common.bpl中)就会出错了
----------------------------------------------
-把学习当信仰
作者:
男 akai1203 (w-dins) ★☆☆☆☆ -
普通会员
2021/3/4 10:53:53
5楼: bplA和bplB是动态加载的,加载了一个,另外一个就加载不了,提示单元已经包含在**.bpl中了
----------------------------------------------
-把学习当信仰
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2021/3/4 11:02:37
6楼: 使用动态加载包的方式,你这样的架构,容易出问题。


最好就是两个包没有任何关系。

那你如果非要想用到某个包里面的类咋办?
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2021/3/4 11:04:39
7楼: 最好是你的程序和你的包,共同引用一个外部的中间公共的包。而不是互相引用。

另外,单元冲突之类的事情,就是你用了相同的单元嘛。最好就是要用不同的单元。

但你要访问某个包里面的某个类,这个类又是从其它地方继承的,麻烦了。

所以不要用这种方式。

不要直接用类,改用接口。大家都可以引用接口定义单元。包里面的类实现接口,需要调用那个类的方法的地方,调用它实现的接口。

使用接口,可以把耦合降低。
----------------------------------------------
-
作者:
男 akai1203 (w-dins) ★☆☆☆☆ -
普通会员
2021/3/4 11:16:36
8楼: 是的,感谢楼上的建议

像在业务场景中,销售模块肯定要用到库存模块中的库存查询功能,这个时候就会存在一个包要用到另一个包中的功能类了,但是把库存查询功能独立出来又觉得很突兀了,因为只是一个功能而已。

我奇怪的是,为什么两个单元引用一个公共的窗口类没事,但是再引用 一个工具助手类就不行了,这两个被引用的单元都在同一个公共包中呀
----------------------------------------------
-把学习当信仰
作者:
男 tiez (骑牛夜旅) ★☆☆☆☆ -
普通会员
2021/3/4 16:50:50
9楼: 这是单元重复引入的问题。一般在多包开发中常产生此问题。

你将部分功能产单独做成了业务包,那些业务包可能会引用一些公用单元,你主程序和其它业务包也可能引用这些单元,那包含这些单元的基础bpl在业务包或主程序内都应该是以参照包的形式出现。你在做业务包和主程序的时候要指定好这些动态引入的单元就可以了。

很多年前写程序时常碰到这个问题,但很多年不做这种分包的程序了,有些细节记不清了。你自己再多试一下。
----------------------------------------------
-
作者:
男 akai1203 (w-dins) ★☆☆☆☆ -
普通会员
2021/3/4 17:20:59
10楼: 感谢楼上的建议。之前都是用单exe,不熟bpl,我再看看
----------------------------------------------
-把学习当信仰
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2021/3/5 20:00:50
11楼: 楼主,我再次读了你的问题,感觉你的问题不是耦合太紧,是同一个单元,被编译了两次,被编译在两个包里面。然后你同时加载这两个包,就出问题。

你的单元,你编译在 common.bpl,然后你在 X.bpl 里面,也引用那个单元,但你没设置好 x.bpl 的包编译的相关设置,导致你在 x.bpl 里面引用该单元时,DELPHI 把该单元的代码给编译进去了。

我觉得你的问题的原因是这样的。
----------------------------------------------
-
作者:
男 akai1203 (w-dins) ★☆☆☆☆ -
普通会员
2021/3/8 11:04:28
12楼: 楼上兄弟 ,我设置了x.bpl 静态引用common.bpl包
----------------------------------------------
-把学习当信仰
作者:
男 janker (janker) ★☆☆☆☆ -
盒子活跃会员
2021/3/8 11:56:13
13楼: 1、EXE静态加载Base.BPL和Comm.BPL,就是勾上Builderwithruntimepackages并加入Base.BPL和Comm.BPL;
2、bplA和bplB是动态加载Base.BPL和Comm.BPL,同时Contains不能有任何与Base.BPL和Comm.BPL同名的单元,Requires加入Base.BPL和Comm.bpl

这样不行吗?
----------------------------------------------
-
作者:
男 akai1203 (w-dins) ★☆☆☆☆ -
普通会员
2021/3/9 8:34:26
14楼: 楼上兄弟,我再试试
----------------------------------------------
-把学习当信仰
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行78.125毫秒 RSS