当前位置:主页>delphi技巧/代码下载> 文章内容

Bpl问题,GetClass一直为Nil?

发布时间:2010-01-21 | QQ免费站
1楼: 我做小demo的时候可以,真正用起来的时候不行了。 有这么几个Bpl, 1、function 2、baseform 这两个是静态调用,就是直接在build with runtime packages里面写上 3、submodule//业务模块,requires 1和2 主工程是个dpr文件,build with runtime packages 1 和 2 动态调用3,现在就是getClass的时候老是为nil,loadpackage的时候不为0,在3里面要调用的窗体我也有registerclass 在demo里面可以,在真正用的时候就不行? 3里面调出的窗体是继承自2的baseform

字串4

2楼: 我有点资料: 在隐式链接方式中,所有被应用程序的dll文件都会在应用程序exe文件加载时被加载到内存中;但如果采用显式链接方式,程序员可以决定dll文件何时加载或不加载。例如可以将一个带有字符串资源的dll模块以英语加载,而另一个以西班牙语加载,应用程序在用户选择了合适的语种后再加载与之对应的dll文件。 因此,显示链接具有更大的灵活性, 缺点是调用时比隐式链接需要编写更多的代码。 隐式链接(静态) 显示链接(动态)

字串1

3楼: 感觉静态调用应该是比较不好的 但我用静态调用可以省很多事,然后在编译后程序也可以少几K 难道仅仅是内存占用的问题? 但事实上如果我们在程序里面load的时候要什么时候unload呢? 比如我有个菜单,可能用户经常要进去退出,如果在退出的时候(MDI的)我就直接unload,那不是经常要load、unload? 这不是很占时间了? 还有个问题是对MDI窗体来说,我什么时候才知道他被关闭?注意,这个MDI窗体是在包里面的,是不是在Finalization的时候? 好多问题,有点晕了 字串1

4楼: 萝卜青菜,看情况了,总不能形而上学吧

字串2

5楼: to hys_peter, 这只是一个比较特殊的例子, 灵活性有没有表现在其他方面?

字串5

6楼: 比如说金山词爹吧 有人只用来查词,那我的屏幕取词就没有必要加载了, 但是如果一个程序这些链接库我都经常用,那就加载进来好了,还少写代码呢[^] 字串3

7楼: 动态调用,启动的时候不用调入太多东西, 启动速度快 组装测试也比较方便, 没有全部的bpl 程序也能启动和正常运行 字串6

8楼: to hys_peter, 能不能讲一下什么时候释放比较好? 如果要提前释放的话要在哪里释放? tks

字串1

9楼: to lich, 有道理。 先吃饭去,等下在来讨论

字串6

10楼: delphi就一个原则,听前辈说的,谁调用谁释放,那个类调用,哪个类灭的时候释放,那个单元,那个单元挂的时候释放,个别时候除外(例如你要放了他,重新加载呢), 字串3

11楼: 想釋放的時候就釋放多號啊 字串2

12楼: 我現在有個比較實際的問題是這樣的: 主程序有五個主菜單,每個主菜單下面分別有五到十個不等的子菜單 我現在是把五個主菜單分別封裝成五個bpl, 現在要解決的是要什麼時候加載和釋放這幾個bpl比較合理? 請大家給個比較好的解決方案
字串2

13楼: 大家随便谈谈啊 字串1

14楼: 理论上讲动态调用方式下会比较节省资源,因为相应的包只在需要的时候才 载入内存,但需要牺牲速度为代价。 但在实际使用中,项目窗体可能很多,包也可能有很多,频繁的载入包可能 会使开发者陷入一个比较混乱的状态,可能有的包载入了而没有释放掉,而且包 在什么时候释放也需要很好的控制,这样就不能达到节省资源的目的,相反却增 加了编程的复杂性和牺牲了速度。 另外,动态调用还有一个很明显的缺点是:调用时无法直接知道所取得的某 个类是否有某个方法或属性。
字串2

15楼: 帮忙顶
字串2

16楼: //主程序有五個主菜單,每個主菜單下面分別有五到十個不等的子菜單 //我現在是把五個主菜單分別封裝成五個bpl, //現在要解決的是要什麼時候加載和釋放這幾個bpl比較合理? 主菜单可以在MainFormCreate的时候就从数据库表中创建出来,这样速度是很快的, 在最具体的子菜单Click的时候,判断是否已经载入需要的包,如果没有则载入, 并调用相应的方法。 什么时候释放呢?在MainFormClose的时候再释放吧,不然不好做到同时打开多个 MDI窗体啊。
字串4

17楼: 目前也是考虑这种方法, 有没有更好的方案呢? 如果全部用静态的,除了上面说的bpl不全的时候会出现程序不能进入(但bpl不全是不大可能的),还有什么其他缺点呢?对一个普通的数据库软件来说 字串1

18楼: 在主工程的build with runtime packages是不是一定要build VCL这个包(我是用Delphi7的),我在公共的Bpl中有用到VCL控件。 还有,我有一些公用的Bpl,就是要静态莲接的Bpl是不是都要放在这里? 现在碰到一个问题就是在动态调用的时候老是提示没有找到类,包是有加载进来而且也不为0就是GetClass的时候老是为NIL,晕了 字串5

19楼: 主工程里面有build with runtime packages bpl里面有registerclass 怎么会这样啊,吐血了

字串6

20楼: 我做小demo的时候可以,真正用起来的时候不行了。 有这么几个Bpl, 1、function 2、baseform 这两个是静态调用,就是直接在build with runtime packages里面写上 3、submodule//业务模块,requires 1和2 主工程是个dpr文件,build with runtime packages 1 和 2 动态调用3,现在就是getClass的时候老是为nil,loadpackage的时候不为0,在3里面要调用的窗体我也有registerclass 在demo里面可以,在真正用的时候就不行? 3里面调出的窗体是继承自2的baseform 字串1

21楼: 各位高手指点一二

字串3

22楼: 我也碰到类似问题,请高手慷慨相助。 字串3

23楼: 是我描述得不清楚还是什么? 分数俺可以在加啊

字串2

24楼: 如果还没有人讨论的话 晚上结贴 另开一个 字串6

25楼: 忘了说下,我是用delphi7的 字串2

26楼: regClass/GetClass这个功能其实是把类型注册到一个全局的List当中。具体的代码你可以自己查。 因此在Build with runtime library的时候,必须把对应的bpl设置为动态。就是regClass/GetClass函数所在单元所在的包,猜测应该是rtl70.bpl。 你可以把所有的包全部设成build with runtime

字串3

27楼: 查得到跟踪不到啊?
字串2

28楼: 看你调的这么辛苦,把demo发给我,我帮你改好了 delnew@tom.com

字串4

29楼: to 楼上的 我整理一下 整个工程太大了

字串1

30楼: 我关注 [8D] 我关注 [8D]
字串6

31楼: to delnew 用了很多第三方的,会不会是第三方的问题? 太大了,加上第三方就更发不了了

字串2

32楼: 结贴了 字串9