好郁闷啊!关于package,请有经验的大侠救救我吧!(200分)

M

melissa

Unregistered / Unconfirmed
GUEST, unregistred user!
[:(]
说老实话,package打开始做手头的这个项目我就开始利用空余时间想了,
本以为研究对了,可以用了,但是今天把做好的程序真的打包的时候却错了,
救救我吧,我知道该怎么办了!
我先说说我的目的:是使程序更容易分发。
因为这个系统是给30多个国家用的,如果发布以后发现bug,
更新起来远程维护整个程序代价太大,所以需要允许用户下载程序的片断,而不是整个应用程序,
不需要重新编译就可以更新和扩展程序的功能。
程序结构:
Main主菜单-->调用各个模块里的各个程序A,B,C……
我的想法:
我想把A,B,C等分别打包,由main调用.
在整个项目的options选项package页选build with runtime package,
选中对A,B,C……分别打的PA,PB,PC
main的菜单要调用A时,在main的uses中加A,就可以直接调用A了.
A,B,C不包含在整个项目中.
我的问题:
因为A,B,C中要公用main里面一次性取出来的一些public变量,
所以我在A,B,C的uses里加了main(加在Implementation下边或者Interface下边都试过)
而main里是菜单项,这样main里肯定是use了所有和菜单直接相关的程序的,比如一共有20个,
结果我对A打的包PA就提示warning:您显式引用了main;您显式引用了B;您显式引用了C;等等
B的包PB也是这样,显式引用了main,A,C……
这样PA和PB编译完成后,在项目里调用时,编译提示
包A和包B都包含Main, 包A和包B都包含A, 包A和包B都包含B,……
无法通过!
为什么我把A中引用main的uses语句都加在Interface下边了,包A还显示引用了main呢?
难道打的包就不能和其他程序有个接口的地方吗?
其他人是怎么实现的,如果您用过或者知道,请详细一点告诉我,我非常郁闷,因为研究了好久了:(
 
"需要允许用户下载程序的片断,而不是整个应用程序"
而你用包的方式解决,这个大方向就错了。
因为开发包和运行时包是应用程序的支撑点,你的应用程序如果使用了包编译的方式,
则你的包就是应用程序的支撑了,不可能在中途替换的,用包Version1编译的EXE程序,
不能换包Version2来运行。
也就是说,你用了什么包编译并发布应用程序后,你的包就不能再更改了。
 
简单,把需要被PA、PB等引用的变量或函数集中起来,做一个单独的包。
这个包同时被PA、PB和main等引用。:)
 
另外,szf的观点是不对的。所谓包的version不能共用,是因为delphi的版本问题,
也就是vcl包的版本问题。比如你第一次发布用delphi5写的主程序和包,之后更新时
如果用delphi6编译某个包就会有问题,因为borland的vcl包不同版本互不相同。
只要你的delphi的版本没变你可以实现你的目的。
 
同意京工之鸟的意见
 
to京工之鸟
我说的是包Version,并不是VCLVersion,指的是他自己生成的包。
无论是Borland的运行包和自己包,更新包后,用旧包编译的程序都不能运行。
除非你想办法不换包(Package),不过好象你的建议就是做一个不用换的包!
 
to 京工之鸟:
非常感谢您,但是我还有疑问.
举个很具体的例子:main里有我的主菜单,比如我要在MA这个菜单项的click事件
中调用PA里的A程序并把MA这个菜单项置灰,然后在A的close
事件中再把main的MA菜单改成可用状态.
那么这样我就需要main里uses程序A,也需要程序A里uses main
我把变量放在一个公共包中,但是主菜单呢?我的A,B等程序肯定
需要uses 有主菜单的屏幕,只要有主菜单就会uses 所有的屏幕,
这不还是有问题吗?我所打的包里不是还会显式引用了所有的程序吗?
谢谢各位,请多告诉我有关信息,这里我真的不很懂
 
to szf
您好,其实只要我在A程序里不uses main程序,我实现过的,没有
问题.可以只更新包而不换整个程序.这个我已经做到了.但是问题是
我的程序必须uses main,因为需要把菜单项改成可用,而且也会用到main里的
database数据库连接和公共变量.
 
你的设计思路有问题
1,菜单真的这么重要吗?为什么一定要适时的改变菜单的状态呢?你完全可以在公共包
中做一个标记来标识该菜单是否可用,如果不可用就提示好了:)如果这样,实际上你只
要在A的close和open时对该标记修改一下就好了。这样你就不必uses main了。
2,如果你确定要这样做,用application这个变量的mainform也许可以解决问题。有form
了还怕找不到某个控件吗?
3,还有一个办法是在a的close时发一个特定的消息出来,在main中你可以做一个专门响应
该消息的事件来改变菜单的状态。不过这样做有一定的危险。
也许还有别的办法,没有细想,但最根本的是设计的思路。我认为你应该考虑一下你的需求
是否一定要如此。比如你的a可否用模态显示?模态的话你完全可以在main中来控制菜单。
 
