在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
我通常会尽力消除编译器警告,但这些都是“库存”德尔福单位。这些警告是否是我代码中某些内容的间接结果?如果是这样,我该如何找出/在哪里?如果没有,我该怎么办呢?
答案 0 :(得分:11)
我相信这是因为您在构建路径中拥有库存Delphi源代码。如果删除Delphi源目录,那么它应该在没有这些警告的情况下构建。
答案 1 :(得分:5)
它们仅在执行构建时出现的原因是编译命令仅编译自上次编译以来已更改的源。虽然Build命令重新编译项目中的所有内容,无论更改如何。
警告很可能是由项目搜索路径中包含的Delphi源文件夹引起的。删除它并删除项目文件夹中的dcus将告诉您重新编译时项目中的任何内容是否需要Delphi源代码。根据我的经验,如果您在Delphi的实现中发现了一个错误并且制作了Delphi类的自定义副本来纠正错误,那么您应该需要Delphi源代码。如果您尝试在没有Delphi源的情况下进行构建,通常会得到:
单位'%s'使用单位'%s'编译 在'%s'但不同的版本'%s' 发现(F2446)
%s将是一些低级Delphi类。
如果你没有得到任何错误,它并不真正需要Delphi源代码。
如果Delphi源位于环境搜索路径中,也会发生这种情况。
答案 2 :(得分:3)
您提到的前两个警告(以及其他一些警告)是为了让您意识到您当前使用的代码不会在Delphi支持的不同平台上编译。对于Delphi 2007来说,它并不多,但它带有Kylix(Linux版本已经消失)和Delphi for .NET(它也已经消失)的残余。
更新版本的Delphi支持跨平台(Win32 / Win64,OS X,iOS和Android),这些消息在开发Firemonkey应用程序时会再次相关(如果Win32和Win64之间存在差异,则会与VCL应用程序相关)。它们表示代码中的点,您必须在不同操作系统的代码中进行调整。 (例如,您引用的两个用于特定于Windows的对话框;您需要使用基于目标平台的不同对话框,并在特定于平台的区域周围使用{$IFDEF}
语句以防止它们正在为其他平台编译。
由于您的当前代码无法直接移植(即使在现代Delphi版本中),因为它是基于VCL的,因此您可以安全地关闭这些警告。使用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
选项。
答案 3 :(得分:2)
我花了很多时间来解决这些问题(好吧,你的前两个)并且在我的无知中实际上卸载了Delphi并重新安装它无济于事。我终于发现它是由缺乏项目设置引起的。至少在第一时间,如果您从早期的Delphi迁移项目,您的现有项目设置将被转换,但由于没有明显的原因,Delphi可以开始忘记这一点,并为您提供一组“空白”的项目设置。您可以通过打开Project-Options来查看,其中包括Base,Release和Debug。检查活动的(在项目管理器中它是粗体),您应该看到它没有目录路径以及默认值下的所有提示和警告。大多数这些默认设置都很好,但应禁用“平台符号”和“平台单元”(至少对于Win32的东西)。 问候, 布赖恩
答案 4 :(得分:2)
如果要继续将VCL源显式编译到项目中,可以复制提升编译器提示/警告的单元,并“修复”该副本中的提示/警告。 将这些VCL单元的更新/“固定”副本放在另一个文件夹中,并确保在该项目的搜索路径之前将该文件夹的路径添加到Delphi VCL源的路径之前。
E.g。我的项目搜索路径如下所示:“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}等。
答案 5 :(得分:2)
TFileOpenDialog 仅适用于Windows Vista及更高版本。您应该使用 TOpenDialog 而不是TFileOpenDialog,在较新的Delphi版本中,它将检测它正在运行的操作系统并显示正确的对话框。
https://forums.embarcadero.com/thread.jspa?threadID=70498
答案 6 :(得分:1)
如果您仅为特定平台开放项目源开发并添加
{$WARN SYMBOL_PLATFORM OFF}
答案 7 :(得分:0)
可以在“ Delphi Compiler | Delphi |编译器”下的项目选项中单独禁用编译器警告(每种警告类型分别)。提示和警告”