问题标签 [delphi-units]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
1366 浏览

delphi - delphi中的单位与其他语言中的类相同吗?

我需要编写一些 Delphi 代码,但我之前没有使用 Delphi 的经验。我见过人们编写一些代码,称为unit1orunit2并使用其中的代码导入它。那么,我可以将单元视为 Java 或 C# 中的类吗?

0 投票
4 回答
7512 浏览

delphi - 使用初始化部分进行模块注册是个好主意吗?

我正在为分散的模块注册寻找一个好的解决方案。

我不想要一个使用项目的所有模块单元的单个单元,但我宁愿让模块单元自己注册。

我能想到的唯一解决方案是依赖initializationDelphi 单元。

我写了一个测试项目:

单元2

单元3

单元4

不过,这有一个缺点。是否保证我的注册单元(在这种情况下为Unit2s)initialization部分总是首先运行?

我经常阅读有关initialization部分的警告,我知道我必须避免在其中引发异常。

0 投票
1 回答
84 浏览

delphi - 访问几个实现同名接口的单元

当您的版本发生更改时,我需要从第三方下载两个或更多单元。

我使用 xml 数据绑定来生成单位。它们是:

单位tissV02

在我的应用程序中,我需要选择我必须使用的单位:

从逻辑上讲,它不起作用,因为 IXMLMensagemTISS 对两个单元都是通用的。

是否有一些解决方法可以在我不必更改接口名称(IXMLMensagemTISS)的情况下做到这一点?

我想简化我的代码,将来我需要维护许多这种类型的单元。问题是所有都实现了 IXMLMensagemTISS,而我无法改变它。

我不想创建很多 msg 变量,例如 msgV01:=tissv01.GetmensagemTISS, msgV01:=tissv02.GetmensagemTISS, ... 等等

0 投票
1 回答
224 浏览

delphi - 在编译时检查一个单元是否存在

如果存在,我想使用一个单位。有没有类似{$IF Declared(MyUnit)}单位的东西,或者不同的方式?

我安装了一个组件包的演示版本,并希望有条件地使用其中的单元,并有条件地添加菜单项以测试其功能。所有这些都不会强迫每个人都安装演示包。

0 投票
1 回答
104 浏览

delphi - 是否可以在单独的单元中使用表单属性?

我正在使用 delphi 创建一个游戏,并希望将我的一些代码移动到一个单独的单元,但是此代码使用表单中的属性。这可能吗?

我正在使用 VCL 表单应用程序创建游戏,目前我的所有游戏算法代码都在表单单元中。这没有什么问题,因为我的程序运行良好,只是它看起来很乱,并且有人建议我将算法代码放在一个单独的单元中。我已经尝试将代码移动到一个新单元中,但是无论我尝试什么,都会出现语法错误。

这是我的主要单元中的代码,其中 Grid 是表单中的 TStringGrid ,而 GridSize 是我尝试的第二个单元中的过程:

这是第二个单元代码:

编辑:

这是第二单元的代码:

0 投票
0 回答
107 浏览

delphi - 如何让 IDE 了解使用我的包的项目中使用的单元?

我正在为自定义组件编写一个包。此包允许用户/开发人员在他们的项目中包含大量预先编写的单元,这些单元明确设计用于使用此自定义控件,或者编写自己的单元以与现有的一个执行相同的操作。把它想象成一个“插件”,代码在它自己的单元中实现,它继承了一个特定的对象,并对该公共对象进行自定义实现。

每个“插件”单元initialization在底部都有一个子句,它将这个类注册到一个全局列表中。只要该单元在项目中的任何地方“使用”,它就会注册到全局列表中,该自定义控件利用该列表填充所有可能的“插件”单元的列表。

例如,这个自定义控件有一个属性:

在内部,该索引对应于initialization从其相应单元的部分内注册的“插件”之一。

这些“插件”是通过一个全局对象注册的,该对象在第一次使用时被实例化如下:

困难在于,由于控件是在一个包中实现的(并安装到 IDE 中),但“插件”单元是从另一个项目中“使用”的,所以包不会获取这些单元的存在,因此此自定义控件也无法访问全局列表,因为它处于完全不同的上下文中。

在设计时与表单上的此控件交互时,如果我PluginIndex在设计时设置它,它会失败,因为该控件没有任何“插件”在全局列表中注册自己。但是,在运行时,分配相同的属性就可以了。

我如何以使用此自定义控件(依赖于每个“插件”单元的客户端使用)的应用程序能够实际检测到使用的这些单元的方式执行此操作?


编辑

我正在做的最终目标是允许将这个单个自定义控件简单地拖放到表单上,然后在同一表单中“使用”特定单元,最后在这个单个自定义控件实例上,选择哪个索引在任何给定时间实际使用的那些“插件”。我正在尝试尽可能多地封装和自动化该过程,使开发人员更容易简单地删除这个自定义控件,而不必编写一堆其他代码来使其工作。


编辑

我意识到这可能被解释为这些“插件”单元是包的一部分。事实并非如此。尽管目前我别无选择,只能将这些“插件”单元添加到包中以使设计时正常工作,但我不希望它成为包的一部分,而是由使用此自定义的开发人员决定控制。他们可以添加预制“插件”单元以及定制单元的组合,只需在他们的应用程序中“使用”它们。

