2012-03-24 49 views
10

我想为我自定义的组件做一个包。它基于几个库,包括Graphics32,GraphicEx和CCR.Exif。自定义组件依赖性地狱

我创建了一个项目,写的单元,包括它的注册过程中,增加了一些额外的引用德尔福通知我关于到需要部分(包括dbrtl.dcp,inet.dcp,soaprtl.dcp,vclimg。 dcp,xmlrtl.dcp和dclGraphicEx140.dcp),并向添加了许多单元,其中包含部分,以避免隐含发生的警告。该项目编译并可以在我自己的机器上安装和使用,没有问题。但是,当我想将它安装在另一台机器上时,麻烦就开始了。最后,我必须复制所有我使用的第三方组件的DCU,以及来自GraphicEx的DCP和BPL,我甚至必须安装它。

提供大量的文件是一件令人失望的事情,但可以克服,但不得不安装其他软件包也是不行的。我可以通过在部分包含部分放置更多的单元来摆脱DCP和BPL,但是在我自己的机器上导致出现错误消息,其中实际安装了GraphicEx。这对我来说很让人困惑,因为Graphics32没有这样的事情发生......

无论如何,我该如何保持我的发行版尽量避免这种情况?我希望我的团队中的其他开发人员能够使用该包,而不必担心我用来构建它的内容。首先,不能将所有第三方单元编译到我自己的DCU中吗?

+7

组件安装是Delphi的耻辱,现在Embarcadero不断忽略。 – kludg 2012-03-24 17:53:15

+0

你正在做什么类型的分发,编译应用程序的用户或其他开发人员在IDE中使用它们? – afrazier 2012-03-24 19:06:22

+0

@afrazier包含其他开发人员(团队成员)使用的控件的包。 – 2012-03-24 19:41:04

回答

0

摘要

有没有用Delphi了一段时间,但是,没有发展自己的自定义可视化控件(最后一个版本我的工作是德尔福6)。

处理程序包依赖关系时有两个问题。一种是在Delphi环境中安装,使控件显示在组件面板上,另外还有组件编辑器&属性编辑器。

另一个将编译的软件包分发到客户机器时。

这也取决于你正在运行的Delphi版本。

设计时间

当开发一个定制包,有一个封装选项标签,指示目标文件夹。

手册通常会告诉开发人员将这些文本框留空。有时起作用,有时不起作用。我在每个文本框中写明每个文件夹路径。

.dcp”文件有一个文本框路径,其他“ .dcu”文件夹路径等等。

如果您有可视化控件和诸如属性编辑器或组件编辑器之类的东西,则最好将代码拆分为2个包(“运行时”&“Designtime”)。

我通常把delphi(packages)项目放在delphi安装文件夹之外。

运行时间

通常,快速的方法是把 “* .bpl” “.dcp” 文件在Windows(32)/系统文件夹,或类似的 “DLL” windows文件夹。


包文件夹结构的源代码建议

软件包管理是很困难的。我不知道Embarcadero安装过程已经改变了多少,以及Delphi的更新版本。下面的图表是关于如何组织源代码的一个例子。希望能帮助到你。