to szf:
你的想法仍然不对。
1,任何一个新编译的包只要接口部分没有更改,你完全可以随便替换。不会影响别的模块。
2,如果核心的公共包的接口部分有改动,你当然必须重新编译所有的包。
3,模块与模块之间不需要相互引用,所以任何两个模块包是互不干涉没有牵连的。
4,如果你的模块与模块之间确定要直接相互引用,那说明你的分析有问题。因为这种状况
要不就是你把可以在同一个模块包里实现的功能拆到多个包中了,要不就是你完全可以利
用公共包来实现他们之间的耦合。
 
to 京工之鸟:
当时做这个项目的时候我对包的了解程度是0,所以设计有问题实在是没有办法.
对于菜单,我不能showmodal,因为在调出一个屏幕的同时,用户很可能需要调其
他的屏幕去查什么东西,所以是不可以showmodal的.
另外,你说的第1点,改标志位,应该是可以做到对菜单的控制的,但是现在这个项目
在普通模式(不打包)下已经做完了,要改起来实在有点多.而且还有就是按照你说的做法
database必须也放在公共包里,和屏幕上的query去连接.我们没有把database和query都
放在datamodule上,因为觉得那样做反倒很麻烦.那么公共包上的database连接和各屏幕
联系起来,似乎修改的工作量也很大.
至于用application这个变量的mainform我一会试一下,期待能有奇迹.
看来不管怎么说,我都得改一大批程序了,至少main上的那些public变量……,痛苦,
我的身边没有可以请教的高手,只能靠网上的各位,谢谢您.
 
如果你的database不放在公共包,劝告你不要继续了。
 
啊?别啊~~~~
其实我最初对包做试验的时候,是把database放在公共包里面的,但是后来不知怎么试的,
就发现把连接database的程序uses语句写在interbase下面而不是implemetation下面就
可以让打包的程序独立,可以去引用包以外的程序了,所以后来我就把database从公共里面
拿出来,又放到main里了,所有模块包和main和其他地方的接口也都试图通过在Interbase
下面uses来实现模块间的独立.结果现在我再试的时候,一切又都不对了:(
哎呀,我哭,完了,头要说我了,5555555555
 
没人能帮你了:)
你要划成包来做,只有这种设计思路才能平稳的继续下去,否则做到后面你还会有别的问题。
 
非常谢谢你,京工之鸟
我再好好试试,看需要改多少程序,看还是不是有必要改程序,不如直接和头儿交待了
5555555555555555555555555555555555
 
京工之鸟您好,我现在在做一个小的范例,试图实现Main和PA和PB都调用公共包PS,
但是我有点不知道怎么做.
我已经做成了Main和PA和PB,你能告诉我在哪来引用PS才能实现接口吗,比如这3个地方
都要改一个变量.还有公共包是应该一启动程序自动加载才可以吧,还有卸载包是系统自动
进行还是需要我自己Unloadpackage?谢谢你!
有什么讲关于怎么用包的书吗?我查了很多书,都只有几页而已:(
我在test,摸索中,很困难和郁闷的说.
您和可以直接给我email:shen333@acca.com.cn
:))
 
我也试过了,这样用包的方式就象用DLL一样,确实可以更换的。
不过在《DELPHI 3 从入门到精通》(一本很经典的书)中说的,程序运行时包不支持
应用程序不换,而它自己更换的。可能是BORLAND自己说的吧,不过也不等于不能用。现在
看来,只要是接口不换,还是可以的。
毕竟不是公开支持的功能,还是不用为妙,而且Package调试比DLL调试要难些,何必呢?
 
to szf
非常感谢您
我用一个公共包来实现变量接口 菜单控制 公共函数 database的共享
已经都实现了
而且也可以只更新包不更新主程序
谢谢您为我想办法
 
厉害,能不能把程序架构发一份过来看看?先谢谢。
zqszf@21cn.com
 
我也想要一份,谢谢了!!!!!!
 
顶部