2

这与另一个 Delphi 版本的问题有关,但仍然不同;

我正在寻找一种方法来检测正在编译我的代码的 Delphi 编译器的服务包(或内部版本号)。jedi.inc很好,但它没有告诉我确切的版本。(我也不能使用其中的 SUPPORTS_* 定义,因为它们也与版本相关)

我需要这个,因为旧版本中存在一些错误(在这种情况下,它是Delphi 2009 中的 _ValLong 错误),这些错误已在以后的服务包(在这种情况下为 Delphi 2009 服务包 3)中修复。

目前我的代码中有各种检查,如下所示:

{$IFDEF BUG_QC_68123}

但我不能只在我的主要包含文件中这样说:

{$IFDEF DELPHI2009_UP}
  {$DEFINE BUG_QC_68123}
{$ENDIF}

...因为这会错过 D2009SP3 及更高版本不再存在此错误的事实。

有任何想法吗?

PS:这可能也适用于较旧(和较新)版本的 Delphi,所以我想任何库和/或组件供应商也会对此感兴趣。

4

4 回答 4

5

每个版本都定义了符号:

VER80 - Delphi 1
VER90 - Delphi 2
VER100 - Delphi 3
VER120 - Delphi 4
VER130 - Delphi 5
VER140 - Delphi 6
VER150 - Delphi 7
VER160 - Delphi 8
VER170 - Delphi 2005
VER180 - Delphi 2006
VER180 - Delphi 2007
VER185 - Delphi 2007 (Note: symbol VER185, for example, is used to indicate Delphi 2007 compiler or an earlier version.)
VER190 - Delphi 2007 for .NET
VER200 - C++ Builder 2009
VER210 - Delphi 2010
VER220 - Delphi XE
VER230 - Delphi XE2
VER240 - Delphi XE3
VER250 - Delphi XE4
VER260 - Delphi XE5
VER270 - Delphi XE6
VER280 - Delphi XE7
WIN32 - Indicates that the operating environment is the Win32 API.
LINUX - Indicates that the operating environment is Linux
MSWINDOWS - Indicates that the operating environment is the MS Windows/li] 
CONSOLE - Indicates that an application is being compiled as a console application

来源 另一个来源 您无法检查不同的内部版本号。

对于好奇的,VER10-VER70 是涡轮帕斯卡版本,而 VER110 是 C++ 构建器版本。

于 2009-07-09T13:26:51.723 回答
3

不幸的是,像 System.pas 中的 RTLVersion 这样的常量不会在更新中更新,但我认为如果有人想为它创建一个 QC 条目,这将是一个很好的建议。

如果您正在测试的错误可以在代码中重现,您总是可以在启动时对其进行测试并设置您自己的全局标志。

我通过确保我们始终应用最新更新来解决这些差异。我还没有遇到过更新不稳定并迫使我回滚的情况。至少德尔福没有。

于 2009-07-09T13:24:17.560 回答
1

编译器不会公开该信息。它只告诉您主要版本,在应用更新时不会更改。

我认为您能做的最好的事情就是始终为最新更新编写代码。假设您的代码的使用者也将获得最新的更新。如果他们不这样做,那是他们自己的错,而不是需要担心的问题。在您的系统要求中提及它。当然,您的代码对他们不起作用,但其他人也不会,因为他们仍在使用已知的错误代码。

下一个最好的替代方法是假设没有应用更新。也就是说,编写您的代码,就好像所有已知的错误仍然存​​在一样。不利的一面是您的代码可能无法像其他方式那样运行,因此每个通过升级做了正确事情的人都会因继续使用您的次优代码而受到惩罚。

于 2009-07-09T13:45:30.437 回答
1

您可以尝试在您的软件中包含编译器文件版本。例如,DCC32.exe 上有一个文件版本,您可以通过编程方式获取该文件版本,然后将其作为 const 写入一个单元。这可以作为构建过程的一部分来完成,因此它会在构建应用程序之前获取版本信息(使用FinalBuilder之类的东西很容易做到)。

我已经为其他事情做了这个,以便在我们的关于屏幕上我们可以获得各种有用的信息。此外,当我们的应用程序出现错误时,我们可以将此信息捆绑到我们的 EurekaLog 错误报告中。

但是我不知道 DCC32.exe 上的文件版本是否随着每次 Delphi 更新而更新。

于 2009-07-09T13:56:25.603 回答