0 投票
2 回答
482 浏览

delphi - F2051 单元用不同的版本编译(再次)

警告:长读。这个问题引用了关于 F2051 的其他一些问题)

我们的源代码树中有一个名为 PatchLibs 的文件夹,我们在其中放置了第三方源代码的修改文件。
这是在项目搜索路径中:..\Skin;..\PatchLibs

我将文件 dxBar.pas 从 DevExpress 控件复制到 Patchlibs 中,并在实现部分修改了一些代码。

.dcu现在,在构建时(删除了所有本地文件并进行了“清理”),我得到了臭名昭著的:

它不是指一行代码。我在开始编译时收到消息。

配置:

  • 在新 VM 中安装新的 Delphi 和 DevExpress 版本;复制了程序源代码树。

  • C:\DelphiLibs\DevExpress\VCL\Library\RS27在 32 位库路径中

  • 该文件夹包含所有 DevExpress dcu,特别是cxBarEditItem.dcudxBar.dcu
    $(DXVCL)\Library\RS27\Win64库路径也是如此,但这是一个 Win32 应用程序)

  • 没有其他cxBarEditItem.dcu任何地方出现;dcBar.pas并且cxBarEditItem.pasc:\DelphiLibs\DevExpress\VCL\ExpressBars\Sources\
    (我什至扫描了磁盘中的所有 cx*.* 和 dx*.* 文件)。

  • 该源文件夹也存在于浏览路径 ( $(DXVCL)\ExpressBars\Sources)

  • 这些只是单位(没有相应的.dfm文件)

  • Patchlibs 中还有其他修改过的 DevExpress 文件,我对此没有任何问题;还有一些我有同样的问题(不仅仅是dxBar)。

  • 项目设置为将文件放置在其源.dcu旁边(单元输出目录为空白).pas

  • 没有 DevExpress 文件是项目的一部分

  • 项目中的其他源文件已更改

如果我将副本拉cxBarEditItem.pas入 Patchlibs,则错误只会传播到另一个单元(重复地)。

尽管已经阅读了很多答案(值得注意的 SO 问题:为什么我的单位是“用不同版本编译的”我自己的文件?我只是不明白为什么会发生错误以及这次如何修复它
cxBarEditItem.pashasdxBar在它的 interface Uses 部分,并且cxBarEditItem在我的 Uses 子句中,但是为什么要重新编译呢?

我当然可以开始将 DevExpress 源代码目录添加到搜索路径中,但是其中有很多,这也会导致.dcu其中的文件。
我不想这样做,因为它掩盖了实际问题,而这在以前的 Delphi/DevExpress 设置中不是必需的

早期 Delphi 10.3 中的 32 位库路径:

Delphi 10.4 中的 32 位库路径:

向上或向下移动最后一个或将其更改为$(DXVCL)\Library\RS27没有帮助

这 5 条 Embarcadero 线看起来很奇怪(请参阅这个 SO question,我用旧的对应物替换了它们(并向 Embarcadero 报告);问题没有变化。


额外的研究/失败的尝试

Ian Boyd 在 2014
F2051 中遇到了一个非常相似的问题: Unit %s was compiled with a different version of %s
建议有 RTTI 设置或编译器选项。
根据大卫在那里的回答,我决定试一试。我的情况略有不同:我必须尝试找出在构建 DevEx 代码时使用了哪些编译器设置,并将它们插入到我修改后的dxBar.pas.

我注意到DevExpress 安装的子文件夹中有两个.dproj文件:和(需要顺便说一句) 通过将测试项目中的所有编译器选项设置为非默认值,并将其与我能够理解的所有默认值(大部分)进行比较UI 选项设置和内容之间的关系。 然后,我将它们的设置与我们项目中的设置进行了比较,发现了以下差异(删除了不相关的行):PackagescxLibraryRS27.dprojdxBarRS27.dprojcxLibraryRS27
.dproj.dproj
cxLibraryRS27.dproj

他们有这个额外的:

我们有这个额外的:

他们没有这个 PropertyGroup

通过这些,我认为这些是它们不同的设置,可能会影响生成的.dcu文件:

  • 范围检查 {$R-}

  • 溢出检查 {$Q-}

  • 本地调试符号关闭 {$D-}

  • 关闭 {$C-} 的运行时断言

  • 符号参考信息关闭 {$L-}

  • 关闭 {$J-} 的可写常量

  • exe 中的调试信息关闭 {$Y-}

所以我把它放在顶部dxBar.pas

{$C-,D-,J-,L-,Q-,R-,Y-}

不,没有成功...

0 投票
0 回答
18 浏览

ide - 如何控制显示在中央窗格中的单位数量?

最近迁移到 Delphi 10.4,我在 IDE 的中央窗格中显示了太多单元。(XE 没有发生这种情况。)

中央窗格的顶栏

我的主要项目组中有多达 15 个程序。

组内节目列表

我可以从中央窗格的视图中手动删除每个单元,但如果我关闭项目组,它们都会再次出现!

有没有我可以使用的设置,所以一个大型项目组只打开,最初显示所选项目的 1 个主窗体(就像我在 Delphi XE 中所做的那样)?

(多个项目的原因是它们共享许多共同的功能并形成一个工具箱套件。)

感谢您的建议。