- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我开始的讨论的延续 here 。我想找到模块化 Delphi 源代码的最佳方法,因为我在这个领域没有经验。我将非常感谢您的所有建议。
让我发布我已经写过的内容there .
我工作的公司开发的软件由 100 多个模块组成(其中大部分是不同设备的驱动程序)。它们中的大多数共享相同的代码——大多数情况下是类。问题是这些类(class)并不总是被放入单独的、独立的 PAS 单元中。我的意思是共享代码通常被放入包含特定于模块的代码的单元中。这意味着当您修复共享类中的错误时,仅将其定义的 PAS 单元复制到所有软件模块中并重新编译它们是不够的。不幸的是,您必须将固定的代码片段逐一复制并粘贴到每个模块中,并粘贴到适当的单元和类中。这需要花费大量时间,我希望在不久的将来通过选择正确的方法来消除这种情况 - 请帮助我。
我认为使用与 EXE 一起分发的 BPL 将是一个很好的解决方案,但它有一些缺点,正如前面讨论中提到的一些缺点。最糟糕的问题是,如果每个 EXE 需要多个 BPL,我们的技术支持人员将必须知道哪个 EXE 需要哪个 BPL,然后为最终用户提供正确的文件。只要我们没有软件更新程序,这对我们的技术人员和最终用户来说都是一件好事。他们肯定会迷路并生气:-/。
还可能出现兼容性问题 - 如果一个 BPL 被许多 EXE 共享,则对该 BPL 的修改可能对一个 EXE 有利,但对其他一些 EXE 不利。
那么我应该怎么做才能在这么多项目中更快地修复错误?我想到了以下方法之一。如果您有更好的想法,请告诉我。
就很少修改的代码而言,这个解决方案似乎还不错。但我们也有具有通用功能和程序的 pa 装置,这些装置经常进行修改。每次有人向此文件添加新函数时,不可能执行相同的过程(复制和重新编译这么多项目)。
对我来说,这似乎是现在最好的解决方案,但也有一些缺点。如果我在 BPL 中修复错误,每个程序员都必须更新他们计算机上的 BPL。如果他们忘记这样做怎么办?不过,我认为这是一个小问题。如果我们注意互相通报变化,一切都会好起来的。你觉得怎么样?
请帮我选择一个好的解决方案。我只是不希望公司仅仅因为愚蠢的软件开发方法而在错误修复上损失更多的时间和金钱。到目前为止还没有人关心过它,你可以想象它会引起多少问题。
非常感谢。
最佳答案
你说:
- Create BPLs for all the shared code, but link them into EXEs, so that EXEs are standalone.
您无法将 BPL 链接到可执行文件中。您只需链接 BPL 中的单独单元即可。这样,您实际上就不会使用甚至需要 BPL。
BPL 旨在用作共享代码,即您将共享的代码放入一个或多个 BPL 中,并使用每个 .exe、.dll 或其他 .bpls 中的代码。错误修复(如果它们不更改 BPL 的公共(public)接口(interface))仅需要重新分发该固定的 BPL。
正如我所说,确定 DLL 的公共(public)接口(interface),然后不要更改它。您可以添加例程、类型和类,但不应修改已在使用的任何现有类、类型、接口(interface)、常量、全局变量等的公共(public)接口(interface)。这样,就可以轻松分发 BPL 的固定版本。
但请注意,BPL 高度依赖于编译器版本。如果您使用新版本的编译器,则还必须重新编译 BPL。这就是为什么根据编译器版本给 BPL 后缀(如 100、110 等)是有意义的。然后,使用编译器版本 15.0 编译的可执行文件将被告知使用后缀为 150 的 BPL,而使用版本 14.0 编译的可执行文件将使用后缀 140 的 BPL。这样,不同版本的 BPL 就可以和平共存。后缀可以在项目选项中设置。
你们如何管理不同的版本?创建一个目录,其结构类似于我的 ComponentInstaller BPL(这是您可以在 Delphi/C++Builder/RAD Studio XE IDE 菜单“组件 -> 安装组件”下看到的专家):
Projects
ComponentInstaller
Common
D2007
D2009
D2010
DXE
Common 目录包含每个版本共享的 .pas 文件和资源(位图等),每个 Dxxxx 目录包含该特定版本的 BPL 的 .dpk、.dproj 等。每个包都使用 Common 目录中的文件。当然,这可以同时对多个 BPL 完成。
顺便说一句,版本控制系统可能会让这变得容易得多。请务必为每个版本的 BPL 指定不同的后缀。
如果您确实想要独立的可执行文件,则无需使用 BPL,只需链接到单独的单元即可。选项“使用 BPL 进行编译”对此进行控制。
关于delphi - Delphi 中模块化编程的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7067338/
请在标记为重复之前阅读。 我正在创建一组依赖智能卡进行身份验证的应用程序。到目前为止,每个应用程序都单独控制智能卡读卡器。几周后,我的一些客户将同时使用多个应用程序。因此,我认为创建一个控制身份验证过
我想设置一个小程序,从数据库中检索信息,然后根据请求将该信息分发给另一个程序。例如,一个名为“Master”的程序将从数据库中检索数据并创建一个对象集合(列表、数组等,无论哪种效果最好),然后一个名为
我有两台电脑,都装有 XE2。我以为我在两者上安装了相同的安装,但在其中一个上安装第 3 方软件包时遇到问题,而另一个则正常。 无论如何,我希望两者都一样。最简单的人可能只是通过移入我的 Dropbo
有冲突吗? 最佳答案 所有新版本的 Delphi 始终可以安全地安装到旧版本的下一个版本。 每个新版本都应安装在其自己的目录中。 如果您要安装多个版本,请始终先安装最旧的版本,然后再安装最新版本。 我
快速提问:如果我从代码中删除 // 或 (* *) 中的注释,Delphi 2007 的执行时间会受到影响吗?最终结果是一个可能包含数千行注释的 EXE 文件。 最佳答案 编译器会简单地忽略注释,并且
我必须对照另一个文件检查文件的每一行。 如果第二个文件中存在第一个文件中的一行,则必须删除它。 现在,我正在使用2个列表框,并且“对于listbox1.items.count-1可以开始...” 我的
我正在尝试在访问数据库中添加一些数据。但是我有麻烦,因为这会返回错误: ADOQuery1 missing sql property 实现了对代码的几次修改,到目前为止没有任何效果。 我究竟做错了什么
我用Delphi 5编写了一个程序,在Windows 8 32位PC上可以正常运行。我发现在Windows 7 64位笔记本电脑上运行它最终会导致reallocmem错误,而该错误在32位PC上不会发
看来这是我需要的工具,用于提取XML并与TClientDataset连接。我已经在几篇文章和文档中看到了它,但是我无法在XE2组件列表中找到它-在任何地方!应该在哪里?是否在可能未安装的可选软件包中?
我正在寻找一个非常通用的TDBTree组件,我想听听一些建议。我正在特别寻找一种显示主记录和“ n”个链接表记录的记录。 (我的意思是来自各个表的记录)。例如,TDBTree将钩接到主表,明细表1,附
我需要将按钮制作成旋转三角形的形状(或者说是任何多边形)。谁能提供任何建议? 最佳答案 查看Win32 API CreatePolygonRgn()和SetWindowRgn()函数,以创建一个HRG
你好专家 我的JvPasswordForm1有一个旧的JVC组件。 似乎该组件不再存在:它替换为哪个组件? 重新获得 最佳答案 尝试查找TJvLoginDialog,TjvPassword已合并到其中
几天前,我已经设置了我的开发环境(在装有Win 7的VM和域上的用户的VM上安装了delphi 2009),并安装了我的组件(jedi's,devExpress,ADS等)。 今天,我启动机器,打开d
开始对控件进行子分类的正确位置/时间是什么? 恢复原始窗口proc的正确时间是几点? 现在我在表单创建过程中子类化: procedure TForm1.FormCreate(Sender: TObje
有人可以给我一些有关如何登录访问的网页(使用任何网络浏览器)的指示吗?我应该建立一个全球代理....钩住网络....吗?我需要记录的只是页面地址,而不是其中包含的信息。 我正在使用Delphi。 谢谢
我创建了一个像 TMyClass = class(TObject) private FList1: TObjectList; FList2: TObjectList; public end;
我有一个BPG文件,我已对其进行修改以用作我们公司的自动构建服务器的make文件。为了使其正常工作,我必须进行更改 用途*用途 'unit1.pas'中的unit1 * unit1 'unit2.pa
我将Delphi 7代码迁移到了Delphi XE4。我在Delphi XE4的LoadFromStram方法中遇到错误,但对于Delphi 7来说也可以正常工作。 错误: First chance
我正在尝试学习一些新技巧,以便更好地组织我在 Delphi 中的单元中的一些源代码。 我注意到我访问的一些函数或方法似乎是类中的类,但是我还没有成功地在类中创建一个工作类,虽然它编译得很好,但在执行代
我有一个包含许多类的大单元,现在我想通过将某些类分成新的单元来重构该单元。 我不得不承认我缺乏使用Delphi内置IDE功能的经验。利用内置功能“查找|查找对类型的本地引用”并没有多大帮助,因为类方法
我是一名优秀的程序员,十分优秀!