8

在 Delphi 2007 中,在一个包含自定义组件的项目上工作,当我进行完整构建时(但不是在我进行直接编译时),我收到这组警告作为消息中的前四个:

[DCC Warning] Dialogs.pas(1426): W1002 Symbol 'TFileOpenDialog' is specific to a platform
[DCC Warning] Dialogs.pas(1446): W1002 Symbol 'TFileSaveDialog' is specific to a platform
[DCC Warning] ComCtrls.pas(6757): W1036 Variable 'Section' might not have been initialized
[DCC Warning] ComCtrls.pas(19268): W1023 Comparing signed and unsigned types - widened both operands

我通常会尽量消除编译器警告,但这些是“库存”Delphi 单元。这些警告是我代码中某些内容的间接结果吗?如果是这样,我如何弄清楚什么/在哪里?如果没有,我应该怎么处理它们?

4

8 回答 8

12

我相信这是因为您的构建路径中有库存的 Delphi 源代码。如果您删除 Delphi 源目录,那么它应该在没有这些警告的情况下构建。

于 2009-05-15T21:08:07.470 回答
6

它们仅在执行构建时出现的原因是编译命令仅编译自上次编译以来已更改的源。而 Build 命令会重新编译项目中的所有内容,而不管更改如何。

警告很可能是由项目搜索路径中包含的 Delphi 源文件夹引起的。删除它并删除项目文件夹中的 dcus 将告诉您在重新编译时项目中的任何内容是否需要 Delphi 源代码。根据我的经验,如果您在 Delphi 的实现中发现了一个错误并制作了一个 Delphi 类的自定义副本来纠正错误,那么您应该需要 Delphi 源代码。如果是这种情况,当您尝试在没有 Delphi 源的情况下进行构建时,您通常会得到:

单元 '%s' 使用 '%s' 中的单元 '%s' 编译,但发现不同的版本 '%s' (F2446)

其中 %s 将是一些低级别的 Delphi 类。

如果你没有得到任何错误,它并不真的需要 Delphi 源代码。

如果 Delphi 源位于环境搜索路径中,也会发生这种情况。

于 2009-05-16T02:25:37.347 回答
3

您提到的前两个警告(以及其他几个警告)是为了让您意识到您当前使用的代码不会在 Delphi 支持的不同平台上编译。对于 Delphi 2007,没有多少,但它带有 Kylix(已消失的 Linux 版本)和 Delphi for .NET(也已消失)的残余。

最新版本的 Delphi 支持跨平台(Win32/Win64、OS X、iOS 和 Android),这些消息在开发 Firemonkey 应用程序(或 VCL 应用程序,如果 Win32 和 Win64 之间存在差异)时再次相关。它们指示代码中的点,您必须针对不同的操作系统对代码进行调整。(例如,您引用的两个是针对特定于 Windows 的对话框;您需要使用基于目标平台的不同对话框,并{$IFDEF}在特定于平台的区域周围使用语句,以防止它们被编译用于其他平台。

由于您当前的代码不能直接移植(即使在现代 Delphi 版本中),因为它是基于 VCL 的,所以不能直接移植到 Windows 以外的任何地方,您可以安全地关闭这些警告。使用Project->Options->Compiler Messages,并取消选中以下消息(或使用我在您的代码中包含的编译器定义):

Library Symbol                       {$WARN SYMBOL_LIBRARY OFF}
Platform Symbol                      {$WARN SYMBOL_PLATFORM OFF}
Library Unit                         {$WARN UNIT_LIBRARY OFF}
Platform Unit                        {$WARN UNIT_PLATFORM OFF}
Unsafe type  (.NET remnant)          {$WARN UNSAFETYPE OFF}
Unsafe code  (.NET remnant)          {$WARN UNSAFECODE OFF}
Unsafe typecast (.NET remnant)       {$WARN UNSAFECAST OFF}

你提到的最后两个我无法用 D2007(IDE 版本 11.0.2804.9245)重现,所以我怀疑 skamradt 的答案是正确的 - 这是因为你的搜索路径中有 VCL 源目录,你应该'吨。它应该设置为$(BDS)\Lib。如果您需要能够逐步浏览源代码,请使用该Project->Options->Compiler页面,然后选中Use debug DCUs下面的选项Debugging

于 2013-11-06T15:54:34.160 回答
2

如果您想继续将 VCL 源显式编译到您的项目中,您可以复制引发编译器提示/警告的单元并“修复”该副本中的提示/警告。将这些 VCL 单元的更新/“固定”副本放在另一个文件夹中,并确保在 Delphi VCL 源路径之前将该文件夹的路径添加到项目的搜索路径中。

例如,我的项目搜索路径如下所示:“C:\Dev\Source\MyFixedVCLUnits;C:\Program Files\CodeGear\RAD Studio\6.0\source”

举一个删除这些警告所需的简单修复示例,下面是 Dialogs.pas 中的一个函数,它现在位于我的“C:\Dev\Source\MyFixedVCLUnits”文件夹中:

{$WARNINGS OFF}
function TFileOpenDialogWrapper.CreateFileDialog: TCustomFileDialog;
begin
Result := TFileOpenDialog.Create(nil);
Result.OnExecute := OnExecuteEvent;
end;
{$WARNINGS ON}

在这种情况下,只需根据需要添加 {$WARNINGS OFF} 等。

于 2009-05-17T21:29:09.893 回答
2

我花了很长时间解决这些问题(好吧,无论如何,你的前两个)并且在我的无知中实际上卸载了Delphi并重新安装它无济于事。最后发现是项目设置不足造成的。至少一开始,如果您从早期的 Delphi 迁移项目,您现有的项目设置会被转换,但没有明显的原因,Delphi 会开始忘记这一点,并为您提供一组“空白”项目设置。您可以通过打开 Project-Options 来查看这一点,您可以在其中找到 Base、Release 和 Debug。查看活动的(在项目管理器中为粗体),您应该会看到它没有目录路径以及默认情况下的所有提示和警告。这些默认值中的大多数都很好,但应该禁用“平台符号”和“平台单元”(至少对于 Win32 的东西)。问候,布赖恩

于 2009-05-15T21:22:34.970 回答
2

TFileOpenDialog仅适用于 Windows Vista 及更高版本。您应该使用TOpenDialog而不是 TFileOpenDialog,在较新的 Delphi 版本中,它将检测它正在运行的操作系统并显示正确的对话框。
https://forums.embarcadero.com/thread.jspa?threadID=70498

于 2013-11-06T15:16:28.923 回答
1

如果只为特定平台开发开源项目源码并添加

{$WARN SYMBOL_PLATFORM OFF}
于 2011-01-11T11:57:13.337 回答
0

编译器警告可以在“Delphi Compiler | 提示和警告'

于 2019-02-11T15:18:37.943 回答