[-]--+--c: 
.....| 
.....+--[-]--+--software 
.............| 
.............+--[+]-----java 
.............| 
.............+--[+]-----php 
.............| 
.............+--[-]--+--delphi (not the delphi folder in program files) 
.....................| 
.....................+--[+]-----apps (source code for delphi programs) 
.....................| 
.....................+--[+]-----other 
.....................| 
.....................+--[-]--+--packages (all delphi packages source code here) 
.............................| 
.............................+--[+]-----lib (a single package for non visual controls, libraries) 
.............................| 
.............................+--[+]-----tools (package pair for non visual tcomponent descendants) 
.............................| 
.............................+--[+]-----json (example) 
.............................| 
.............................+--[+]-----xml (example) 
.............................| 
.............................+--[-]--+--mycontrols (folder custom visual controls) 
.............................|.......| 
.............................|.......+--[-]--+--delphi40 (folder for delphi40 version of "mycontrols") 
.............................|.......|.......| 
.............................|.......|.......+----------dsgvclctrls40.dpk (design-time package "mycontrols") 
.............................|.......|.......| 
.............................|.......|.......+----------runvclctrls40.dpk (run-time package "mycontrols") 
.............................|.......|.......| 
.............................|.......|.......+--[+]--+--demos (individual example for each "mycontrol") 
.............................|.......|.......| 
.............................|.......|.......+--[+]--+--design ("*.pas" component editors destination folder) 
.............................|.......|.......| 
.............................|.......|.......+--[+]--+--sources ("*.pas" source code destination folder) 
.............................|.......|.......| 
.............................|.......|.......+--[+]--+--bin ("*.dcu" destination folder) 
.............................|.......|........ 
.............................|.......+--[+]--+--delphi50 (folder for delphi50 version of "mycontrols") 
.............................|.......|........ 
.............................|.......+--[+]--+--delphi60 (folder for delphi60 version of "mycontrols") 
.............................|.......|........ 
.............................|.......+--[+]--+--delphi70 (folder for delphi70 version of "mycontrols") 
.............................|................ 
.............................+--[-]-----etc... 

干杯。

+3

对不起,但我不明白这是如何回答我如何编写和/或分发组件的问题,以便用户(开发人员)不必采取特殊措施(下载/安装依赖项,组织他的项目以特定的方式)使用它。 – 2012-03-25 13:29:14

+0

“设计时间”是您的目标的前一步。 “运行时间”更多地指向分配。 – umlcat 2012-03-25 19:30:48

0

Thijs,你只是不能只用一个包装。目标开发人员几乎需要添加到包中的所有内容。但是有一种替代方式可以做你想做的事情:用你自己的组件中使用的所有组件/库构建一个DLL,并将所有这些外部组件/库包含到你将从DLL中导出的代码中。然后构建组件,而不直接使用外部组件,而是使用您构建的DLL。你不能在你的组件中“使用”其他外部组件/库的任何单元。您必须建立一个包含所有数据类型的新单元,并且需要声明您从DLL中导出的任何内容。所有这些都非常有效,但对于大量外部组件或库很快就会变得非常复杂。

+0

而不是一个DLL,我可以使用BPL,能够使用对象吗?难道不可能将BPL编译成exe文件吗? – 2013-04-28 22:04:18

2

对于编写组件的人来说,你所经历的是一件平常的事情。分配总是这样。软件包不包含其他软件包,他们会引用它们。这是他们的本性。

为了克服这种情况,我总是把我的成分在我会,如果他们卖的产品以同样的方式:我建立一个设置向导发放和登记的一切包装需求。

在我的情况下,InnoSetup工作得很好(http://www.jrsoftware.org/isinfo.php)。

+0

如何检查包是否已安装(因为您不能拥有两次)?有没有一个固定的位置在哪里期待它。 – 2013-11-09 18:00:32

+0

@ThijsvanDien:所有在IDE注册的软件包都列在Windows注册表下的HKEY_CURRENT_USER \ Software \ Embarcadero \ BDS \ 7.0 \ Known Packages中。 BDS版本取决于Delphi版本。如果我没有弄错,7.0意味着Delphi 2010.查看该项下的项目以确定某个包是否已经存在于IDE中。 – AlexSC 2013-11-10 01:47:47

0

我认为AlexSC有最好的答案,但我认为如果你无法肯定有一个没有依赖关系的自定义组件,那么可能会有其他选择。

我尝试为我们的开发人员创建一个内部组件时遇到了Delphi依赖性挫败。我的建议:

  1. 卸载所有依赖的组件使用

  2. 在您的组件包,去掉上面的DCP从需要从你的包款。

  3. 复制你的依赖关系的源文件到您的组件

当您分发的组件,你必须与所需的依赖条件的代码distibute它

你会运行如果你想单独使用依赖,因为Delphi不允许你在已安装的包中有重复的单元名称。

另外,您不想使用DCU的原因在于DCU是针对特定平台和编译器编译的。因此,除非您确定所有devolper都使用相同版本的Delphi在相同的平台上,否则需要重新编译依赖关系代码。

再次,AlexSC有最好的答案,InnoStudio是一个伟大的小工具。